Ваша задача - определить, насколько идеальным является палиндром струны. Ваш типичный палиндром (например, 12321) - идеальный палиндром; его совершенство равно 1.
Чтобы определить идеальность строки, вы видите, сколько разделов вы можете разбить на те, где каждый раздел является палиндромом. Если есть неоднозначности, например, с aaaa
, как вы можете разделить его на [aa, aa]
или [aaaa]
или [a, aaa]
или [aaa, a]
, самый короткий набор будет переопределен, давая aaaa
оценку 1, который является длиной самого короткого набора.
Следовательно, вы должны написать программу или функцию, которая будет принимать один непустой ввод и выводить, насколько он совершенен (длина самого короткого набора, на который вы можете разбить его, где каждый элемент в наборе является палиндромом).
Примеры:
1111 -> 1 [1111]
abcb -> 2 [a, bcb]
abcbd -> 3 [a, bcb, d]
abcde -> 5 [a, b, c, d, e]
66a -> 2 [66, a]
abcba-> 1 [abcba]
x -> 1 [x]
ababacab -> 2 [aba, bacab]
bacababa -> 2 [bacab, aba]
26600 -> 3 [2, 66, 00] [my user id] [who has a more perfect user id?]
ababacabBACABABA -> 4 [aba, bacab, BACAB, ABA]
Обратите внимание, что в примерах ничего в квадратных скобках не должно быть частью вывода.
ababacab
и наоборот,bacababa
кажется, хорошие тестовые случаи.ababacabBACABABA
также хороший тестовый пример (некоторые ответы на него не срабатывают).Ответы:
Брахилог , 7 байт
Попробуйте онлайн!
объяснение
источник
Желе ,
131211 байтПопробуйте онлайн!
Спекуляции
"ababacab"
(как аргумент)2
источник
"\"
, потому что это неверный синтаксис.ababacab
и наоборотbacababa
.Pyth, 9 байт
Тестирование
Это формирует все разделы ввода, от самого короткого до самого длинного. Затем он фильтрует эти разбиения на инвариантность при фильтрации элементов на инвариантность при обращении. Наконец, мы берем первый элемент отфильтрованного списка разделов и возвращаем его длину.
Для того, чтобы объяснить , что сложный шаг, давайте начнем с инвариантности относительно обращения:
_I
. Это проверяет, является ли его ввод палиндромом, потому что он проверяет, меняет ли реверсирование значение.Далее, для фильтрации палиндромности:
_I#
. Это сохранит только палиндромные элементы списка.Далее мы проверяем на инвариантность относительно фильтрации для палиндромности:
_I#I
. Это верно тогда и только тогда, когда все элементы списка являются палиндромами.Наконец, мы фильтруем для списков , где все элементы списка являются палиндромов:
_I#I#
.источник
Haskell , 83 байта
Попробуйте онлайн!
Это использует отличный совет Zgarb для генерации строковых разделов .
источник
Clojure, 111 байт
Разбивается на все возможные позиции, и когда первая часть представляет собой палиндром, продолжается поиск разбиения для оставшейся части строки.
Попробуйте онлайн .
Ungolfed, использует последний макрос потока
->>
.Неизвестная версия, пожалуйста, не пишите такой код: D
источник
f
должна называть себя внутри для:(f b)
. Вы можете использовать позицию «хвостовой колл»recur
.defn
наfn
и просто иметь функцию.(fn f[s]( ... ))
? О, правда. Вы сохраняете 2 символа с этим.JavaScript (ES6),
143126124 байтСохранено 2 байта благодаря Нейлу
Вдохновленный методом NikoNyrh .
Отформатировано и прокомментировано
Контрольные примеры
Показать фрагмент кода
Исходный подход,
173168 байтДовольно длинная рекурсивная функция, которая вычисляет все возможные разделы входной строки.
Отформатировано и прокомментировано
Контрольные примеры
Показать фрагмент кода
источник
,p=0
,s[p++]?
и,F(s,i,p)
.Желе , 10 байт
Попробуйте онлайн!
Как?
Используется тот факт, что
[0]<[0,0]<[0,0,0],...,<[0,...,0,1]<...
- таким образом, если мы сортируем разделы по ключу «не палиндромно для каждой части», первая запись будет палиндромной и минимальной длины.
Примечание: любая непустая строка длины n всегда приводит к такому ключу с n нулями, поскольку все строки длины 1 являются палиндромными.
источник
Haskell , 69 байт
Определяет функцию
f
. Попробуйте онлайн!объяснение
Вспомогательная функция infix
x ! y
вычисляет список целых чисел, которые являются длинами некоторых разбиенийreverse x ++ y
на палиндромы, где ониreverse x
остались нетронутыми. Гарантируется, что длина минимального разбиенияy
будет непустой. Как это работает?y
не пусто, с него извлекается символ и проталкивается в негоx
. Еслиx
становится палиндромом, мы вызываем основную функциюf
на хвостеy
и добавляем 1 к учетной записиx
. Также мы призываем!
к новомуx
иy
не пропускаем ни одного потенциального раскола.y
пусто, мы возвращаем[0]
(одно разбиение длины 0), еслиx
также пусто, и[]
(без разбиения) в противном случае.Основная функция
f
просто вызывает"" ! x
и принимает минимум результатов.источник
JavaScript (Firefox 30-57), 97 байт
Порт ES6:
Это кажется таким простым решением, что я продолжаю думать, что что-то забыл, но оно, по крайней мере, проходит все контрольные тесты.
источник
Haskell,
139116109 байтВсе еще зеленый в игре в гольф на Haskell, но это моя лучшая попытка, которую я могу придумать быстро.
(and.map r)
для удаления подсписков, которые не содержат палиндрома, и в этом случае длина списка применяется к списку, а затем результат отсортировано, чтобы мы могли взять голову, которая является ответом.Я думал, что лучший ответ мог бы использовать недетерминированную природу списков в Haskell с помощью использования Applicatives. Можно было бы сократить количество байтов функции h с помощью аппликативов, даже если нам нужно импортировать Control.Applicative. Комментарии для улучшения приветствуются.
Update1
Огромная экономия на основе напоминания Лайкони о минимальной функции. Удаление сортировки фактически позволило мне удалить импорт Data.List, потому что минимум определен в Prelude!
UPDATE2
Благодаря предложению nimi об использовании списочных представлений в качестве полезной замены для filter.map. Это спасло мне несколько байтов. Также я позаимствовал аккуратный трюк с разделом String из ответа Laikonis и также сохранил там пару байтов.
источник
h []=[[]]
иh (x:y)=map ([x]:)
содержат ненужные пробелы.head.sort
естьminimum
.filter
иmap
:g x=head$sort[length y|y<-h x,and$r<$>y]
.PHP, 319 байт
Онлайн версия
расширенный
Более длинная версия без E_NOTICE и вывод результирующего массива
источник
ababacabBACABABA