1. Си / Говнокод #19843

    −49

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 19 Апреля 2016

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

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

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

                  Блин, да в те времена 98% программ были досовыми и работали с command.com
                  Ответить
                • >>TP
                  Тэпэшка.
                  Ответить
                • Не было в 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 же
                    Ответить
                    • > прямо с кольцами защиты, и при этом 16 бит
                      google: 80286
                      Ответить
                      • да

                        но так ведь это никто не использовал
                        там и виртуальной памяти-то не было
                        Ответить
                        • http://wiki.osdev.org/Global_Descriptor_Table

                          Sz: Size bit. If 0 the selector defines 16 bit protected mode. If 1 it defines 32 bit protected mode. You can have both 16 bit and 32 bit selectors at once.
                          Ответить
                          • хуясе)

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

                                    есть мнение что современные виртуалки не полностью реализиуют все спецификации IBM PC, и может что-то не заработать. Ну там наверняка они криво эмулируют контроллер клавиатуры i8042 или там прерывание BIOS не умеет сказать сколько дисководов в системе
                                    Ответить
                                    • А у вас нет рабочего 386 под кроватью?
                                      Ответить
                    • В защищённом режиме на 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, имеющих полноценную текстовую консоль, успех был. Неужели текстовая консоль оказалась важнее гуя?
                        Ответить
                        • Небыло консоли в чикаго

                          Был коммандком 16 bit
                          Ответить
                          • А в Чикаге уже была полноценная консоль для Win32-приложений. Даже из коробки несколько утилит (типа 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
            Ответить
    • ?
      ^(?:(?:[a-z][0-9]){1,5}[a-z])|(?:(?:[0-9][a-z]){1,5}[0-9])$
      Ответить
      • Быстрофикс:
        ^(?:(?:[a-z][0-9]){1,5}[a-z]$)|(?:(?:[0-9][a-z]){1,5}[0-9]$)
        Ответить
      • символы экономим!

        ^(\D\d){0,}\D|(\d\D){0,}\d$
        Ответить
        • Во-первых,
          ^(\D\d){0,}\D$|^(\d\D){0,}\d$

          Во-вторых,
          ^(\D\d)*\D$|^(\d\D)*\d$
          Ответить
        • ^(\D?(\d\D){0,5}\d?|\d?(\D\d){0,5}\D?)$

          Длину строки как бы надо проверять
          Ответить
          • >>Длина текста не более 12 символов.

            нахуя проверять условия задачи?
            Ответить
            • тогда
              ^\d?(\D\d)*\D?$

              такого варианта не было
              Ответить
              • потому что он неверен, ибо не отвечает условиям задачи
                Ответить
      • а вообще - вот так
        ^(\D)?(\d\D)*(?(1)|\d)$

        Ответить
        • ?(1) - это нестандартное расширение?
          Ответить
          • в PCRE есть такое
            Ответить
            • Угу, нагуглил уже. Просто смутило, что жабаскриптовский regexper на него заругался, а NP++ - съел.
              Ответить
    • 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!");
      }

      ласт вариант :D
      Ответить
      • по-моему, так более упорото выглядит:
        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("No Error" -~i % 2*3));
          Ответить
          • Годно. Намоминает рекламу банка Москвы (тот же эффект использовали):
            puts("Мне нравится" -~i % 2));
            Ответить
            • puts("пидар" -~i % 2*4); // utf-8
              puts("пидар" -~i % 2*2); // cp1251
              Ответить
        • И тут я понял что я даже не могу упоротый код писать, не то что мультиплеер для 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)
        Вот это отличная находка. Когда читаешь, просто хренеешь. Думаешь "ну, когда же оно на краях глюканёт?"
        Ответить
        • p != 0 && (p < 58) != (c > 57) // было
          p * ((p < 58) - (c > 57)) // стало
          Ответить
          • вместо - отлично подошёл бы ^
            Ответить
            • Кстати да, тогда даже скобки можно убрать:
              p * (p < 58 ^ c > 57)
              Ответить
              • Осталось ещё ввести в код немного v, чтобы стрелки во все направления пустить:
                V * (V < w ^ v > W)
                Ответить
      • Мне больше всего понравилась строка:
        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
          Ответить
          • а вообще - вот так

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



            https://ideone.com/N4vxCJ
            Ответить
            • Ну а теперь сканф и принтф впихни в фор.
              Ответить
              • Это тебя возбуждает?
                for (int l, n, a = scanf ("%d\n",&l)|l%2, p = getchar()>'9'; --l||printf("%d", a)&0; a &= (n=p)^(p=getchar()>'9'));


                https://ideone.com/wVdzs6
                Ответить
            • 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> это баг или фича?
                                а что такого странного в этой конструкции, что её необходимо зачислить в одну из этих категорий с негативным оттенком?
                                Ответить
                • https://github.com/nodejs/node/blob/7c9a691ee7d13ccf1c883e27fdb96eccc8b73d5e/src/node_dtrace.cc#L45

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

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

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

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

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

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