Няшная / Говнокод #19843 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
#include <stdio.h>

#define isdigit(c) (c > 47 && c < 58)

int main()
{
	int curChar = 0, prevChar = 0, i = 0;
	for(; i < 12; i++)
	{
		if(prevChar != 0 && isdigit(prevChar) == isdigit(curChar))
			i = 13;
		prevChar = curChar;
		if((curChar = getchar()) == 10)
			break;
	}
	printf("%s!\n", i%2 == 0 ? "Error" : "Ok");
	return 0;
}

Задание:
В заданный непустой текст входят только цифры и буквы. Длина текста не более 12 символов.
Определить, удовлетворяется ли следующее свойство:

Текст состоит из чередования букв и цифр, причем если текст начинается с буквы, то он должен и заканчиваться буквой, если с цифры – цифрой (например: p5g6e4d);

Препод будет доволен :D.

Запостил: Koncord Koncord, (Updated )

Комментарии (130) RSS

  • Ну тут много где ещё можно сэкономить на байтах.
    Ответить
        • getchar(), если я правильно помню, то такой ф-ии нет в Windows
          Ответить
          • щито?????
            это stdio.h ващето
            стандартная, типа, библиотека
            Ответить
          • В 32- и 64-битных Windows getchar есть даже в crtdll.dll, т. е. её даже не обязательно реализовывать в библиотеке языка.

            Хотя в Windows 3.x такой функции нет. В третьих форточках, правда, и консоли нет, так что придётся искать стороннюю реализацию консоли. Вот беда...
            Ответить
              • о чем? о кокококококоноселчки в win16?

                Блин, да в те времена 98% программ были досовыми и работали с command.com
                Ответить
              • Не было в TP7 консоли для Win16. Было три варианта:
                1. Досовская программа для реального режима процессора.
                2. Досовская программа для 16-битного защищённого режима (Борланд поставлял RTM+DPMI16 — транслятор функций своего API в досовские функции).
                3. Виндовая программа для оконного режима Win16.

                Первые два варианта выполнялись либо в ДОСе, либо в виртуальной машине ДОСа, которая была встроена во все версии Windows. Никакой ко-ко-консоли для Win16 у Борланда не было.

                *****

                Борландовский Турбо Дебаггер умел подменять видеодрайвер своим и создавать два «рабочих стола»: на одном сам Турбо Дебаггер, нарисованный в текстовом режиме с помощью Turbo Vision, на другом — все приложения Windows. Но назвать это полноценной консолью язык не повернётся, потому что Турбо Дебаггер предоставлял эту среду только для себя самого.

                *****

                «Консоль» для Win16 была в проекте RSX (скачать можно отсюда:
                ftp://ftp.delorie.com/pub/djgpp/current.old/v2tk/rsxdj151.zip
                ). «Консольку» с помощью средств GDI рисовала программа rshellwx.exe, но запускать в ней можно было только программы, специально собранные компиляторами EMXGCC и DJGPP. Ага, собрать программу для 32-битного защищённого режима ДОС, а потом с помощью пакета RSX запустить в Win16.

                До винконсоли эта среда тоже не дотягивала, потому что из программы можно было пользоваться только функциями, предоставляемыми DPMI, а не WinAPI.
                Ответить
                • >> Досовская программа для 16-битного защищённого режима
                  был такой, да?
                  вот прямо с кольцами защиты, и при этом 16 бит?

                  >>либо в виртуальной машине ДОСа
                  Virtual 8086 mode был только для protected mode же
                  Ответить
                    • да

                      но так ведь это никто не использовал
                      там и виртуальной памяти-то не было
                      Ответить
                          • ... готовит Микрософта дух
                            И Интел — сын ошибок трудных,
                            И Борланд — Парадоксов друг.
                            Да, я пытаюсь вернуть 97-й.
                            Ответить
                            • я сам люблю обмазаться 97м, но обычно я делаю это в чистом 16ти битном, реальном режиме в досбоксе и борлнад сях
                              Ответить
                              • Обмазываться Досбоксом — это всё равно, что в сапогах нырять.
                                Ответить
                                • а чем мне обмазываться?
                                  виртуалкой с dos 6.22?)

                                  есть мнение что современные виртуалки не полностью реализиуют все спецификации IBM PC, и может что-то не заработать. Ну там наверняка они криво эмулируют контроллер клавиатуры i8042 или там прерывание BIOS не умеет сказать сколько дисководов в системе
                                  Ответить
                  • В защищённом режиме на 32-битных машинах можно было использовать два типа сегментов: 32-битные и 16-битные. Можно даже было в одной программе использовать оба типа. Флажок был у каждого сегмента, указывающий тип адресации и размер аргумента по умолчанию.

                    Было два типа DPMI: 16-битный (например, встроенный в Win16 и борландовский RTM) и 32-битный (а их было целое море, например, DOS4GW).

                    > Virtual 8086 mode был только для protected mode же

                    Досовскую программу, рассчитанную на реальный режим, можно было запускать как в реальном режиме, так и в Virtual 8086 из-под защищённого. Редкую программу нельзя было запустить из виртуального режима (к таким исключениям относилось либо совсем старьё, написанное во времена 8086/8088, либо откровенный говнокод).
                    Ответить
                    • так они реально использовали сегменты на 32 битах?

                      просто ни однасовременная ось (ни linux, ни фря ни Winnt) сегменты-то не использует вроде

                      а на x64 их и вовсе выпилилли
                      Ответить
                      • > вроде
                        Все используют. Куда от них денешься. Просто они настроены под flat режим и ты их не замечаешь. Даже на x64 от них рудименты остались...
                        Ответить
                        • это и есть "не используют". Используют только страницы, а сегменты просто лишний, ненужный шаг на (и без того сложном) пути через MMU к контроллеру памяти.
                          Именно потому и выпилили)
                          Ответить
                      • На 32 битах для программ обычно использовалась модель flat без сегментов. Однако, Watcom C/C++, если его очень попросить, мог создать и сегментированную программу. Вот только какая среда её может выполнить, я не в курсе. DOS4G/4GPRO (не DOS4GW) поддерживал адресацию с ненулевой базой, а насчёт сегментов не уверен.

                        В те нелёгкие времена приходилось создавать сегменты для 16-битных программ, а в Windows 95/98 (и в OS/2) ещё и некоторые драйвера были 16-битными.

                        В Win32 регистр FS указывает на сегмент с базой, отличной от других сегментных регистров. Т. е. даже в чистой 32-битной среде Винда создавала специальный сегмент:
                        https://en.wikipedia.org/wiki/Win32_Thread_Information_Block
                        Ответить
                • Может я что-то и путаю, но именно в режиме win16 было белое окно, иммитирующее консоль.
                  Ответить
                  • Не было. В API Win16 вообще не было консольных функций. А в Win32s при запуске консольных приложений никакого окна не открывалось, все консольные функции «выводили в NUL». Т. е. в Win32s можно было запускать пакетные консольные конверторы для файлов, но их вывод на экран не был виден (как у служб в Win NT).

                    Тем не менее, консоль в Win16 была (и даже могла переключаться между чёрным окошком и полным экраном), но доступна она была только для досовских программ. Для приложений Windows у неё не было «публичного интерфейса».
                    Ответить
                    • P.S. Кстати, обратите внимание, что у Windows 3.x, не имеющих полноценной текстовой консоли, не было особого успеха. Многие предпочитали пользоваться ДОСом либо ждать возможности перехода на Windows 95 или NT.

                      А вот у Windows 95 и NT, имеющих полноценную текстовую консоль, успех был. Неужели текстовая консоль оказалась важнее гуя?
                      Ответить
                        • А в Чикаге уже была полноценная консоль для Win32-приложений. Даже из коробки несколько утилит (типа http://ftp.exe) для неё было.
                          Ответить
  • Астрологи объявили неделю лаб. Количество сраных говнокодов удвоилось.
    Ответить
    • скоро начнутся летние каникулы, авторы говнокодиков уедут в Артек, и тут станет так скучно
      Ответить
  • // Дан текст длиной ровно 12 символов
    // Проверить, что в нем чередуются буквы и цифры, и 
    // если начинается с буквы, то должен кончаться буквой, если с цифры - цифрой
    bool check(char *s)
    {
      return false;
    }
    Ответить
  • Просто от скуки:
    alnums --> [X, _], { code_type(X, alnum) } | [X], alnums, { code_type(X, alnum) }.
    last_letter  --> alnums, [X], { code_type(X, alpha) }.
    first_letter --> [X], last_letter, { code_type(X, alpha) }.
    last_digit   --> alnums, [X], { code_type(X, digit) }.
    first_digit  --> [X], last_digit, { code_type(X, digit) }.
    
    laba(S) :- phrase(first_digit, S) ; phrase(first_letter, S).
    Ответить
    • Или, еще вариант:
      laba([X, Y]) :- code_type(X, Z), code_type(Y, Z), (Z = alpha ; Z = digit).
      laba([X, Y | Z]) :- code_type(Y, alnum), laba([X | Z]).
      Ответить
  • laba =: (=&0@(2&|)@#*.*./)@(=&1)@(2&(+/\)@(>&58)@(a.&i.)) 
        laba '1n2jjk4l5'
    0
        laba '1n2j3k4l5'
    1
        laba '1n23324l5'
    0


    Не благодари
    Ответить
    • ([a-zA-Z][a-zA-Z0-9]{0,10}[a-zA-Z]|[0-9][a-zA-Z0-9]{0,10}[0-9])

      Не благодари
      Ответить
    • а если прогнать твой код через архиватор, он сожмется?
      Ответить
    • laba = (s,L,o=2-(s[0]<10),c=o)=>(L=(i)=>s[i]?(c+=(s[i]<10)*2-1,c%=3)&&L(i+1):i&&c)(0)+o==3;

      Описание и процесс говнизации - напитоне http://pastebin.com/jjTrRQq7
      * Всё, что не цифра - то буква
      Ответить
      • laba =: (+./@E.&(12$0 1)*.{.={:)@:>&58@(a.&i.) 
            laba '1n2jjk4l5'
        0
            laba '1n2j3k4l5'
        1
            laba '1n23324l5'
        0


        J - это... 
                          ... писать одно и тоже, но меньшим количеством символов
        Ответить
        • J - это... 
                            ... превращать все программы в регулярные выражения
          Ответить
          • Регулярки проверяют данные на соответствие, а J вертит массивы на хую
            Ответить
            • Если выглядят одинаково, зачем платить больше за изучение обоих
              Ответить
        • laba=: -.@(+./)@(2&(=/\)@:>&58@(a.&i.))
             
                laba '1n2jjk4l5'
          0
             
                laba '1n2j3k4l5'
          1
             
                laba '1n23324l5'
          0
          Ответить
  • main(int i, int p, int c)
    {
        for (p = i = 0; (c = getchar()) != 10 && i < 12; i++, p = c)
                i = !!p && (p < 58) != (c > 57) ? 13 : i;
        puts(!(i % 2) ? "Error!" : "Ok!");
    }

    ласт вариант 😀
    Ответить
    • по-моему, так более упорото выглядит:
      main(int i, int p, int c)
      {
          for (p = i = 0; (c = getchar()) - 10 && i < 12; i++, p = c)
                  i =! p || p < 58 == c > 57 ? i : 13;
          puts(i % 2 * 7 + "Error!\0Ok!");
      }
      Ответить
        • Годно. Намоминает рекламу банка Москвы (тот же эффект использовали):
          puts("Мне нравится" -~i % 2));
          Ответить
      • И тут я понял что я даже не могу упоротый код писать, не то что мультиплеер для OpenMW =(
        Ответить
        • Можно попробовать с горя писать нормальный код.
          Глядишь, и уважение будет, и зарплата хорошая, и жизнь наладится...
          Ответить
    • Вариант с рекурсией
      int p, i, c;
      main()
      {
          if((c = getchar()) == 10 || ++i > 11)
              return puts(!(i % 2) ? "Error!" : "Ok!");
          if (p != 0 && (p < 58) != (c > 57))
              i = 13;
          p = c, main();
      }
      Ответить
    • > (p < 58) != (c > 57)
      Вот это отличная находка. Когда читаешь, просто хренеешь. Думаешь "ну, когда же оно на краях глюканёт?"
      Ответить
    • Мне больше всего понравилась строка:
      main(int i, int p, int c)

      Экономия на спичках в духе олимпиадных задач.
      Ответить
  • Страдать херней так страдать херней

    static bool DoSmth(string str)
            {
                var l = str.Length;
                bool a = true, n, p = str[0] > '9'; ;
                for (var i = 1; i < l; n = str[i++] > '9', a &= p ^ n, p = n);
                return (l%2)==1 && a;
            }
    Ответить
    • > bool a = true
      > str[0]
      > (l%2)==1
      Говорили же бородатые дяди "Выбирай язык под задачу". Это не херня, это херняша.
      Перепишите на пацанскую сишку или приходите на педесрачу.
      Ответить
      • Хорошо, сам напросился

        Осторожно! Пиздец!

        int main(void) {
         
        	int l, a, n, p;
        	scanf ("%d\n",&l);
                for (a = l%2, p = getchar()>'9'; --l; n = p ^ getchar()>'9', a &= (p^=n)^n^p );
                printf("%d", a);
                return 0;
        }


        https://ideone.com/3fWW1w
        Ответить
          • a=p и p=b в одном выражении - UB.

            Компилятор подумал: "посчитаю-ка я для начала p = getchar() > '9', а затем сделаю n = p. Теперь надо посчитать их xor - но они же одинаковы. Значит в результате будет 0. Заменим всю эту херню на a = 0".
            Ответить
            • так то да, но ideone кокомпелятор вычисляет в порядке встречи
              Ответить
  • говномакрос
    #define isdigit(c) (c > 47 && c < 58)


    во-первых макросы надо КАПСОМ писать, а во-вторых засовывать все в скобочки, чтобы не происходило всякой херни:
    #define ISDIGIT(c) ((c) > 47 && (c) < 58)
    Ответить
    • Но это тоже говно, надо чтобы если делать
      ISDIGIT(someshit++)

      то не происходило двойного инкремента. Короче, макросы - говно. Не выебывайтесь и делайте функции, когда это возможно. Если вы у мамы оптимизаторы, объявляйте их inline
      Ответить
            • макросы нужны в сишке

              Сам Страуструп писал, что в плюсах макросы ненужны, ибо средства языка позволяют делать все тоже самое, не отрубая программисту ноги.

              Но всем насрать
              Ответить
              • А такое Страуструп переписал на C++?
                #define TRACE(a) std::cout << #a " = " << (a) << std::endl
                Ответить
              • Средства плюсов - говно, не намного лучшее тех же макросов
                Ответить
              • > средства языка позволяют делать все тоже самое

                Нет, не всё средства языка позволяют сделать.
                Ответить
                • Плюсы дважды тьюринг-полны, что ж тебе ещё надо?
                  Ответить
                  • трижды, наверное. Впрочем, до этого недолго осталось - концепты + constexpr (пока что слабовато поддерживается) позволят производить компайл-тайм вычисления параметров для шаблонов. Круто же?...
                    Ответить
                    • Ага, а новые символы так и нельзя будет генерить, только параметризовать уже имеющиеся.
                      Ну и макросы - пока что единственный способ закостылить хоть какую-то "компайл-тайм рефлексию".
                      Ответить
                      • Дзенский мастер во мне говорит что: "Кресты - это сад огород камней".

                        Какую бы фичу не взял программист, везде торчат сишные ноги и возможность отстрелить их, заодно с другими частями тела.
                        Ответить
                        • Например?
                          Указатели? Но ведь есть умные указатели: unique_ptr, shared_ptr, weak_ptr.
                          Потоки? std::thread
                          nullptr, foreach, Rvalue Ref?
                          Где камни?
                          Ответить
                          • >shared_ptr
                            А std::shared_ptr<void> это баг или фича?

                            >Указатели? Но ведь есть умные указатели: unique_ptr, shared_ptr, weak_ptr.
                            >Потоки? std::thread

                            Большинство из перечисленного не особенности самого языка, а куски его библиотеки.
                            Ответить
                            • А std::shared_ptr<void> это баг или фича?
                              а что такого странного в этой конструкции, что её необходимо зачислить в одну из этих категорий с негативным оттенком?
                              Ответить
                • > Почему разрабы нодежс не используют эти хваленые средства языка?
                  if (!(obj)->IsObject()) { \
                      return env->ThrowError( \
                        "expected object for " #obj " to contain object member " #member); \
                    } \

                  > return
                  Потому что хвалёные средства не умеют делать выход из внешнего скопа.
                  Ответить
                  • И о чем это говорит? О том что сами средства языка говно?
                    Ответить
                    • О том, что плюсы - говно. Сишка - нужна, плюсы - нинужны
                      Ответить
                      • Плюсы ну никак не могут быть хуже т.к. можно просто не использовать те возможности, которые плюсы добавляют в сишку (а плюсы это именно что говнонадстройка над си, и никак иначе)
                        Ответить
                      • Давайте прекратим эту демагогию... Все языки нужны, все языки важны.
                        Ответить
                          • >кобол
                            Много софта осталось. Платят бабки.

                            >бейсик
                            Папрашу не трогать грязными лапами.
                            К слову бейсика существует где-то 5-6 вореций, начиная от фортраноподобного спагетти-языка и оканчивая тупым клоном сишарпика.
                            Ответить
                            • >Папрашу не трогать грязными лапами.
                              Прочитал как "Парашу не трогать грязными лапами"
                              Ответить
                  • Средства плюсов вообще сосут. Например, посмотрите на это говно https://github.com/python/cpython/blob/1fe0fd9feb6a4472a9a1b186502eb9c0b2366326/Modules/_decimal/libmpdec/mpdecimal.c#L133
                    По-сути это просто вручную развернутый двоичный поиск. А теперь давайте представим, что нам надо n-ное количество развернутых двоичных поисков для разных размеров массивов и разных типов. Или например вручную развернуть сортировку, чтобы она быстрее сортировала? Средства плюсов могут тут помочь?

                    Проблема тут фундаментальная, и решать ее надо тоже фундаментально. А именно: необходимо вообще к ***** выкинуть сишкоплюсосинтаксис, шаблоны и прочую ересь, перейти на лиспоскобкосинтаксис, сделать такие средства языка, которые бы позволяли работать с этим AST-скобкопредставлением, и как угодно (полнона по тьюрингу) в компилтайме работать с ним, и чтобы при этом не заниматься парсингом сишного кода, а просто бегать по связным спискам, и иметь возможность как угодно их переделывать. Чтобы например можно было lookup table генерить в процессе компиляции, анроллить хвостовую рекурсию и прочее.
                    Ответить
                    • > выкинуть сишкоплюсосинтаксис, шаблоны и прочую ересь, перейти на лиспоскобкосинтаксис

                      Дык ведь я джва года жду такой езык.
                      Ответить

Добавить комментарий

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8