Ihre Eingabe wird eine Zeichenfolge sein, die aus kleinen englischen Buchstaben besteht.
Ihre Aufgabe ist es, die Anzahl der unterschiedlichen Permutationen der ursprünglichen Zeichenfolge zu bestimmen, die ein Palindrom sind.
Die Eingabezeichenfolge enthält bis zu 100 Buchstaben. Bei einer längeren Zeichenfolge kann das Ergebnis sehr groß sein, daher sollte die Ausgabe die Anzahl der Permutationen modulo 666013 sein.
Beispielsweise,
cababaa -> 3
Die möglichen Permutationen sind:
aabcbaa
abacaba
baacaab
Das ist Code-Golf , also gewinnt die kürzeste Antwort!
code-golf
string
combinatorics
permutations
palindrome
Andrei Mihailescu
quelle
quelle
abcdabcddddd -> 120
(keine ungerade Anzahl von Zeichen) ,abcdabcdddddd -> 120
(eine ungerade Anzahl von Zeichen) ,abcdabcddddddeee -> 0
(zwei ungerade Anzahl von Zeichen) ,aabbccddeeffgghhiijj -> 298735
(beeinflusst durch das Modulo) .Antworten:
Brachylog (2), 15 Bytes
Probieren Sie es online!
Erläuterung
quelle
05AB1E ,
171613 Bytes-1 Byte von Jonathon Allan
-3 Bytes von Emigna und Adnan
Erläuterung:
Probieren Sie es online!
quelle
E›j
stellt die Ziffern dar,[14, 116, 45]
die von der Basis konvertiert werden214
, und wird14*214^2 + 116*214 + 45 = 666013
. Ich bin nicht ganz sicher, wo sich die Referenz für die Ziffern befindet, aber sie scheinen mit ihrer Bestellung auf der Infoseite übereinzustimmen . @Adnan kann uns aufklären.œÙvyÂQ}O•E›j•%
œÙvyÂQO•E›j•%
.Perl 6 ,
1041088884 BytesProbieren Sie es online!
Wie es funktioniert
Ich kann nicht einfach alle Permutationen generieren und filtern, auch wenn astronomische Laufzeiten zulässig sind, da die integrierte
permutations
Routine von Perl 6 es ablehnt, Listen mit mehr als 20 Elementen zu permutieren, und die Aufgabenbeschreibung Eingaben von bis zu 100 erfordert Zeichen.Deshalb verwende ich stattdessen eine direkte Formel, die auf den Buchstabenhäufigkeiten der Eingabe basiert:
Eine Hilfsfunktion, die eine Zahl halbiert und auf die nächste Ganzzahl abrundet und dann die Fakultät davon aufnimmt.
Zählen Sie die Buchstabenhäufigkeiten in der Eingabezeichenfolge auf und machen Sie sie zum Thema für den Rest des Codes. ZB zur Eingabe
abcdabcdddddd
wäre dies die Liste(2, 2, 2, 7)
.Wenn es mehr als eine ungerade Buchstabenfrequenz gibt, multiplizieren Sie das Ergebnis mit Null, da in diesem Fall keine Palindrome möglich sind.
Berechnen Sie die Anzahl der möglichen Permutationen der Zeichen, die sich auf "einer Seite" jedes Palindroms befinden (was einem Multiset mit den Multiplizitäten entspricht, die durch Halbieren und Untermalen der Eingangsbuchstabenfrequenzen erhalten werden) . Die verwendete Formel stammt aus diesem PDF :
(n 1 + ... + n k )! / (n 1 ! ⋅ ... ⋅n k 1)
ZB für die Eingabe von Buchstabenfrequenzen
(2,2,2,7)
bilden die Buchstaben auf einer Seite des Palindroms ein Multiset mit Multiplizitäten(1,1,1,3)
, und die Anzahl der Permutationen ist somit(1+1+1+3)! / (1!⋅1!⋅1!⋅3!) = 120
.Nehmen Sie das Ergebnis modulo 666013.
quelle
Python3,
8180 BytesDies ist das kürzeste, was ich mir vorstellen konnte. Ich bin mir nicht sicher, ob die Permutationen einfacher generiert werden können ...
Erläuterung
Anmerkungen
a==a[::-1]
gibt einen booleschen Wert zurück, der von dersum(...)
Funktion jedoch implizit in eine Ganzzahl (0 oder 1) umgewandelt und entsprechend summiert wird.permutations(...)
. Andernfalls{...}
würde set ( ) nur ein Element enthalten, das Objekt selbst.{...}
), um nur bestimmte Permutationen in mir zu behalten.In Floroid ist dies (fast)
z(T(a==aDKaIW(cb(L)))%666013)
, gibt jedoch stattdessen das Ergebnis aus und nimmt Eingaben über die Befehlszeile entgegen.Vielen Dank an Jonathan Allan für das Speichern eines Bytes! ->
import
Stil geändertProbieren Sie es online!
quelle
Gelee , 13 Bytes
Probieren Sie es online!
Wie?
Ein roher Forcer.
Ich glaube, dass dies effizienter sein wird, aber es sind 30 Bytes (Bearbeiten: Dieses PDF scheint es zu bestätigen, dank der Antwort von smls ):
quelle
%
ist mod.Œ!QŒḂ€S%“µɲ€’
. Das sieht für mich bytewise identisch aus.Mathematica, 46 Bytes
Nimmt eine Liste von Zeichen als Eingabe.
Schrecklich ineffizient, weil es tatsächlich alle Permutationen der Eingabe generiert und dann die palindromischen zählt.
quelle
0
, wenn die Zeichenfolge mehrere Buchstaben mit ungerader Multiplizität (wie"abcdabcddddddeee"
) enthält.Mathematica, 68 Bytes
Reine Funktion, die eine Liste von Zeichen als Eingabe verwendet und eine Ganzzahl zurückgibt. Nicht so kurz wie die Mathematica-Antwort von Martin Ender , aber es ist trotzdem eine nette Herangehensweise, die dieselbe Herangehensweise zu sein scheint wie in der Perl 6-Antwort von smls .
Zuerst
t=Last/@Tally@#/2
berechnet die Zählungen aller unterschiedlichen Zeichen in der Eingabe, dividiert durch2
; danni=Floor
abrundet irgendwelche Brüche in auftretent
. Beachten Sie, dass palindromische Permutationen der Eingabe genau dann vorliegen, wenn höchstens eine ungerade Zahl unter den ursprünglichen Zählwerten vorhanden ist, dh wenn höchstens ein Bruch in vorhanden istt
. Wir können das testen, indem wir einfach alle Elemente vont-i
(usingTr
) addieren : Wenn die Antwort kleiner als ist1
, gibt es palindromische Permutationen, andernfalls nicht.Wenn
i
ja , dann repräsentiert das die Anzahl der verschiedenen Zeichen in der linken Hälfte der Permutationen, die beliebig angeordnet werden können. Die Anzahl der Möglichkeiten, dies zu tun, ist genau derMultinomial
Koeffizient (ein Quotient bestimmter Fakultäten), den Mathematica eingebaut hat.quelle
k, 23 Bytes
Wenn Sie OK verwenden oder
cmb
nicht vorhanden sind, verwenden Sieprm
anstelle voncmb
.quelle
Pyth - 15 Bytes
Probieren Sie es hier online aus .
quelle
C ++ 14, 161 Bytes
Als unbenanntes Lambda wird angenommen, dass die Eingabe wie folgt ist
std::string
und über den Referenzparameter zurückgegeben wird.Ungolfed und Nutzung:
quelle
Ruby,
67575259 Zeichenquelle
->s{ }
, nicht wahr?(s.size)
überflüssig?.to_a
.undefined method
uniq 'für # <Enumerator`), aber richtig, es funktioniert auf Ruby 2.4, danke :)mod 666013
?Japt ,
20 bis18 Bytes2 Bytes gespart dank ETHproductions.
Probieren Sie es online!
quelle
f_¥Zw}
, wie_
es kurz fürZ{Z
á fêS â l %666013
würde dir ein byte sparen.MATL, 13 Bytes
Probieren Sie es bei MATL Online aus
Erläuterung
quelle
CJam , 19 Bytes
Probieren Sie es online!
Erläuterung:
quelle
Ohm, 17 Bytes
Erläuterung:
quelle
PHP, 182 Bytes
Online Version
Nervenzusammenbruch
quelle