1. JavaScript / Говнокод #16031

    +154

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    var turn = 0;
    		function turn_over() {
    			var text = document.getElementById('turn-over-in').value;
    			var first_letter = text.charAt(0).toLowerCase();
    			var last_letter = text.charAt(text.length-1).toUpperCase();
    			var new_text = first_letter + text.substr(1,text.length-2) + last_letter;
    			var text_array = new_text.split('');
    			var inside_out = text_array.reverse();
    			var turn_over_text = inside_out.join('');
    			document.getElementById('turn-over-out').value = turn_over_text;
    <...>

    Задача: развернуть строку текста (Абв->Вба).

    Запостил: gost, 21 Мая 2014

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

    • Подумал на досуге и получилось почти тоже самое, только обошлось меньшим количеством строк ):
      String.prototype.reverseAndCapitalize = function () {
          var reversed = this.split('').reverse().join(''),
                firstLetter = reversed.charAt(0).toUpperCase();
          return reversed.replace(/^\w/, firstLetter);
      }
      Ответить
      • function reverseAndDecapitate(input) {
            return [].reduce.apply(input, [function (a, b) {
                return (a.length - input.length - 1 ? b.toUpperCase() : b)
                    + (a.length - 1 ? a.toLowerCase() : a);
            }]);
        }
        Ответить
      • О, вот, еще лучше:

        function recurseAndIncapacitate(input) {
            return (input.length - 1) ?
                recurseAndIncapacitate(input.substr(1)) +
                input[0].toLowerCase() : input.toUpperCase();
        }
        Ответить
        • А смысл? Во первых мой код универсальнее, он принимает строку на вход, а не инпут. Во вторых количество кода не изменилось, а читабельность ухудшилась. Надеюсь Вы не один из тех программистов, кто намеренно усложняет код, чтобы его коллега потом переписывал все с нуля ибо ЯННП )
          Ответить
          • Эх, ничего вы не понимаете...
            Мои варианты такие же идиотские (но я хоть делал это сознательно для развлечения), как и reversed.replace(/^\w/, firstLetter); Там же уже был массив, что мешало в нем же и поменять регистр?

            И, кстати, количество кода не осталось таким же, оно уменьшилось. В небытие ушли деструктивные присваивания и мутации. Более того, код выражает суть происходящего минимально доступными средствами (и при этом использует меньше слов, чем если бы использовал, как в вашем примере, не совсем подходящие инструменты).
            Ответить
            • >Мои варианты такие же идиотские
              Ну а что еще могут предложить на ГК?
              >Более того, код выражает суть происходящего минимально доступными средствами
              Согласен, чистая рекурсия красивее.

              Плюс Ваш код recurseAndIncapacitate("fUUU") выдает красивое "Uuuf", а его "UUUf"
              Ответить
              • Ну там еще есть много различий. А что если там не буквоцифры будут, а что если пустая строка и т.п.
                Ответить
                • Зависит от того, как сделан split, это может быть быстрее, а может и нет:
                  function destructAndAbominate(input) {
                      return [].map.apply(input, [function (x, i) {
                          switch (i) {
                          case 0: return x.toLowerCase();
                          case input.length - 1: return x.toUpperCase();
                          default: return x;
                          }
                      }]).reverse().join("");
                  }
                  Ответить
                  • >Почему - а потому, что стандарт писалии гении, не иначе.
                    Да копировали походу с жабы.
                    В языках с немутабельными (C#, Java, js) строками широко распространён такой алгоритм - скопируй в мутабельное, поменяй как тебе надо, и преврати обратно в строку.
                    Ответить
                    • Ну тут же ситуация немного другая. В Яве / Сишарпе навелосипедить reverse какой нужно - по производительности он будет такой же, как и встроеный, а в ж.скрипте ректально накажут. При этом интерфейс у разных коллекций разный. Не смотря на то, что методы "массива" применимы к строкам, напрямую их нельзя вызывать, кроме indexOf, slice, lastIndexOf (опять же, ректальное наказание за apply / call). Часть методов применимых к коллекциям возвращает копии, а часть мутирует. Особенно уебищны pop и shift которые возвращают длину "массива". Еще ни разу не видел, чтобы кто-то пользовался возвращаемыми значениями. Всякие map, filter, any и т.д. вызывают функции с ненужными аргументами и не применимы к больше чем одной коллекции одновременно.
                      Вобщем, хз. откуда они так копировали, но либо потеряли много по дороге, либо придумали лишнего.
                      Ответить
                      • >В Яве / Сишарпе навелосипедить reverse какой нужно - по производительности он будет такой же, как и встроеный
                        Не совсем. Встроенный обращается к массиву напрямую, а самописный через полиморфные методы (charAt, length) с проверками диапазоном.
                        Конечно --server заинлайнит методы, и уберет проверки, и тогда скорость будет такой же.
                        Но это только --server.
                        Ответить
      • In [51]: "Asd"[::-1].capitalize()
        Out[51]: u'Dsa'

        Соснули все.
        Ответить
        • wtf?
          Ответить
          • Пайтон.
            Ответить
            • И все таки wtf!?
              Ответить
              • Питоньи слайсы умеют не только в [begin:end], но и в [begin:end:step]. Если мы возьмем всю строку с шагом -1 - получим перевернутую строку.
                Ответить
                • wtf? Если вышеприведенный код это питон, то я начну его учить только под страхом пыток. Абсолютно нечитабельная хрень, а если программист работает в команде, то читабельность кода не последняя вещь о которой стоит задумываться. Обратите внимание на код Java или C# и вы поймете о чем я говорю.
                  Ответить
                  • "Asd"[::-1].capitalize()
                    Вот это питон. Остальное - выхлоп интерактивной консольки. Что тут непонятного то, если знать что такое слайсы (ну кроме непривычного отрицательного шага, который редко кто юзает)?

                    Слайсы работают примерно так:
                    s[0] - нулевой символ строки (или элемент списка)
                    s[-2] - предпоследний символ строки
                    s[1:5] - символы с первого по четвертый (правая граница не включительно)
                    s[0:5:2] - 0 и 2 и 4 символы
                    Ответить
                    • Почитайте на досуге http://en.wikipedia.org/wiki/Concept_programming это поможет Вам понять мою мысль
                      Ну или вот это http://martinfowler.com/bliki/SyntacticNoise.html
                      Ответить
                      • > Concept Programming
                        > Syntactic Noise
                        Ну с этой точки зрения мусора в питоне на порядки меньше, чем в тех же шарпе и крестах (а тем более во всяких ruby). Так что мысль не понял, поясните ;)
                        Ответить
                        • Ок. Возможно это не совсем подходящий термин. Я о том, что код, который содержит несемантические элементы трудно читаем. Я могу спокойно прочитать незнакомый код на Java и примерно понять, что там делается - при этом я не знаю Java. Но когда я читаю код скажем на PHP, для меня многое может быть непонятно, из-за множества глобальных функций не привязанных ни к каким неймспейсам, да еще и с идентификаторами являющимися сокращениями аля Сишка. И тут дело даже не в языке программирования, а в стиле самого программиста. Но язык программирования (первый или тот который любимый) совершенно точно откладывает отпечаток как на стиле программирования, так и на образ мышления как программиста.
                          Ответить
                          • > Я о том, что код, который содержит несемантические элементы трудно читаем.
                            Ну все-таки не стоит судить о питоне по одной (к тому же очень редко встречающейся) строчке... Сам язык очень простой. Кроме этих слайсов и упоротого тернарника я там никаких синтаксических извращений не заметил. Нормальный код на питоне отлично читается.

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

                            > PHP
                            А вот в php именование реально бесит. Например там есть забавная функция parse_str(), которая... парсит query string'и вида "foo=bar&baz=zzz&answer=42". В питоне с именованием на порядок лучше, но, к сожалению, дурацкие названия и сокращения тоже встречаются.
                            Ответить
                          • Какой павлин-мавлин, какие несемантические элементы? О какой семантике идет речь? (их как минимум есть три разных подхода). Шум не возможен в синтаксисе ЯП, т.как это просто очень не выгодно с точки зрения парсера. По крайней мере синтаксического шума в ЯП не бывает (иначе мы бы писали программы которые бы компилировались не всегда изза того, что компилятор не смог разобрать исходный текст).
                            Ответить
                          • >Я о том, что код, который содержит несемантические элементы трудно читаем.
                            Трудно объяснить сишко/крестоблядям что всякие значки, особенно когда в разных частях кода они значат СОВЕРШЕННО разное - плохо. Скобочки: каст и приоритет операторов, больше/меньше: крестошаблон, сдвиг, вывод в поток, и собственно сравнение, двоеточие: наследование, тернарник и неймспейс, & и *: указатели, ссылки и операции между числами. [] - массивы и лямбды. Про {} молчу - пиздец.
                            Вот неплохая подборочка от ЛишпГумно:
                            http://govnokod.ru/12488
                            http://govnokod.ru/13344

                            иллюстрирующая апофеоз ебанутости сиплюструпа.

                            Плохо изучать, плохо читать, плохо гуглить что же это за тайные знаки.
                            Ну в пейсоне там действительно мало такого, [::] практически исключение.
                            За это люблю старый-добрый жс (до ебанутых нововведений) - всяких разных значков там абсолютный минимум.
                            Ответить
                        • Первый раз слышу о мусоре в ruby
                          Ответить
    • > split('').reverse().join(''),
      > recursion
      И запомните - самый эффективный код, зачастную самый простой
      http://jsperf.com/string-reverse-compare
      Или тупая императивщина побеждает всегда:
      var new_str = "";
         for (var i = str.length - 1; i >= 0; i--) new_str += str.charAt(i);
         return new_str;

      Тупо до горя, даже без обменов - как бы написал я.
      Ответить
      • На больших строках это будет плохим вариантом изза большого количества сложений строк. Нормальная реализация join сначала выделит сколько нужно памяти и создаст строку один раз, вместо Н строк разного размера. Но это уже мелочи.

        Жопа в том, что в ж.скрипте reverse деструктивный, и поэтому его нельзя применить к немутабельным строкам. Почему - а потому, что стандарт писалии гении, не иначе.
        Ответить
        • >в ж.скрипте reverse деструктивный, и поэтому его нельзя применить к немутабельным строкам. Почему - а потому, что стандарт писалии гении, не иначе.
          На самом деле с точки байтоебства десруктивный реверс есть хорошо.
          Ответить
          • Нет, в смысле, нельзя так: [].reverse.apply("foo", []); - расскажет о том, что строки не мутабельные.
            Ответить
    • в страных крестах и то лучше выглядит
      template <typename Char, typename Traits>
      void reverse_capitalize(std::basic_string<Char, Traits> &s)
      {
          if (s.empty()) return;
          std::locale loc;
          std::reverse(s.begin(), s.end());
          for (auto &c : s) c = std::tolower(c, loc);
          s[0] = std::toupper(s[0], loc);
      }
      Ответить

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