ЙажаСценарий / Говнокод #16031 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 gost, (Updated )

Комментарии (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.
                      Ответить
            • Питоньи слайсы умеют не только в [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 символы
                  Ответить
                    • > 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

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

                          Плохо изучать, плохо читать, плохо гуглить что же это за тайные знаки.
                          Ну в пейсоне там действительно мало такого, [::] практически исключение.
                          За это люблю старый-добрый жс (до ебанутых нововведений) - всяких разных значков там абсолютный минимум.
                          Ответить
  • > 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);
    }
    Ответить

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

Помни, guest, за тобой могут следить!

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


    8