1. C++ / Говнокод #16254

    +16

    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
    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
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    /*
        Дана последовательность, содержащая от 2 до 50 слов, в каждом из которых от 1 до 8 строчных
        латинских букв; между соседними словами - не менее одного пробела, за последним словом - точка.
        Напечатать те слова последовательности, которые отличны от первого слова и
        удовлетворяют следующему свойству: в слове нет повторяющихся букв.
    */
    #include <iostream>
    #include <cstring>
    using namespace std;
    
    void strComparsion(const char *str1, const char *str2, const int beginStr2, const int endStr2);
    int main()
    {
    
        char arrWord[50*8+50+1] = "spros na java programmistov"
                                                " rastet i v etom vinovat chertov android.";
        int counterSpace = 0; //Счетчик пробелов
        char strOneBuffer[9]; //Массив для первого слова
    
        cout << "Na vhode: \n" << arrWord << endl;
        cout << "Na vyhode: \n";
    
        //Копируем первое слов  в отдельный массив
        for(int i = 0; arrWord[i-2] != ' ';i++)
        {
            strOneBuffer[i] = arrWord[i];
            if(arrWord[i] == ' ')
            {
                strOneBuffer[i] = '\0';
                counterSpace = i;
            }
        }
    
        for(int i = counterSpace + 1, j = counterSpace + 1; arrWord[i] != '\0' ; i++)
            if(arrWord[i] == ' ' || arrWord[i] =='.')
            {
               strComparsion(strOneBuffer, arrWord, j, i);
               j = i +1;
            }
    
        return 0;
    }
    void strComparsion(const char *str1, const char *str2, const int beginStr2, const int endStr2)
    {
        //Флаги
        int countSymbol = 0;
        int repeatSymbol = 0;
    
        //Сравниваем слова с первым словом
        if( strlen(str1) == endStr2 - beginStr2 )
            for(int i = 0, j = beginStr2; j < endStr2; i++, j++)
                if(str2[j] == str1[i])
                    countSymbol++;
    
        //Ищем повторяющийся буквы в слове
        for(int i = beginStr2; i < endStr2; i++)
            for(int j = beginStr2; j < endStr2; j++)
            {
                if(i == j)
                    continue;
                if(str2[i] == str2[j])
                    repeatSymbol++;
            }
    
        //Выводим слово по требуеиым критериям
        if(countSymbol < strlen(str1) && repeatSymbol == 0)
            for(int i = beginStr2; i < endStr2; i++)
            {
                cout << str2[i];
                if(i == endStr2 - 1)
                    cout << " ";
            }
    }

    Это я писал после 6 месяцев изучения кодинга

    Запостил: ConstantineVL, 29 Июня 2014

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

    • > C++
      > const char *, strlen
      No way!
      Ответить
    • > for(int i = 0; arrWord[i-2] != ' ';i++)
      О_о. Оно точно работало? Тут же явный UB из-за вылета за границу массива.

      > после 6 месяцев изучения кодинга
      Норм. В принципе, у всех такое было в начале изучения кодинга.
      Ответить
      • А как же С++ за 21 день?
        Ответить
        • Нет сынок, это фантастика.
          Ответить
        • предлагается что ты спустя 10 лет изучения с++ изобретешь/купишь/украдешь машину времени и переместишься во времени в 20 день изучения с++.
          Ответить
          • Угу, а тут облом-с - последнего плюсостандарта ещё не изобрели.
            P.S. Если бы я переместился в 2001-й, то первым делом накупил/намайнил бы биткойнов. И никаких проблем с плюсами.
            Ответить
    • > О_о. Оно точно работало? Тут же явный UB из-за вылета за границу массива.
      Ну, весьма маловероятно, что хотя бы один из пары байт перед началом массива равен 32 ;)
      Хотя да, код весьма неожиданный)))
      Ответить
    • programmistov - больше 8 букв. Нарушаем?
      Ответить
      • В strOneBuffer только первое слово копируется. Так что пох.

        Тут гораздо интересней, почему 50*8+50+1.
        Ответить
    • cleaned
      Ответить
    • https://ideone.com/RCwbgr
      Ответить
      • В шарпе же всяко split или готовые токенизаторы есть, зачем байтоёбить?

        P.S. Код мутноват: далеко не сразу понятно, что вообще происходит.
        Ответить
        • Ради байтоебства. Split есть, но зачем плодить массивы?
          Ответить
          • > Ради байтоебства.
            1) Пирфоманс важен далеко не всегда, иногда лучше поюзать Split() и получить чистый, наглядный и красивый код (хоть и более медленный, и жрущий больше памяти).
            2) Если у кода нормальный интерфейс, то реализацию всегда можно превратить в байтоёбскую (если это вообще когда-нибудь понадобится).
            3) Чем меньше байтоёбства в коде - тем легче его поддерживать и изменять.

            > Split есть, но зачем плодить массивы?
            Ну если split() не подходит (например строка многомегабайтная, или вообще какой-нибудь сокет вместо строки) - можно поюзать готовые токенизаторы, которые работают без полного массива, копируя токены по одному.
            Ответить
            • Написал перевод строки без байтоебства-плохо, написал код для задачки с байтоебством - плохо. Вы просто меня не любите

              Тут задача на выброс - какая поддержка, о чем вы? Про наглядность тоже сказать нечего - нах она в этой задаче не нужна. Ну можно было и рассплитить. Я особой разницы не вижу)
              Ответить
              • > Тут задача на выброс - какая поддержка, о чем вы?
                Тогда какой смысл вообще заморачиваться с пирфомансом? :) Split'нул, пробежался for'ом, да и дело с концом, можно чем-нибудь более интересным заняться. Для задач на выброс время разработки - решающий фактор, чем быстрее ты ее запилишь, поюзаешь и выкинешь - тем лучше. А байтоёбство этому явно не способствует.

                > Про наглядность тоже сказать нечего - нах она в этой задаче не нужна.
                Для учебной задачи наглядность - самый важный показатель.

                > Я особой разницы не вижу)
                Да похуй на самом деле, надо ж тебя как-то потроллить ;)
                Ответить
                • https://ideone.com/GxRd8K

                  Мне же надо учиться байтоебить, хотя бы на кошках)
                  Ответить
                  • Ну вот этот код я просто пробежал глазами и понял с первого захода ;)

                    Только вместо break в 26 строке я бы поставил return false, а 29ю строку заменил бы на return true. Ну и letters[word[i] - 'a'] довольно рискованная конструкция (для сишки, а в шарпе ведь будет просто исключение?).
                    Ответить
                • На, тролль, че уж)
                  import Prelude
                  import Data.List.Split
                  					
                  main = print $ someMethod "fad gg hgfty fad juujy gerf"
                  
                  someMethod str = f $splitOn " " str	
                  				
                  f (h:t) = filter (\x->x/=h && (uniq x)) t
                  
                  uniq (h:t) = (not $isContain h t) && (uniq t)
                  uniq [] = True
                  
                  isContain a (h:t) = if a==h then True else isContain a t
                  isContain a [] = False
                  Ответить
                  • ну или https://ideone.com/IZkbW8
                    Ответить
                  • main = print $ someMethod "fad gg hgfty fad juujy gerf"
                    
                    someMethod s = filter uniqLetters $ filter (/= first) other
                        where (first:other) = words s
                    
                    uniqLetters = all (== 1) . map length . group
                    http://ideone.com/akfJ61
                    Ответить
                    • Вот чего мне не хватает, так это знаний функций из коробки)
                      Ответить
                      • Ты думаешь, что я их все знаю и помню? :)

                        http://www.haskell.org/hoogle/

                        Вбиваешь туда какую-нибудь сигнатурку в духе (a -> Bool) -> [a] -> Bool и получаешь все эти any, all и т.п.
                        Ответить
                        • Крутая ссыль, спс. Я думаю мне для начала и ручками все будет полезно пописать. А вообще у меня какие то проблемы с оператором композиции функций. То есть у мне постоянно какой то ступор, хотя мозгом я понимаю, что он делает.) Опыта мало, буду учиться
                          Ответить
                          • > проблемы с оператором композиции функций
                            Ну вот представь себе конвейер, по которому передаются некие данные. Попадают на вход первой функции, ее выход попадает на вход второй и т.п. Вот так он и юзается ;)
                            Ответить
                            • > Ну вот представь себе конвейер
                              А потом приходит функция от двух аргументов, принимающая кашу с точечками и долларами, приходится расписывать на бумажке и просто верить в результат (т.к. каждое равенство истинно), а не осознавать.
                              Ответить
                              • Функций от двух аргументов в Haskell нет.
                                Ответить
                                • зато есть функции от одного аргумента которые возвращают функцию от одного аргумента)
                                  Ответить
                            • Это понятно, но в реальных примерах я просто теряюсь)
                              Ответить
                    • У меня пока с точечками проблемы - как будет выглядить uniqLetters без суперпозиции?

                      uniqLetters = all (== 1) (map (length (group id)) id)
                      ?
                      Ответить
                    • filter (liftM2 (&&) uniqLetters (/= first))

                      Хотя тут два последовательных фильтра сфьюзятся, возможно.
                      Ответить
                  • > На, тролль, че уж)
                    > import Prelude
                    > if a==h then True else isContain a t
                    *trololo*
                    Ответить
                    • > import Prelude
                      Ну да, прелюдию вручную подключать необязательно, если не хочешь что-то конфликтующее из нее выкинуть или сделать import qualified.

                      > if a==h then True else isContain a t
                      А что не так? Обычный тернарничек.
                      Ответить
                      • > А что не так? Обычный тернарничек.
                        Сводится к a==h || isContain a t (по крайней мере, в сишке).
                        Ответить
            • нормально у него с перформансом все, вполне себе сишный алгоритм - чего и требовалось для учебной задачи
              единственно, в сишке можно было бы не копировать первое слово - но ведь в шарпике иммутабельные строки и субстр дешевый?
              Ответить
              • >>в шарпике иммутабельные строки и субстр дешевый?
                Так точно, мистер Пикард
                Ответить
              • > нормально у него с перформансом все
                С перфомансом всё нормально, я к нему и не докапываюсь. Вон даже массив, для проверки на уникальность букв не пересоздается, а аккуратно юзается заново с новым wordIndex. Царь был бы доволен.
                Ответить
              • > шарпике иммутабельные строки и субстр дешевый?
                строки иммутабельные, но субстр не дешёвый
                Ответить
      • Вот как надо :D
        class Program
          {
            static void Main(string[] args)
            {
              var str = "fad gg hgfty fad juujy gerf qwerq qwerwt qwwer qwee qq quiz.";
              var res = string.Join("\n", from Capture c in Regex.Match(str, @"^(\w+)(\s+(\1|\w*(\w)\w*\4\w*|(\w+)))+").Groups[5].Captures select c.Value);
              Console.WriteLine(res);
              Console.ReadKey();
            }
          }
        Ответить

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