Ваш ввод будет строкой, состоящей из маленьких английских букв.
Ваша задача - определить количество различных перестановок исходной строки, которые являются палиндромом.
Входная строка содержит до 100 букв. В случае более длинной строки результат может быть очень большим, поэтому на выходе должно быть число перестановок по модулю 666013.
Например,
cababaa -> 3
Возможные перестановки:
aabcbaa
abacaba
baacaab
Это код-гольф , поэтому выигрывает самый короткий ответ!
code-golf
string
combinatorics
permutations
palindrome
Андрей Михайлеску
источник
источник
abcdabcddddd -> 120
(без подсчета нечетных символов) ,abcdabcdddddd -> 120
(подсчет одного нечетного символа) ,abcdabcddddddeee -> 0
( подсчет двух нечетных символов) ,aabbccddeeffgghhiijj -> 298735
(зависит от модуля) .Ответы:
Брахилог (2), 15 байт
Попробуйте онлайн!
объяснение
источник
05AB1E ,
171613 байт-1 байт от Джонатона Аллана
-3 байта от Эминьи и Аднана
Объяснение:
Попробуйте онлайн!
источник
E›j
представляет цифры,[14, 116, 45]
которые преобразованы из базы214
, и становится14*214^2 + 116*214 + 45 = 666013
. Я не совсем уверен, где ссылка для цифр, но они, кажется, соответствуют (ish?) Их порядку на информационной странице . @Аднан может просветить нас.œÙvyÂQ}O•E›j•%
œÙvyÂQO•E›j•%
.Perl 6 ,
1041088884 байтаПопробуйте онлайн!
Как это устроено
Я не могу легко сгенерировать все перестановки и отфильтровать их, даже если разрешено астрономическое время выполнения, потому что встроенный в Perl 6
permutations
обычная процедура прямо отказывается переставлять списки из более чем 20 элементов, а описание задачи требует ввода до 100 персонажи.Поэтому вместо этого я использую прямую формулу, основанную на буквенных частотах ввода:
Вспомогательная функция, которая делит число пополам и округляет его до ближайшего целого числа, а затем принимает его факториал.
Подсчитайте частоты букв во входной строке и сделайте их темой для остальной части кода. Например, для ввода
abcdabcdddddd
это будет список(2, 2, 2, 7)
.Если имеется более одной нечетной буквенной частоты, умножьте результат на ноль, потому что в этом случае палиндромы невозможны.
Вычислите количество возможных перестановок символов, которые будут на «одной стороне» каждого палиндрома (что соответствует мультимножеству с кратностями, полученными путем деления пополам и сложения частот входных букв) . Используемая формула взята из этого PDF :
(n 1 + ... + n k )! / (n 1 ! ⋅ ... ⋅n k 1)
Например, для входных буквенных
(2,2,2,7)
букв буквы на одной стороне палиндрома образуют мультимножество с кратностями(1,1,1,3)
, и, таким образом, число перестановок равно(1+1+1+3)! / (1!⋅1!⋅1!⋅3!) = 120
.Взять результат по модулю 666013.
источник
Python3,
8180 байтЭто самое короткое, что я мог придумать. Не уверен, что перестановки могут быть созданы легче ...
объяснение
Примечания
a==a[::-1]
возвращает логическое значение, ноsum(...)
функция неявно преобразует его в целое число (0 или 1) и суммирует соответственно.permutations(...)
. В противном случае набор ({...}
) будет содержать только один элемент, сам объект.{...}
), чтобы хранить только различные перестановки внутри.В Floroid это (почти)
z(T(a==aDKaIW(cb(L)))%666013)
, но вместо этого печатает результат и получает ввод через командную строку.Спасибо @Jonathan Allan за сохранение байта! -> поменял
import
стильПопробуйте онлайн!
источник
Желе , 13 байт
Попробуйте онлайн!
Как?
Грубый форсер.
Я полагаю, что это сделает это более эффективно, но это 30 байтов (правка: этот PDF, кажется, подтверждает это, любезно предоставив ответ smls ):
источник
%
мод.Œ!QŒḂ€S%“µɲ€’
. Это выглядит идентично для меня.Mathematica, 46 байт
Принимает список символов в качестве входных данных.
Ужасно неэффективно, потому что фактически генерирует все перестановки входных данных, а затем подсчитывает палиндромные.
источник
0
, если строка состоит из нескольких букв, встречающихся с нечетной кратностью (как"abcdabcddddddeee"
).Mathematica, 68 байт
Чистая функция, принимающая список символов в качестве входных данных и возвращающая целое число. Не такой короткий, как ответ Mathematica Мартина Эндера , но, тем не менее, это симпатичный подход, который, похоже, такой же, как и в ответе Perls 6 от smls .
Во-первых,
t=Last/@Tally@#/2
вычисляется количество всех различных символов на входе, разделенное на2
; затемi=Floor
округляет все дроби, встречающиеся вt
. Обратите внимание, что палиндромные перестановки входных данных существуют именно тогда, когда среди исходных отсчетов не более одного нечетного числа, то есть, когда вt
. Мы можем проверить это, просто сложив все элементыt-i
(используяTr
): если ответ меньше чем1
, существуют палиндромные перестановки, в противном случае нет.Если есть, то
i
представляет количество различных символов в левой половине перестановок, которые могут быть расположены произвольно. Число способов сделать это - это как разMultinomial
коэффициент (фактор определенных факториалов), который встроен в Mathematica.источник
к, 23 байта
Если вы используете ОК или
cmb
не существует, используйтеprm
вместоcmb
.источник
Pyth - 15 байт
Попробуйте это онлайн здесь .
источник
C ++ 14, 161 байт
В качестве неназванной лямбды предполагается, что ввод подобен
std::string
и возвращается через опорный параметр.Ungolfed и использование:
источник
Рубин,
67575259 символовисточник
->s{ }
, не так ли?(s.size)
аргумент избыточным?.to_a
.undefined method
uniq 'для # <Enumerator`), но верно, работает на ruby 2.4, спасибо :)mod 666013
?Japt ,
2018 байтСохранено 2 байта благодаря ETHproductions.
Попробуйте онлайн!
источник
f_¥Zw}
, как_
сокращенноZ{Z
á fêS â l %666013
спас бы тебя байт.MATL, 13 байт
Попробуйте это на MATL Online
объяснение
источник
CJam , 19 байтов
Попробуйте онлайн!
Объяснение:
источник
Ом 17 байт
Объяснение:
источник
PHP, 182 байта
Онлайн версия
Сломать
источник