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

    +989

    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
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    95. 95
    96. 96
    97. 97
    98. 98
    99. 99
    stek* getLast(){
    	stek* result = first;
    	while (!isLast(*result)){
    		result = result->next;
    	}
    	return result;
    }
    void push( char* string ){
    	stek* anew = new stek;
    	anew->string = string;
    	anew->next = NULL;
    	anew->first = first;
    	getLast()->next = anew;
    }
    void printList(){
    	if (first != NULL){
    		stek* element = first;
    		puts( element->string );
    		while (!isLast(*element)){
    			element = element->next;
    			puts( element->string );
    		}
    	}
    	else{
    		puts( "List is empty" );
    	}
    }
    stek* getPrev( stek* element ){
    	stek* result = first;
    	while (result->next != element){
    		result = result->next;
    	}
    	return result;
    }
    void changeFirstInList( stek* newFirst ){
    	stek* element = first;
    	while (element != NULL){
    		element->first = newFirst;
    		element = element->next;
    	}
    }
    void deleteElement( stek* element )
    {
    	if ( element->first == element ){
    		first = element->next;
    		changeFirstInList( first );
    	}
    	else{
    		stek* prev = getPrev( element );
    		stek* next = element -> next;
    		prev->next = next;
    	}
    }
    void deleteElements( int length ){
    	stek* element = first;
    	while (element != NULL){
    		stek* next = element->next;
    		if (strlen(element->string) < length) {
    		    deleteElement( element );
    		}
    		element = next;
    	}
    }
    int _tmain(int argc, _TCHAR* argv[]){ 
    	char *token;
    	char st1[80];
    	int minLength = 4;
    	int n=0;
    	
    	printf("Enter string: ");
    	gets( st1 );
    	printf("Enter minimal length: ");
    	scanf( "%d", &minLength );
    
    	first=NULL;
    	first=new stek;
    	first->next=NULL;
    	first->first=first;
      token=strtok(st1," ");
      first->string=token;
      token=strtok(NULL," ");
      while( token != NULL){ 
    	push(token);;
    	token=strtok(NULL," ");
      }
      stek* element = first;
      while (element != NULL){
    	stek* next = element->next;
    	if (strlen(element->string)<3) n++;
    	element = next;
      }
      puts("Initial stack:");
      printList();
      deleteElements( minLength );
      printf("Slov dlinoi less than 3: %d\n",n);
      puts("After deleting:");
      printList();
      getch();
    }

    Лабораторная работа, написанная двумя студентами первого курса. Задание: "Дана строка 80 символов, разбить её на слова (разделитель - пробел), удалить слова меньше опр. длины и вывести количество слов с длиной меньше 3-ех".
    Почти каждая строчка в main'e - перл.
    З.Ы. Форматирование кода тоже доставляет.

    Запостил: Fai, 10 Апреля 2012

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

    • показать все, что скрытоа вот и Fai вылез!
      Ответить
    • > stek
      > Slov
      sliv. весеннее журчание.
      Ответить
    • govnolen = show . length . filter (< 3) . map length 
      
      govnowrd n = show . filter (\x -> length x < n)
      
      govnolab wrds = unlines ["filtered words: " ++ govnowrd 5 wrds , "len(words) < 3: " ++ govnolen wrds]
      
      main = getLine >>= putStrLn . govnolab . words

      Код - 3.14здец, но лаба же. Наговнявкали как смогли для отмазки.
      Ответить
      • (defun lab (input min-length)
          (loop for word-start from 0 below (length input)
             for word-end = (or (position #\Space input :start word-start)
             		   (length input))
             for word-length = (- word-end word-start)
             counting (< word-length 3) into short-words
             when (> word-length min-length)
             collect (subseq input word-start word-end)
             into words
             do (setf word-start word-end)
             finally (format t "Words collected: ~a, ~&Words shorter than 3 character: ~a~&"
             		     words short-words)))
        
        (lab (concatenate 'string "In our laboratory we believe that our highly motivated subject "
        "will perform the most complex tasks while enduring the most intense pain") 5)

        Вместо того, чтобы сначала отрезать, а потом померять ;)
        Ответить
        • на ITERATE перепиши, а то глаза loop режет.
          Ответить
        • фи, ИМПИРАТИВЩИНА
          Ответить
        • Удивительно, насколько проще, короче и понятней выглядит этот императивный алгоритм на python:
          def collect_and_count(line, min_length):
              words = []
              short_count = 0
              for word in line.split():
                  if len(word) < 3:
                      short_count += 1
                  if len(word) > min_length:
                      words.append(word)
              return (words, short_count)
          
          answer = collect_and_count("""
          In our laboratory we believe that our highly motivated subject
          will perform the most complex tasks while enduring the most intense pain
          """, 5)
          print "Words collected: {0[0]}\nWords shorter than 3 characters: {0[1]}".format(answer)
          Ответить
          • Ага, ну ток этот код тоже сначала отрезал, потом померял. Ну для задания, где строка на 80 символов, это, конечно, не важно, но, в принципе, это не то же самое.
            Ответить
            • А вот вы что имели в виду. Тогда реализация на haskell рулит: благодаря ленивости хаскелла разбивка на слова будет происходить по мере необходимости, поэтому список слов не будет полностью помещён в память. Т.е. код примерно эквивалентен.
              Ответить
              • (function lab(text, minLength){
                    var result = [], shortWords = 0;
                    text = text.replace(
                	    /[^\ ]+/g,
                	function(match){
                	    if (match.length < 3) shortWords++;
                	    if (match.length <= minLength)
                		match = "";
                	    return match;
                	});
                	console.log(text + "\nWords shorter then 3 symbols: " + shortWords);
                    })("In our laboratory we believe that our highly motivated subject " +
                       "will perform the most complex tasks while enduring the most intense pain", 5);

                Просто для разнообразия.

                Ленивость не поможет, т.как фунцкия сначала формирует подстроку, а только потом ее меряет и решает нужно ли ее включать в результирующий список или нет.
                Ответить
                • Meh, осталось от другой редакции. result = [] - не нужен.
                  Ответить
            • кстати, в python это тоже сделать довольно просто. Достаточно написать одну очень простую функцию:
              import re
              def lazy_split(str):
                  for m in re.finditer("\\S+", str): yield m.group(0)
              Ответить
          • О, и, кстати, не соотвествует поставленой задаче - делить нужно по пробелам, а не по пробелам, табуляции и обрыву строки :)
            Ответить
      • Фи, два прохода :Р

        import Text.XML.HXT.Core
        
        overhead :: SLA Int String String
        overhead = arrL words
               >>> perform (nextState (+1)) `whenP` isShorter 3
               >>. filter (not . isShorter 5)
        
            where isShorter n = (<n) . length
        
        main = getContents >>= print . runSLA overhead 0
        Ответить
        • я думал тюплами протащить, в стрелках пока не силён. Спасибо за мастер-класс :)
          Ответить
          • зы.. можно еще поменять aka swap кортеж (state, filtered_list): чтоб на большом входе программа могла сразу выводить фильтрованный список, не дожидаясь подсчета state и не отжирая память.
            Ответить
    • std::cout << std::count_if(std::istream_iterator<std::string>(std::cin), std::istream_iterator<std::string>(), [] (const std::string& word) { return word.length() < 3; } );
      Ответить
      • ну ты круто просрался
        Ответить
      • Близко, но не соотвествует поставленной задаче, Нужно считать слова короче 3 символов, но удалять слова короче Х символов, X можно задать.
        Ответить
    • > Почти каждая строчка в main'e - перл.

      Похоже вам встречался весьма недурственный код на перл.
      Ответить
    • http://s40.radikal.ru/i089/1204/19/d31b4cd08877.jpg
      Ответить
      • Говнокодик уже не тот: "C++ vs Delphi" срач уступает место срачам "Linq vs православный цикл" и "Я умный vs Ты дебил"
        Ответить
        • >"Linq vs православный цикл" и "Я умный vs Ты дебил"
          Не нужно ставить это рядом.
          И вообще лучше продолжайте обсуждать Люра и Кузю, это безусловно круче.
          Ответить
          • Да уж, радом не поставишь: второй пользуется заметно большей популярностью...
            Ответить
            • "Императивщина vs функциональщина" - просто эволюционировавший срач "Процедурный подход vs ООП".
              Это потому, что в этом сезоне в моде всё функциональное.
              Ответить
    • static string RemoveAllWordsWithLenghtLessThanN(string s, int N)
              {
                  return string.Join(" ", s.Split(new char[1] { ' ' }).Where(word => word.Length >= N));
              }

      Не фак-йеах ли?
      Ответить
      • С new char[1] { ' ' } я перебрал, можно просто ' '
        Ответить
      • > фак-йеах ли
        Это же LINQ!!! Поцсоны, все в JVM, быстро!
        Ответить
        • Да бляяя, у нее пятаки на стартере сборщик мусора залип
          Ответить
          • Ну да зажигание бывает тупит, зато выверенный дизайн.
            На её основе сейчас, между прочим, лепят много разных моделей.
            Ответить
            • Напоминает АвтоВАЗ...какое уж там авто
              Ответить
              • Так он только движок берут. Ходовая и кузов Синтаксис и парадигма там другие, более продуманные и красивые.
                Ответить
    • Неужели в институте такие изи лабы?
      Ответить
      • а вы предлагаете на первом курсе компиляторы писать, гражданин?
        Ответить
    • perl-style!
      int cutNCountLt3(char *in, char *out, long min) {
          int lt3 = 0;
          char *i = in, *j = in, *k = out;
      
          while (*j && *i) {
              j = i;
              while (*j != ' ' && *j)
                  *k = *j, k++, j++;
      
              *k = *j;
      
              int len = j - i;
              if (len < 3)
                  lt3++;
              if (len < min)
                  k -= len + 1;
      
              i = j + 1;
          }
      
          *k = '\0';
      
          return lt3;
      }
      Ответить
      • говно, такое говно... v2
        int cutNCountLt3(char *in, char *out, long min) {
            int lt3 = 0;
            char *i = in, *j = in, *k = out;
        
            while (*j && *i) {
                j = i;
                while (*j != ' ' && *j)
                    *k++ = *j++;
        
                *k++ = *j;
        
                int len = j - i;
                lt3 += len < 3;
        
                if (len < min)
                    k -= len + 1;
        
                i = j + 1;
            }
        
            k[-1] = '\0';
        
            return lt3;
        }
        Ответить

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