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

    +4

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    function isPalindrom1(str) {
        if (str.toLowerCase().replace(/[^а-яА-ЯёЁ]/g, '') === str.toLowerCase().replace(/[^а-яА-ЯёЁ]/g, 
        '').split('').reverse().join('')) {
            return true;
         } else {
            return false;
         }
    }

    "Красиво, просто, изящно."
    h: post/351874/

    Запостил: gost, 04 Мая 2018

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

    • > "Подумав дома, у меня получилось вот так:"
      function isPalindrom(str) {
          var str = str.toLowerCase(),
                lim = str.length - 1,
                i = 0,
                j = str.length - 1;
      
          while (i <= lim) {
              if (/[^а-яА-ЯёЁ]/.test(str[i])) {
                  i += 1;
              }
              if (/[^а-яА-ЯёЁ]/.test(str[j])) {
                  j -= 1;
              }
              if (str[i] != str[j]) {
                  return false;
              }
              i += 1;
              j -= 1;
         }
         return true;
      }


      Запах сишечки!
      Ответить
      • Тот самый случай, когда отрефакторенный код хуже оригинала — больше, медленнее, криво работает для нескольких не букв подряд (запятая и пробел, к примеру) да ещё и вылетает за границу массива (если в конце какая-нибудь точка).
        Ответить
    • Какой boolshit
      P.S. palindrome
      Ответить
      • В самой статье язык такой, как будто Настенька писала, а Бормондяша исправлял, но к концу статьи устал. Там много где записано на слух (что русские, что английские названия функций, даже такое важное JS-слово require написано неправильно).
        Ответить
    • Без массивов оно пошустрей будет.
      function isPalindromNoArrays(str){
          str = str.toLowerCase().replace(/[^\w]/g,"");
          strlen = str.length;
          index = Math.floor(str.length/2);
          while (index >= 0){
             if (str.charAt(index) !== str.charAt(strlen-index-1)) return false;                       
              index--;
          }
          return true;                    
      }


      на 100 000 прогонов с фразой "Сел в озере березов лес"
      isPalindromNoArrays:281ms
      isPalindrom:408ms
      isPalindromNoArrays is faster than isPalindrom by 31%

      на 100 000 прогонов с фразой "Сел в озире березов лес" (не палиндромом)
      isPalindromNoArrays:286ms
      isPalindrom:410ms
      isPalindromNoArrays is faster than isPalindrom by 30%

      немного странно, что результат почти не изменяется, т.к. в isPalindromNoArrays операций на не палиндром выполняется меньше
      Ответить
      • продолжаем оптимизить... вынесем toLowerCase() к charAt()
        isPalindromNoArrays:283ms
        isPalindromNoArraysNoStrLowerCase:103ms
        isPalindromNoArraysNoStrLowerCase is faster than isPalindromNoArrays by 64%

        function isPalindromNoArraysNoStrLowerCase(str) {
            str = str.replace(/[^\w]/g,"");
            strlen = str.length;
            index = Math.floor(str.length/2);
            while (index >= 0){
               if (str.charAt(index).toLowerCase() !== str.charAt(strlen-index-1).toLowerCase()) return false;                       
                index--;
            }
            return true;
        }


        в сравнении с оригиналом
        isPalindromNoArraysNoStrLowerCase :113ms
        isPalindrom:423ms
        isPalindromNoArraysNoStrLowerCase is faster than isPalindrom by 73%
        Ответить
        • и наконец -))
          teststring = "Сел в озере березов лес"
          
          function isPalindromNoArrays(str){
              str = str.replace(/[^А-Яа-я]/g,"");
              strlen = str.length;
              index = (strlen - strlen % 2) / 2;
               while (index >= 0){
                 if (str.charAt(index).toLowerCase() !== str.charAt(strlen-(--index)).toLowerCase()) return false;                       
              }
              return true;                 
          }
          
          function isPalindrom(str) {
              if (str.toLowerCase().replace(/[^а-яА-ЯёЁ]/g, '') === str.toLowerCase().replace(/[^а-яА-ЯёЁ]/g, 
              '').split('').reverse().join('')) {
                  return true;
               } else {
                  return false;
               }
          }


          результат на (1 000 000) прогонов
          isPalindromNoArrays:787ms
          isPalindrom:3024ms
          isPalindromNoArrays is faster than isPalindrom by 74%
          Ответить

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