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

    −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
    #include <iostream>
    #include <string>
    
    using namespace std;
    /*
    
    */
    
    int change_word(const int begin_pos, string &words, int k, char c)
    {
        int pos = begin_pos;
        int char_count = 0;
    
        bool replaced = false; 
    
        while(pos < words.length() && isalpha(words[pos]))
        {
    
            char_count++;
            if(char_count == k && !replaced)
            {
                words[pos] = c;
                replaced = true;
    
            }
            pos++;
    
        }
    
        return pos; 
    }
    
    void change_words(string &words, int k, char c)
    {
        int i = 0;
    
        while(i < words.length())
        {
            if(isalpha(words[i]))
            {
                i = change_word(i, words, k, c);
    
            }
            else
            {
                i++;
            }
    
        }
    
    }
    
    
    int main()
    {
        char c = '>'; 
        int k = 0; 
        string words = "Length of the substring to be copied";
    
        cout << "enter number:";
        cin >> k;
        change_words(words, k, c);
    
        cout << "changed text: " << words << endl;
        return 0;
    }

    лаба на с++, заменить в тексте к-тую букву на символ с.

    Запостил: spivti, 01 Сентября 2013

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

    • ваял в коде блокс.
      Ответить
      • > ваял в коде блокс.
        Какое это имеет значение?
        Ответить
        • Сакральное. Аура кода совсем иная.
          Ответить
    • Дежавю. Тот же автор, та же задача, только язык другой
      Ответить
      • "Сичас я начну устанавливать все конпеляторы."
        Ответить
      • На чем мы ее еще не решали?
        Ответить
        • на лиспе
          Ответить
        • на Lua
          Ответить
        • // http://ideone.com/ci7fON
          package main
          
          import (
                  "bufio"
                  "bytes"
                  "log"
                  "os"
                  "unicode"
          )
          
          func ReplaceKthWith(s string, k int, r rune) string {
                  i := 0
                  buf := new(bytes.Buffer)
                  for _, c := range s {
                          if !unicode.IsLetter(c) {
                                  buf.WriteRune(c)
                                  continue
                          }
          
                          i = (i + 1) % k
                          if i == 0 {
                                  buf.WriteRune(r)
                          } else {
                                  buf.WriteRune(c)
                          }
                  }
                  return buf.String()
          }
          
          func main() {
                  k := 3
                  scanner := bufio.NewReader(os.Stdin)
                  s, err := scanner.ReadString('\n')
                  if err != nil {
                          log.Fatal(err)
                  }
                  r := ReplaceKthWith(s, k, '>')
                  os.Stdout.Write([]byte(r))
          }
          Так и быть, держите.
          Ответить
    • void change_words(string &words, int k, char c)
      ...
      i = change_word(i, words, k, c);

      Господи, я уж подумал она рекурсивная
      Ответить
    • #include <iostream>
      #include <algorithm>
      #include <string>
      
      int main () {
        using namespace std;
        
        int k, j = 0;
        string words = "Length of the substring to be copied";
      
        cout << "enter number: ";
        cin >> k;
        replace_if(words.begin(), words.end(), [&] (char c) -> bool {
            (c == ' ') ? j = 0 : j++;
            return j == k;
          }, 'c');
        
        cout << "changed text: " << words << endl;
        return 0;
      }

      lol
      Ответить
      • Примечателен еще тото факт, что в языке Ц++ все функции такого плана (for_each, replace_if и т.д.) принимают первыми аргументами begin / end, а за ними функцию. Т.е. не важно, что у этих аргументов может быть, и почти всегда будет одно и то же значение. Просто человеку выросшему на ВинАПИ может показаться странным, что у функции могут быть дефолтные значения аргументов, да еще и аргументы с дефолтными значениями будут в самом конце!
        Ответить
        • > почти всегда будет одно и то же значение
          И какое же дефолтное значение должно быть у двух указателей?
          Ответить
          • Оп-па, ну ка! Двух указателей? Думаем, думаем еще...
            Ответить
            • 1) "итератором" легко может оказаться и указатель
              2) откуда уверенность, что прямо таки всегда должно быть begin, end? почему не rbegin, rend? или не begin + 1, end - 1
              3) единственный недостаток передачи пары итераторов - возможность передачи a.begin(), b.end(), но даже это решается нормальной реализацией оператора ==
              4) как ни крути, но без передачи самого контейнера в функцию функция не узнает вообще, от чего собственно ей делать begin и end - особенно, если туда действительно надо передать начальный и конечный указатель
              думаем, думаем...
              Ответить
              • Ну некоторая избыточность в передаче двух параметров для одной последовательности углядывается, в Boost.Mpl вроде бы просекли это дело, там во всех алгоритмах фигурируют последовательности целиком, а не итераторы. Boost.Range опять же, реализует похожую идею для рантайма и предоставляет алгоритмы.

                Но порядок аргументов и значения по умолчанию тут вообще не при чём.
                Ответить
                • на деле же идеи boost.range так и не смогли возобладать и просочиться в стандарт
                  кстати, по личному опыту, range использовал только в крайне вынужденных случаях, так что насчет стандарта это показательно

                  ну а mpl - это совсем другая тема
                  Ответить
                  • > так что насчет стандарта это показательно
                    Ну так правильно, зачем кардинально менять то, что неплохо работает. Я сам range ни разу не использовал, ковырял как-то ради интереса после прочтения книжки по MPL. Меня вполне удовлетворяет подход STL.
                    Ответить
                • Ну да, ведь можно ж было бы написать несколько дополнительных шаблонов, где эта же функция принимает контейнер, контейнер + условие окончания цикла / индекс, контейнер + начало + конец.
                  Почему? Потому что в огромном проценте случаев, эта функция нужна когда у нас уже есть контейнер и нам нужно просмотреть его целиком, а получение итераторов - тупая механическая работа. Кроме того, очень часто случается, что у нас уже есть индексы откуда и до какого места нужно просмотреть. Конвертирование этих индексов в итераторы - опять же, механическая работа засоряющая код.
                  Т.е. сделано по принципу не чтобы пользователям было удобно, а чтобы разработчику было удобно.
                  Ответить
                  • если есть индексы - скорее всего, речь идет о массиве/векторе (я тут умолчу о deque), тк это реально 95% контейнеров с индексами
                    сложнейшая механическая работа, имея vec[x], vec[y], получить итераторы &vec[x], &vec[y], даа

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

                      Та хоть три тыщи триста триццать три - какая разница мне, как пользователю? Вам жалко писателей СТЛ? Мне нет, пущай пишут.
                      Ответить
                  • >>в огромном проценте случаев
                    А оставшимся процентам нужно пройтись по подстроке, которую надо предварительно найти; пройтись от начала отсортированного вектора до выполнения некоторого условия; найти что-то в словаре и, если это нашлось, то перед удалением элемента выполнить некоторую логику. Прикажете под каждый случай писать свой алгоритм? Их будет тогда действительно over9000 и это будет ад не только для разработчиков, но и для пользователей, которым придется всё это запоминать.

                    >>Конвертирование этих индексов в итераторы - опять же, механическая работа
                    Мне кажется, или это можно сделать один раз, а потом работать только с итераторами? Исходя из моего скромного опыта, код, основанный на использовании итераторов несколько более громоздкий, но... более красивый, что ли?
                    Ответить
                    • > более громоздкий, но... более красивый, что ли?
                      Ну просто Степанов хорошо подумал и нашёл универсальный интерфейс, разделил "перпендикулярные" сущности - последовательности и алгоритмы над ними, единственность представления последовательности в виде пары итераторов позволяет композицию алгоритмов большим числом способов. Если тебе уж очень нужно - напиши свой шаблон, делов на 5 секунд. Поганить хорошую концепцию тонной оверлодов - глупо.
                      Ответить
              • #4 - уже теплее...
                Ответить
      • Это как я прозевал replace_if, придется взяться за СТЛ конкретно.
        Ответить
    • C# решение одним for ом
      var n = 2;
       var charr = '<';
       var s = "ggghg sgp [a ]pkf ][d kgkggkpa gk[apkf ][sfl";
       var sb = new StringBuilder(s);
       
      for (int i = 0, k = 0; i < sb.Length; k = sb[i] == ' ' ? 0 : k+1, sb[i] = (k == n) ? charr : sb[i++]);
      
      Console.WriteLine(sb.ToString());
      Console.ReadKey();
      Ответить
      • Здесь было столько раз "var"...
        var n = 2; // JavaScript
         var charr = '<';
         var s = "ggghg sgp [a ]pkf ][d kgkggkpa gk[apkf ][sfl";
         var sb = s.split('');
         
        for (var i = 0, k = 0; i < sb.length; k = sb[i] == ' ' ? 0 : k+1, sb[i] = (k == n) ? charr : sb[i++]);
        
        console.log(sb.join(''));
        Ответить
        • Пусть компилятор сам выводит типы, не барское это дело)
          Ответить
      • без стрингбилдера
        string input = "ggghg sgp [a ]pkf ][d kgkggkpa gk[apkf ][sfl";
                    Console.WriteLine(input);
                    char ch = '<';
        
                    unsafe
                    {
                        fixed (char* p = input)
                        {
        
                            for (int i = 0, k = 1; i < input.Length; i++)
                            {
                                if (k == 2)
                                    p[i] = ch;
                                k = p[i] == ' ' ? 0 : k + 1;
                            }
                        }
        
                    }
        
                    Console.WriteLine(input);
        Ответить
        • Блин. Невнимательный я.

          string input = "ggghg sgp [a ]pkf ][d kgkggkpa gk[apkf ][sfl";
                      Console.WriteLine(input);
                      char ch = '<';
          
                      unsafe
                      {
                          fixed (char* p = input)
                          {
          
                              for (int i = 0, k = 1; i < input.Length; i++)
                              {
                                  if (k == 2)
                                      p[i] = ch;
                                  k = p[i] == ' ' ? 1 : k + 1;
                              }
                          }
          
                      }
          
                      Console.WriteLine(input);
          Ответить
          • все ради единички?)

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

                      Тёмная сторона такая тёмная...
                      Ответить
                      • я ж не виноват, что крутые ковбои любят стрелять в ногу
                        Ответить
            • Да, все ради еденички. :)
              И я просто хотел показать еще вариант. Ну т.е. в дополнение к вашему. :)
              Ответить
              • http://govnokod.ru/13659

                эта жа задача во всех возможных вариациях) Даже брейнфак есть)
                Ответить
                • Кстати, чистая сишка там была? Я что-то её не нашёл.
                  А тут как раз бы char* всех зарешал, особенно с авторским change_word. Без богомерзких копирований строки, без богомерзких length.
                  Ответить
                  • В реальном мире, где царствует utf8, не всё так просто.
                    Ответить
                    • И где же он царствует (имеется в виду внутреннее представление строк в языках)?
                      Ответить
                    • Это печально. Но всё же, можно свести задачу к задаче с N=const байт на символ.
                      Ответить
                  • Никто не заметил, что replaced переменная не нужна сдесь в коде. Маленько я затупил.

                    Это как раз с++, с char* да, все было бы даже проще. Хотя, моя цель более менее освоить STL, а там объекты нада юзать.
                    Ответить
                    • Это replaced из change_word?

                      Я сначала подумал, что в change_word какая-то тяжёлая наркомания (цикломания) - какие-то переменные, условия... Но котом понял, что если оставлять один цикл, переменная нужна, а на два может и компилятор разделит, оптимизируя, и уберёт лишнее.
                      Ответить
    • ruby
      def doWork!(str,sym,n)
        str.length.times.inject(1) { |i,ch|  
          i=0 if str[ch]==" "
          str[ch] = sym if i == n
          i+1
        } 
        str
      end
      
      puts doWork!("dd ddd ddd dddddddddddd ddd ","<",2)
      Ответить
      • Пиздец какой-то в стиле хаскеля ;)

        А в руби нет какого-нибудь each у строки, чтобы не городить этот .length.times?
        Ответить
        • я специально делал более запутанный метод)
          Ответить
      • P.S. Имхо, тут бы подошел посимвольный map, но он почему-то на строках в руби не работает.
        Ответить
        • юзай each_char

          def doWork!(str,sym,n)
            i = 1
            str.each_char.map{|ch|
              i = 0 if ch = " "
              i = n ? sym : ch
            }
          end
          
          puts doWork!("dd ddd ddd dddddddddddd ddd ","<",2)
          Ответить
          • прогнал - i нужно плюсовать иногда, и сравнение а не присвоение. Да и код ниже есть)

            спешу просто
            Ответить
            • def doWork!(str,sym,n)
                i = 0
                out = ""
                str.each_char{|ch|
                  i = ch == " " ? 0 : i+1
                  out+= i == n ? sym : ch
                 }
                str = out
              end
              
              print doWork!("dd ddd ddd dddddddddddd ddd ","<",2)


              Что бы строку возвращал, а не массив
              Ответить
              • Зато мой метод с chars.map'ом не портит str ;)
                Ответить
                • Ну так мой метод помечен ! он обязан портить строку)
                  Ответить
                  • А, так вон там зачем этот "!"...

                    А в руби все подряд мутабельное и по ссылке передается? Даже строки, даже числа, даже аллах?
                    Ответить
                    • числа иммутабельные. все остальное - мутабельное. И все - обьекты. даже true, false и nil
                      Ответить
                    • числа по ссылке, сомневаюсь, хотя там вроде все объект (руби знаю мельком).

                      Лично мне сам руби показался сильно путанным,хотя кому как.
                      Ответить
                  • while! s.empty?!!
                        s.clear!!!
                    end
                    Какая экспрессия в коде на руби..
                    Ответить
                    • она не поощряется. по идее бить надо по почкам за такой экспрессивный код)

                      ! - метод меняет обьект. ? - предикат. очень удобно, кстати. Только непривычно, что методы не в CamelCase именуются
                      Ответить
                    • какого хуя! непустой?!!!
                          чисти сука!!!
                      конец
                      Ответить
      • def doWork!(str, sym, n)
            i = -1
            str.chars.map { |ch|
                i = ch == " " ? -1 : i + 1
                i == n ? sym : ch
            }
        end
        Ответить
    • change_world*
      fixed
      Ответить

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