Кресты / Говнокод #212 Ссылка на оригинал

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
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
bool IsBukva(char symbol)
{
switch(symbol)
{
case'a':return 1;break;
case'b':return 1;break;
case'c':return 1;break;
case'd':return 1;break;
case'e':return 1;break;
case'f':return 1;break;
case'g':return 1;break;
case'h':return 1;break;
case'i':return 1;break;
case'j':return 1;break;
case'k':return 1;break;
case'l':return 1;break;
case'm':return 1;break;
case'n':return 1;break;
case'o':return 1;break;
case'p':return 1;break;
case'q':return 1;break;
case'r':return 1;break;
case's':return 1;break;
case't':return 1;break;
case'u':return 1;break;
case'v':return 1;break;
case'w':return 1;break;
case'x':return 1;break;
case'y':return 1;break;
case'z':return 1;break;
case'A':return 1;break;
case'B':return 1;break;
case'C':return 1;break;
case'D':return 1;break;
case'E':return 1;break;
case'F':return 1;break;
case'G':return 1;break;
case'H':return 1;break;
case'I':return 1;break;
case'J':return 1;break;
case'K':return 1;break;
case'L':return 1;break;
case'M':return 1;break;
case'N':return 1;break;
case'O':return 1;break;
case'P':return 1;break;
case'Q':return 1;break;
case'R':return 1;break;
case'S':return 1;break;
case'T':return 1;break;
case'U':return 1;break;
case'V':return 1;break;
case'W':return 1;break;
case'X':return 1;break;
case'Y':return 1;break;
case'Z':return 1;break;
default:return 0;
}
}

