Twój tekst będzie ciągiem składającym się z małych angielskich liter.
Twoim zadaniem jest określenie liczby różnych kombinacji pierwotnego ciągu znaków, które są palindromem.
Ciąg wejściowy ma do 100 liter. W przypadku dłuższego ciągu wynik może być bardzo duży, więc wynikiem powinna być liczba permutacji modulo 666013.
Na przykład,
cababaa -> 3
Możliwe kombinacje to:
aabcbaa
abacaba
baacaab
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź!
code-golf
string
combinatorics
permutations
palindrome
Andrei Mihailescu
źródło
źródło
abcdabcddddd -> 120
(brak liczby nieparzystych znaków) ,abcdabcdddddd -> 120
(liczba nieparzystych znaków) ,abcdabcddddddeee -> 0
(liczba dwóch nieparzystych znaków) ,aabbccddeeffgghhiijj -> 298735
(wpływ modulo) .Odpowiedzi:
Brachylog (2), 15 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
05AB1E ,
171613 bajtów-1 bajt od Jonathona Allana
-3 bajty od Emigny i Adnana
Wyjaśnienie:
Wypróbuj online!
źródło
E›j
reprezentuje cyfry[14, 116, 45]
przekonwertowane z bazy214
i staje się14*214^2 + 116*214 + 45 = 666013
. Nie jestem do końca pewien, gdzie znajdują się odniesienia do cyfr, ale wydaje się, że są one zgodne (ich?) Z ich kolejnością na stronie informacyjnej . @Adnan może nas oświecić.œÙvyÂQ}O•E›j•%
œÙvyÂQO•E›j•%
.Perl 6 ,
1041088884 bajtówWypróbuj online!
Jak to działa
Nie mogę z łatwością generować wszystkich permutacji i filtrować ich, nawet jeśli dozwolone są astronomiczne czasy działania, ponieważ wbudowana
permutations
rutynowa procedura Perla 6 odmawia permutacji list zawierających więcej niż 20 elementów, a opis zadania wymaga danych wejściowych do 100 postacie.Zamiast tego używam bezpośredniej formuły opartej na częstotliwościach liter wejściowych:
Funkcja pomocnicza, która zmniejsza liczbę o połowę i zaokrągla ją do najbliższej liczby całkowitej, a następnie przyjmuje silnię tego.
Zsumuj częstotliwości liter w ciągu wejściowym i uczyń je tematem pozostałej części kodu. Np. Dla danych wejściowych
abcdabcdddddd
będzie to lista(2, 2, 2, 7)
.Jeśli występuje więcej niż jedna częstotliwość nieparzystej litery, pomnóż wynik przez zero, ponieważ w takim przypadku nie są możliwe palindromy.
Oblicz liczbę możliwych kombinacji znaków, które będą po „jednej stronie” każdego palindromu (co odpowiada wielokrotności z wielokrotnościami uzyskanymi przez zmniejszenie o połowę i wyrównanie częstotliwości liter wejściowych) . Zastosowana formuła pochodzi z tego pliku PDF :
(n 1 + ... + n k )! / (n 1 ! ⋅ ... ⋅n k 1)
Np. dla częstotliwości liter wejściowych
(2,2,2,7)
litery po jednej stronie palindromu tworzą zbiór wielokrotny z mnożnikami(1,1,1,3)
, a zatem liczba permutacji jest taka(1+1+1+3)! / (1!⋅1!⋅1!⋅3!) = 120
.Weź wynik modulo 666013.
źródło
Python3,
8180 bajtówTo najkrótszy, jaki mogłem wymyślić. Nie jestem pewien, czy permutacje można łatwiej wygenerować ...
Wyjaśnienie
Notatki
a==a[::-1]
zwraca wartość logiczną, alesum(...)
funkcja domyślnie rzuca ją na liczbę całkowitą (0 lub 1) i odpowiednio sumuje.permutations(...)
. W przeciwnym razie set ({...}
) zawierałby tylko jeden element, sam obiekt.{...}
), aby zachować w środku tylko wyraźne kombinacje.W Floroid jest to (prawie)
z(T(a==aDKaIW(cb(L)))%666013)
, ale zamiast tego wypisuje wynik i pobiera dane z wiersza poleceń.Dzięki @Jonathan Allan za uratowanie bajtu! -> Zmieniłem
import
stylWypróbuj online!
źródło
Galaretka , 13 bajtów
Wypróbuj online!
W jaki sposób?
Brutalny forcer.
I wierzę , że to zrobi to sprawniej, ale to 30 bajtów (edit: to pdf wydaje się to potwierdzać, dzięki uprzejmości odpowiedzi SML koszulka ):
źródło
%
jest mod.Œ!QŒḂ€S%“µɲ€’
. To wygląda tak samo jak ja.Mathematica, 46 bajtów
Pobiera na wejściu listę znaków.
Strasznie nieefektywny, ponieważ faktycznie generuje wszystkie permutacje danych wejściowych, a następnie liczy palindromiczne.
źródło
0
, jeśli ciąg ma wiele liter występujących z nieparzystą wielokrotnością (jak"abcdabcddddddeee"
).Mathematica, 68 bajtów
Czysta funkcja pobierająca listę znaków jako dane wejściowe i zwracająca liczbę całkowitą. Nie tak krótki, jak odpowiedź Mathematica Martina Endera , ale mimo to jest to urocze podejście, które wydaje się takie samo, jak w odpowiedzi na perl 6 smls .
Najpierw
t=Last/@Tally@#/2
oblicza liczbę wszystkich różnych znaków na wejściu, podzieloną przez2
; następniei=Floor
zaokrągla wszystkie ułamki występujące wt
. Zauważ, że palindromiczne permutacje danych wejściowych istnieją dokładnie wtedy, gdy wśród pierwotnych zliczeń występuje co najwyżej jedna liczba nieparzysta, to znaczy, gdy występuje co najwyżej jedna częśćt
. Możemy to sprawdzić, po prostu dodając wszystkie elementyt-i
(używającTr
): jeśli odpowiedź jest mniejsza niż1
, istnieją kombinacje palindromiczne, w przeciwnym razie nie.Jeśli tak,
i
oznacza liczbę różnych znaków w lewej połowie permutacji, które można dowolnie ustawić. Liczba sposobów, aby to zrobić, to dokładnieMultinomial
współczynnik (iloraz niektórych silni), który ma wbudowana Mathematica.źródło
k, 23 bajty
Jeśli używasz OK lub
cmb
nie istnieje, użyjprm
zamiastcmb
.źródło
Pyth - 15 bajtów
Wypróbuj online tutaj .
źródło
C ++ 14, 161 bajtów
Ponieważ nienazwana lambda zakłada, że dane wejściowe są podobne
std::string
i zwracane przez parametr referencyjny.Niegolfowane i użytkowanie:
źródło
Ruby,
67575259 znakówźródło
->s{ }
, prawda?(s.size)
argument nie jest zbędny?.to_a
.undefined method
uniq 'dla # <Enumerator`), ale dobrze działa na Ruby 2.4, dzięki :)mod 666013
?Japt ,
2018 bajtówZaoszczędzono 2 bajty dzięki produktom ETH.
Wypróbuj online!
źródło
f_¥Zw}
, jak_
to jestZ{Z
á fêS â l %666013
zaoszczędzi ci bajt.MATL, 13 bajtów
Wypróbuj w MATL Online
Wyjaśnienie
źródło
CJam , 19 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
Ohm, 17 bajtów
Wyjaśnienie:
źródło
PHP, 182 bajtów
Wersja online
Awaria
źródło