Корінчасті паліндроми


15

Паліндроми - це весело, але деякі інші струни починають відчувати себе опущеними. Ми можемо перетворити ці рядки в кучеряві паліндроми , розділивши їх на паліндромні масиви шматочків.

Наприклад, рядок "abcabca"не є паліндром, якщо ми читаємо її символом за символом, але у нас є три різні способи зробити її здоровенним паліндром:

["abcabca"]
["a" "bcabc" "a"]
["a" "bc" "a" "bc" "a"]

Як бачите, прискіплива паліндромність - це дуже інклюзивна концепція; кожну струну можна перетворити на прискіпливий паліндром хоча б одним способом.

Завдання

Напишіть програму або функцію, яка отримує рядок як вхідний і повертає її паліндромну чіткість , тобто кількість його розділів, які є паліндромними масивами.

Тестові справи

 OUTPUT | INPUT
--------+---------------------------------------------
      1 | ""                                          
      1 | "a"                                         
      1 | "ab"                                        
      2 | "aa"                                        
      2 | "aaa"                                       
      3 | "abcabca"                                   
      4 | "abababab"                                  
     28 | "abcabcaabababababcabca"                    
      1 | "bbbbabababbbbababbbaaaaa"                  
     20 | "ababbaaaabababbbaaabbbaa"                  
      5 | "baaabaabababaababaaabbaab"                 
     62 | "bbaaababbabbabbbabaabaabb"                 
      2 | "a man a plan a canal panama"               
     25 | "ama nap lan aca nal pan ama"               
     93 | "SATOR   AREPO   TENET   OPERA   ROTAS"     
    976 | "abcabcaabcabcaabcabcaabcabcaabcabcaabcabca"
  28657 | "ababababababababababaababababababababababa"
2097152 | "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"

Додаткові правила

  • Ви можете припустити, що вхід буде складатися з 42 або менших символів для друку ASCII, необов'язково оточених строковими роздільниками вашої мови та / або супроводжується новим рядком.

  • Для кожного дійсного рядка введення ваш код повинен закінчитися менше ніж за одну хвилину на моїй машині (Intel Core i7-3770, 16 Гб оперативної пам’яті, Fedora 21).

    При адекватному алгоритмі слід дотримуватися цього часового обмеження. Однак, швидше за все, ви не зможете повторити всі розділи вхідного рядка.

  • Якщо ви вирішили надрукувати вихід на STDOUT, за ним може пройти один новий рядок.

  • Діють стандартні правила .

Відповіді:


4

Pyth, 40 34 27 22 байт

Lhsmy:bd_df!xb>TbS/lb2

Спробуйте це в онлайн-перекладачі .

Сильно гольфували від початкової версії на 40 байт. Завдяки FryAmTheEggman за вказівку на пару корисних операторів (документи важко шукати!), Які врятували мені всього 6 байт. Завдяки Деннісу за розумне збереження в одному байті, інтерпретуючи результат xяк значення truthy / false, а не індекс, !xb>Tbа не як q<bT>Tb.


Як це працює:

Ми визначаємо функцію, yяка визначає чіткість рядка bшляхом рекурсивного виклику себе на підрядках b. Функції автоматично запам'ятовуються в Pyth, тому рекурсія має дуже невеликі накладні витрати в часі.

L                              def y(b): return ___
                 S/lb2         The range [1,2,...,len(b)/2]
          f!xb>Tb              Filter n for which b[:n] == b[-n:]
   m                           Map each n in the list to...
    y:bd_d                     y(b[d:-d])       
 hs                            Take the sum and add one (implicit return)

Так, більшість з вивчення Pyth - це комунальне / пробне та помилкове / читання лексема, хороша робота з гольфом набагато більше! :)
FryAmTheEggman

1
1. Ви можете зберегти два байти, подавши функцію. Не потрібно з цим телефонувати yz. 2. Замість двох карт та фільтра ви могли використовувати одну карту та умовну ( посилання ), яка зберігає три байти.
Денніс

2

CJam ( 41 39 байт)

qM{_,2/,\f{\~_2$>@2$<@~)/(@=\M*j*}1b)}j

Демонстрація в Інтернеті

Це "нетерпляче" в тому сенсі, що воно знаходить кількість кустливих паліндромів для кожної "центральної" рядки (тобто результат видалення однакової кількості символів з обох кінців початкової рядки), а тому, що він використовує автоматичне запам'ятовування jкожен оператор обчислюється лише один раз, даючи дуже швидку програму (і зберігаючи кілька символів за допомогою не запам’ятованої реалізації).

Завдяки Деннісу за економію в один байт.



1

Perl, 86 байт

84 байти коду + 2 перемикача

МОЖЕ бути коротший метод, але тут йдеться:

perl -lpe 'sub c{my($x,$i)=@_;$x=~/^(.{$i})(.*)\1$/&&c($2,0*++$s)while++$i<length$x}c$_;$_=++$s'

Бере вхід зі STDIN, по одній рядку на рядок.

Пояснення. Для значень 1<=$i<length(input string)використовуйте регулярний вираз, /^(.{$i})(.*)\1$/щоб отримати лівий і правий відрізки та збільшення кроків. Потім рекурсивно робимо те ж саме для центральної частини струни.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.