Женский вариант проверки символа на букву.
Оригинал тут: http://forum.vingrad.ru/forum/topic-240593.html

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

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

  • 1:
    Мощьно. Интересно посмотреть этот код в асме. 🙂
    Ответить
  • Танненберг:
    А если надо проверить, является ли символ иероглифом, также будут писать?
    Ответить
  • Sam:
    в чар иероглиф не лезет, так что всё нормально 🙂
    Ответить
  • Alexander G:
    [quote=1]Интересно посмотреть этот код в асме. 🙂 [/quote]

    MSVC8, x68:
    00401000:  movsx       eax,al 
    00401003:  add         eax,0FFFFFFBFh 
    00401006:  cmp         eax,39h 
    00401009:  ja          $LN53+3 (401015h) ; меньше 'A' или больше 'z'
    0040100B:  jmp         dword ptr  (401018h)[eax*4] ; таблица адресов, все элементы 00401015 или 00401015
    00401012:  mov         al,1 
    00401014:  ret              
    00401015:  xor         al,al 
    00401017:  ret

    Честно говоря ожидал лучше (без таблицы).
    Ответить
              • форич на несколько милисекунд дольше работает, обычно не заметно, а вот в тяжелых циклах лучше фор юзать. Однако все равно <= блабла-1 на < блабла заменить
                Ответить
                • Говнокодеры в деле, опять же вы спорите о хуете, в тяжелых приложениях делают так:
                  len = input.length();
                  for (i=0;i<len;i++)

                  а вообще чемпион по скорости:
                  len = input.length();
                  while(lin--)
                  Ответить
                  • неа, такое кеширование наоборот убъет производительность
                    jit увидит что мы бегаем по циклу и вынесет проверку на выход за границы из тела цикла, а если кешировать длину массива, в каждой итерации цикла будет происходить та самая проверка
                    Ответить
                    • >jit увидит что мы бегаем по циклу и вынесет проверку на выход за границы из тела цикла
                      Совершенно непонятно как введение временной переменной мешает увидеть jitу что мы бегаем по циклу.
                      >а если кешировать длину массива, в каждой итерации цикла будет происходить та самая проверка
                      Пруфы?
                      Тесты на jsperf показывали обратное. Жава тоже дуплит и выпиливает условия, если может на входе в цикл доказать что он проходит в границах массива.
                      Ответить
                    • Вы реально думаете что джит такой тупой что не прорвется сквозь сахар и не поймет что оба кейса это одно и тоже?)

                      Мне кажется тут не то что джит -- тут компилятор их примерно в одно склеет
                      Ответить
                • > вот в тяжелых циклах лучше фор юзать

                  блядь, ты там поисковую машину гугла пишешь чтоли? или движок AAA игры?
                  Ответить
                  • Лишнехромосомный, плиз. Проебывать производительность ради сахара...

                    > в тяжелых циклах
                    Он написал "приложения". Очевидно, что от сахара пострадают в первую очередь легкие циклы.

                    Ну что за даун?..
                    Ответить
            • for_each(begin(container), begin(end),
              [](TItem item)
              {
              });


              for(auto item: container)
              {
              };
              Ответить
  • Маленький Мак:
    А где break после default'а? Выбивается из общего стиля!
    Ответить
  • Johnny:
    Регулярочку например на email-проверку в подобном стиле представьте)))
    Ответить
  • p:
    Помнится на первом курсе у нас не только прекрасная часть группы так выкручивалась
    Ответить
  • Giver:
    Это скорее ява, или до диез, чар двухбайтовый, лезут туда иероглифы
    Ответить
  • Firensa:
    Обидно блин. чо сразу женский то? протестую!
    Ответить
  • Звездочёт:
    Да, в школе не учились, с неравенствами не знакомы и ASCI кодами тоже)) Но то, что после return стоит break(!!!???) - это убойно!)
    Ответить
  • Нихуя!:
    [quote=Звездочет]Да, в школе не учились, с неравенствами не знакомы и ASCI кодами тоже)) Но то, что после return стоит break(!!!???) - это убойно!)[/quote]
    Какие в жопу ASCII коды?

    =~ /[A-Zaz]/
    Ответить
  • //fix:
    =~ /[A-Za-z]/

    дефисенг пропустил.

    парам-пам-пам

    (ессно это кучек,даже не до конца строки)
    Ответить
  • Круче было бы, если
    switch(symbol)
    {
    case 97:return 1;break;
    case 98:return 1;break;
    case 99:return 1;break;
    case 100:return 1;break;
    case 101:return 1;break;
    ...


    Нет, даже так:

    switch(symbol)
    {
    if (symbol == 97) {
      return 1;
    } else if (symbol == 98) {
      return 1;
    } else if ...
    ...
    Ответить
    • Можно еще так:

      char alphabet[] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
      int count = sizeof(alphabet);
      char * p = alphabet;
      for (int i = 0; i < count; i++, p++)
      {
      if (symbol == *p)
      return 1;
      }

      Мозг у некоторых интересно работает: человек может знать всего страуструпа, уметь всем этим пользоваться и при этом вот такие алкоритмы выдавать.
      Ответить
      • кстати, страуструп бы такое одобрил! Ведь символы могут быть разбросаны по всей таблице, если это не ASCII, а тут у нас хорошая портируемость
        Ответить
          • А оптимизация. Метод половинного деления. число операций около 5.
            Ещё можно расставить буквы в грамотном порядке, с учётом вероятности их использования(с учётом перебора методом ПД).

            Золотой костыль получается
            Ответить
  • Нет, лучше так
    if (bukva==0) {return 0;}
    else if (bukva==1) {return 0;}
    ...
    else if (bukva==97) {return 1;}
    ...
    ...
    ...
    Ответить
  • Андрей:
    Откуда в людях столько трудолюбия и упорства берется? Мне проще написать прогу, которая сгенерирует такую хрень, чем писать это. Код улыбнул.
    Ответить
  • "Женский вариант проверки символа на букву." (с)

    Задолбали уже! Хватит дискриминации по половому признаку!
    Или требую под каждым говнокодом писать "Мужской вариант бла-бла-бла!"

    *Ушла кодить, ненавижу мужиков, люблю кампутеры!*
    Ответить
  • В делфи удобнее я спициальную прогу написал которая пишет такойже говнокод, но не с одним а с 5 символами, час писало,на ~200мб,
    Ответить
    • Если только для прописных:
      bool is_latin(char symbol)
      {
      if (symbol >= 'A' && symbol <= 'Z')
      return true;
      return false;
      }

      А так -
      bool is_latin(char symbol)
      {
      if ((symbol >= 'a' && symbol <= 'z') || (symbol >= 'A' && symbol <= 'Z'))
      return true;
      return false;
      }

      ну или на крайний,
      bool is_letter (char symbol)
      {
      return !isdigit((int)symbol);
      }
      Ответить
      • Да и так пойдёт:
        bool is_letter (char symbol)
        {
        return !isdigit(symbol);
        }
        Ответить
      • у меня:

        bool char_IsLatin(wchar_t c)
        {
        return (c >= L'a' && c <= L'z') || (c >= L'A' && c <= L'Z');
        }

        bool char_IsDigit(wchar_t c)
        {
        return (c >= L'0' && c <= L'9');
        }
        Ответить
      • поаккуратнее с
        if (...) return true;
        return false;
        🙂
        всё-таки тип bool и придумали, чтобы сразу писать
        return (...);
        😉
        Ответить
          • Он предлагает рефакторинг. Вот это вот:
            bool is_latin(char symbol)
            {
                if ((symbol >= 'a' && symbol <= 'z') || (symbol >= 'A' && symbol <= 'Z'))
                return true;
                return false;
            }
            Заменить на это:
            bool is_latin(char symbol)
            {
                return (symbol >= 'a' && symbol <= 'z') || (symbol >= 'A' && symbol <= 'Z');
            }

            На самом же деле первый вариант никакой опасности не таит, он просто длиннее.
            Ответить
            • function is_latin(symbol: character): boolean;
              begin
                is_latin := symbol in ['a'..'z', 'A'..'Z']
              end;


              Именно поэтому я пасцал.
              Ответить
              • коко вообще во дну строчку
                fun isLatin(c: Char) = arrayOf(('a'..'z'), ('A'..'Z')).any { c in it }
                Ответить
                • Я за «C»:
                  int isLatin(char c) { return ((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')); }
                  Ответить
                    • int isLatinW(wchar_t c) { c &= 0xFF; return ((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')); }
                      Ответить
                        • "Kirillica" ne nuzhna. Semi bit na simvol hvatit vsem!

                          int isLatinW(wchar_t c) { return ((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')); }
                          Ответить
                          • Это было бы смешно, если бы отрезание старших битов не встречалось в реальных программах. В 1980-х и в 1990-х в англоязычных программах это было повсеместно (и даже в 2000-х, когда стали переходить на «Unicode», это встречалось).
                            Ответить
                          • А ещё это... цветные картинки только жрут оперативку. Чёрно-белой графики хватит всем!
                            Ответить
                              •  ┌─┐  ┌──┐                                       
                                 │ │ ┌┘  │                                       
                                 │ │┌┘┌┐ │ __  __  ___ _   _ _   _  ___          
                                 │ └┘┌┘│ │|  \/  |/ _ \ |_| | |_| |/ _ \         
                                 │  ┌┘ │ │| \  / |  __/  _  |  _  | (_) |        
                                 └──┘  └─┘|_|\/|_|\___|_| |_|_| |_|\___/         
                                  _____  ___ ___ _____ ___  __  __ _   _         
                                 | ._. |/ _ \__ \_. ._/ _ \|  \/  | | | |        
                                 | | | | (_) |_ | | || (_) | \  / | |_| |        
                                 |_|_|_|\___/___/_|_| \___/|_|\/|_|\__, |        
                                 / __ | ( _ \/ _` |                 __/ |        
                                 \    |  (_ < (_| |                |___/     _   
                                 /_/|_| (___/\__,_|                         (_)  
                                  _____ ___ _  _____ _____ ___  ___ _    _ _   _ 
                                 |_. ._/ _ \ |/ / __|_. ._/ _ \| _ \ |_ | | | | |
                                   | ||  __/   < (__  | || (_) | _ ( _ \| | |_| |
                                   |_| \___|_|\_\___| |_| \___/|___/___/|_|\__,_|
                                                                 | |             
                                  _ __   _____  _  ___   _ __  __| |             
                                 | '_ \ / _ \ \| |/ / | | |  \/  | |             
                                 | |_) |  __/>     <| |_| | \  / |_|             
                                 | .__/ \___/_/|_|\_\\__,_|_|\/|_(_)             
                                 | |                                             
                                 |_|
                                Ответить
                              • Икарус, заводи поять тему про KOI8- с отрезанным верхним битом, мы это любим:)

                                >>> "".join(chr(k & 0x7F) for k in 'сорок тысяч абизян в жопу сунули бонан'.encode('koi8-r'))
                                'SOROK TYSQ^ ABIZQN W VOPU SUNULI BONAN'
                                Ответить
                  • кажется что соснул только питон, да и там есть лямблия
                    Ответить
                    • Кстати странно, что в питоне нельзя сделать рендж из символов. Но можно так:
                      def is_latin(c): return ord(c.upper()) in range(b'A'[0], b'Z'[0] + 1)
                      Ответить
                      • в пиздое нету чаров бо, тока строка

                        зачем ты байтстроку потрогал?
                        почемуне
                        range(ord('a'), ord('z'))


                        кстати
                        в рубя можно и без ссаного ретурно и ренджи можно

                        def islatin(c) ('A'...'z') === c.capitalize  end
                        Ответить
                      • Осторожнее, путник, ты вступаешь на тонкий лёд «Юникода»!
                        >>> def is_latin(c): return ord(c.upper()) in range(b'A'[0], b'Z'[0] + 1)
                        ...
                        >>> is_latin('ß')
                        Traceback (most recent call last):
                          File "<stdin>", line 1, in <module>
                          File "<stdin>", line 1, in is_latin
                        TypeError: ord() expected a character, but string of length 2 found


                        Именно поэтому я против «Юникода».
                        is_latin = lambda c: c.isalpha() and ord(c) < 128
                        Ответить
                        • Ёбаная лигатура
                          В Швейцарии нету никаких лигатур, именно потому я за
                          Ответить
                        • Упоролся?

                          Питух ты анскильный, матчасть иди учи. Твой говно интерпретатор и не такую питушню может выдать, питух ты глупенький.

                          Не один вменяемый человек этим говном не воспользуется.
                          Ответить
                        • На всякий случай напоминаю тебе, что отвечать безграмотному уёбку, который косит под superkiller1997, не нужно
                          Ответить
                • Фу, у тебя хоть и коротко, но много действий:
                  1. Создание ренджа
                  2. Создание ренджа
                  3. Создание массива
                  4. Создание лямды
                  5. Вызов метода any
                  6. Итереция по массиву и вызов лямды на каждой итереции
                  Ответить
                  • Думаешь, этот код станет боттлнеком?
                    Ответить
  • Нужно было этой девушке перед созданием функции подсунуть, как-бы невзначай, таблицу с юникодом.
    Ответить
  • Если кто проходил по ссылке на оригинал, обратите внимание, там ещё есть подобный аналог функции toLowerCase() для перевода в нижний регистр, и тоже на свитче ))
    Ответить
  • Crabbe наспамил, что 3oJIoTou_xyu наспамил.
    Ответить
  • Царский анролл же. Только для пирфоманса нужно упорядочить условия по убыванию вероятности их выполнения. Для этого нужно взять таблицу частот букв (которая используется в частотном криптоанализе). Эта таблица будет зависеть от языка. Например, если преобладают фразы на английском, то будет так:
    bool IsBukva(char symbol)
    {
    switch(symbol)
    {
    case'e':return 1;break;
    case't':return 1;break;
    case'a':return 1;break;
    case'o':return 1;break;
    case'n':return 1;break;
    case'r':return 1;break;
    case'i':return 1;break;
    case's':return 1;break;
    case'h':return 1;break;
    case'd':return 1;break;
    case'l':return 1;break;
    case'f':return 1;break;
    case'c':return 1;break;
    case'm':return 1;break;
    case'u':return 1;break;
    case'g':return 1;break;
    case'y':return 1;break;
    case'p':return 1;break;
    case'w':return 1;break;
    case'b':return 1;break;
    case'v':return 1;break;
    case'k':return 1;break;
    case'x':return 1;break;
    case'j':return 1;break;
    case'q':return 1;break;
    case'z':return 1;break;

    Для заглавных аналогично.

    На правах офтопика:
    http://bibla.ru/files/book_covers/9696.jpg
    Ответить
    • gcc похуй на твой арнолл, без оптимизаци там таблица переходов, а с:
      IsBukva(char):
              sub     edi, 97
              cmp     dil, 25
              setbe   al
              ret
      Ответить
      • >setbe
        >dil
        блядь, надо современный асемблер учить.

        в реальном режиме не было никаких дилд и сетбее
        Ответить
        • дилда — енот младший батик eldi, сетбе — сет иф белов ор икуал.
          Ответить
          • >дилда — енот младший батик eldi,

            А, это как АH и АЛ это лапапамки AX?
            Ответить
            • Да. Есть ещё SIL, BPL, SPL. А вот с буквой «ха» аналогов нет. Т. е. DIH, SIH, BPH, SPH не придумали.
              Ответить
        • Сетбе были, начиная то ли с «Пентиума», то ли с 80486.

          А вот дилда доступна только в длинном 64-битном режиме.
          Ответить
      • Что твой gcc будет делать, например, с русскими буквами с буквой "Ё"? Соснёт, или тоже разанроллит?
        Ответить
        • Где тут анролл?

          Юникодовская "Ё" даже в чар не влезет. Хотя может и есть платформы где sizeof(char) >= 2...

          А с однобитовыми кодировками особой разницы нет, какой там символ.
          Ответить
          • >sizeof(char) >= 2..
            ты точно стертор судя по непроходимой тупости
            Ответить
            • Да, облажался, но количество бит вполне может быть > 8.
              Ответить
        • У «gcc» нет никаких букв. В «Си» вообще нет типа данных для символа. Это в «Паскале» есть «char» для символов и «byte» для однобайтовых чисел. А в «Си» char — это число.

          Во что превратится буква «Ё», зависит от того как она представлена в исходнике. Если прямо вот так буквой, результат зависит от кодировки исходника и от параметров, с которыми вызван компилятор (ему нужно указать какую кодировку ты используешь). Например, для «UTF-8» нужно вызывать «gcc» с параметром -finput-charset=UTF-8 (при этом из исходника нужно удалить BOM). Да, при использовании «Unicode» придётся перейти с char на wchar_t.

          Есть ещё безопасный способ записи нелатинских символов. Например, "Ё" можно записать как "\u0401", тогда будет плевать на то, в какой кодировке исходник.

          Кстати, в «Паскале» при использовании диапазонов (например, 'A'..'Z') тоже будет «анролл».
          Ответить
          • Для НЕ аски символов лучше всего использовать wchar_t и строковой литерал L'';

            Важно не забыть включить локаль на прыщах
            #include <stdio.h>
            #include <wchar.h>
            #include <locale.h>
            
            void main() {
                    wchar_t a = L'ы';
                    setlocale(LC_ALL, "");
                    printf("%lc is %d", a, a);
            }
            Ответить
  • Там продолжение есть:
    char LowReg(char symbol)
    {
    switch(symbol)
    {
    case'A':return'a';break;
    case'B':return'b';break;
    case'C':return'c';break;
    case'D':return'd';break;
    case'E':return'e';break;
    case'F':return'f';break;
    case'G':return'g';break;
    case'H':return'h';break;
    case'I':return'i';break;
    case'J':return'j';break;
    case'K':return'k';break;
    case'L':return'l';break;
    case'M':return'm';break;
    case'N':return'n';break;
    case'O':return'o';break;
    case'P':return'p';break;
    case'Q':return'q';break;
    case'R':return'r';break;
    case'S':return's';break;
    case'T':return't';break;
    case'U':return'u';break;
    case'V':return'v';break;
    case'W':return'w';break;
    case'X':return'x';break;
    case'Y':return'y';break;
    case'Z':return'z';break;
    default:return symbol;
    }
    }
    string CleanString(string input)
    {
    string output;
    string temp;
    int i;
    for (i=0;i<=input.length()-1;i++)
    {
    if (IsBukva(LowReg(input.at(i))))
    {
    temp = LowReg(input.at(i));
    output.append(temp,0,1);
    }
    }
    return output;
    }
    bool palindrom(string output)
    {
    int i;
    for(i=0;i<=output.length()-1;i++)
    {
    if(output.at(i)!=output.at(output.length()-i-1))
    return 0;
    }
    return 1;
    }
    void main()
    {
    string stroka;
    cout<<"Vvedi stro4ku: ";
    cin>>stroka;
    cout<<palindrom(CleanString(stroka))<<'\n';
    }
    Ответить
  • 11 июня сообщалось, что в московском районе Ясенево коммунальщики при укладке асфальта использовали «передовые технологии». Рабочие, в процессе заделывания дыры на проезжей части, после укладки смеси набрасывали на участок картонку и ходили по ней, утрамбовывая покрытие.
    Ответить
  • Обезглавленное тело священномученика Дионисия встало, взяло в руки свою голову и пошло к тому месту, где была христианская церковь (около шести километров до поселения, которое впоследствии стало носить имя Сен-Дени).

    Там, отдав главу одной благочестивой женщине по имени Катулла, из римской знати, оно пало на землю
    Ответить

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

Семь раз отмерь — один отрежь, guest!

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


    8