Erläuterung
Zwei Zeichenfolgen können gemischt werden, indem ihre Buchstaben zu einer neuen Zeichenfolge durchsetzt werden, ähnlich wie zwei Kartenstapel zu einem einzigen Stapel gemischt werden können.
Zum Beispiel können die Saiten HELLO
und WORLD
gemischt werden, um zu bilden HWEOLRLLOD
, oder HEWORLLLDO
oder vielleicht einfach HELLOWORLD
.
Es ist kein Shuffle, wenn die ursprüngliche Reihenfolge der Buchstaben nicht beibehalten wird. Zum Beispiel kann das D
In WORLD
niemals vor dem R
Nach dem Mischen erscheinen. Dies bedeutet, dass es sich EHLLOWRDLO
beispielsweise nicht um ein Mischen von HELLO
und handelt WORLD
, obwohl es alle Originalbuchstaben enthält.
Eine Saite ist eine Mischung aus Zwillingen, wenn sie durch Mischen zweier identischer Saiten gebildet werden kann. Zum Beispiel ABACBDECDE
ist ein Mischen von Zwillingen, weil es durch Mischen ABCDE
und gebildet werden kann ABCDE
. DBEACBCADE
ist kein Mischen von Zwillingen, da es nicht durch Mischen von zwei identischen Saiten gebildet werden kann.
Programmdetails
Geben Sie bei einer Eingabezeichenfolge eine Ausgabe aus, 0
wenn es sich nicht um eine Mischung aus Zwillingen handelt, und geben Sie eine der Zwillingszeichenfolgen aus, wenn es sich um eine Mischung aus Zwillingen handelt.
Sie können davon ausgehen, dass die Eingabezeichenfolge eine Länge zwischen vier und zwanzig Zeichen hat und vollständig aus alphabetischen Großbuchstaben besteht. Es sollte in einer angemessenen Zeitspanne von beispielsweise weniger als 10 Minuten ausgeführt werden können.
Dies ist Code Golf, also gewinnt die kürzeste Lösung.
Beispiel E / A.
> ABACBDECDE
ABCDE
> DBEACBCADE
0
> FFFFFF
FFF
> FFGGG
0
> ABBA
0
> AABB
AB
> AABAAB
AAB
Ich habe eine Beispielimplementierung (ohne Golf) .
quelle
that the input string has a length inclusively between four and twenty characters
und sagt mir nicht "Vertraue niemals Benutzereingaben!", "Vertraue niemals den Spezifikationen!"FFGGG
, um es konsistent zu machen.Antworten:
Haskell, 114
Ungolfed:
Erläuterung:
Der größte Teil der Arbeit wird in der
partitions
Funktion erledigt . Es funktioniert , indem rekursiv alle Partitionen erzeugen ,(a, b)
des Schwanzes der Liste, und dann mit der Liste Monade das anfängliche Element vorangestellt wirdx
zu jedem von ihnen und alle , die Ergebnisse zu sammeln.findMatch
Filtert diese Liste so, dass nur Partitionen übrig bleiben, bei denen die Teilsequenzen gleich sind. Es gibt dann die erste Teilsequenz in der ersten Partition zurück. Wenn keine mehr vorhanden ist, ist die Liste leer, sodass die"0"
am Ende angehängte Liste stattdessen zurückgegeben wird.main
Liest einfach die Eingabe, führt sie durch diese beiden Funktionen und druckt sie aus.quelle
R, 113 Zeichen
Ungolfed (und stattdessen eine Funktion, die den String übernimmt):
Die Lösung basiert auf der
combn
Funktion, die alle Kombinationen von Indizes als Spalten in einer Matrix generiert.apply
Wendet dann eine Funktion auf jede Spalte (Dimension2
) in der Matrix an und gibt einen Vektor aus Zeichenfolgen oder Nullen zurück.max
Finden Sie dann die größte Zeichenfolge (die 0 übertrumpft).Ein cooles Merkmal in R ist die Fähigkeit, eine Teilmenge eines Vektors bei einem gegebenen Vektor von Indizes auszuwählen und dann das Komplement dieser Teilmenge durch Negieren der Indizes auszuwählen :
x[i] == x[-i]
quelle
Mathematica, 87
Dies basiert direkt auf Hammars Post, ist aber hoffentlich deutlich genug, um eine Veröffentlichung zu verdienen.
Prüfung:
quelle
D.
Verwenden der ersten rekursiven Tiefensuche
Ich kann es mit einer
int i = min(a.length,b.length);if(a[0..i]!=b[0..i])return "0";
Schutzklausel schneller machenquelle
void main(){writeln(c("ABCADABCAD"));}
- nur eine andere Version von D, meine Schuld, etwas anderes? Was ist mit "ABCABCA"?Ruby, 89 Zeichen
Dieser Code implementiert einen einfachen rekursiven Suchalgorithmus. Die Eingabe muss auf STDIN erfolgen.
quelle
Perl, 68 Zeichen
Die Eingabezeichenfolge wird als in der
$_
Variablen angenommen, die Ausgabe ist der Wert des Ausdrucks. Nachgestellte Zeilenumbrüche in der Eingabe werden ignoriert. Sie können dies über die Befehlszeile wie folgt ausführen:Dieser Code verwendet die Regexp-Engine von Perl (und insbesondere die Ausführungsfunktion für eingebetteten Code ), um das Backtracking durchzuführen . Grundsätzlich wird die Eingabezeichenfolge mit dem regulären Ausdruck abgeglichen
^((.+))+$
, wobei die ungeraden und geraden Submatches in$x
und verfolgt$,
werden und die Übereinstimmung am Ende abgelehnt wird , wenn die beiden nicht gleich sind.quelle
AABAAB
?AABAAB
ist dies ein einfacher Fall für diese Lösung, da die äußere Gruppe nur zweimal übereinstimmen muss. Ich habe viel längerAABB
Python, 168 Zeichen
quelle