shCoc/NhN/zhNm>o_/zZSzdUz
Verwendet einen völlig neuen Algorithmus, der von dieser Antwort inspiriert ist .
(implicit) z = input()
(implicit) print
s combine list of strings into one string
h first list in
C matrix transpose of (e.g. first characters in first list, etc.)
o order_by(lambda N:
c float_div(
/NhN N.count(N[0]),
/zhN z.count(N[0])),
m map(lambda d:
> slice_head(
o order_by(lambda Z:
_/zZ -1*z.count(Z),
Sz sorted(z)),
d d),
Uz range(len(z))
Schritt für Schritt:
Zuerst haben wir die Zeichen nach ihrer Häufigkeit sortiert und die Verbindungen alphabetisch getrennt. Das ist o_/zZSz. oist dasselbe wie bei Python sorted(<stuff>,key=<stuff>), mit einem Lambda-Ausdruck für den Schlüssel, außer dass er als Zeichenfolge beibehalten wird.
Dann generieren wir eine Liste der Präfixe dieses Strings von Länge len(z)zu Länge 1. >Entspricht Pythons <stuff>[<int>:].
Anschließend ordnen wir diese Liste der Präfix-Zeichenfolgen nach der Bruchstelle des ersten Zeichens des Präfixes auf dem in der Frage gezeigten rechteckigen Layout neu an, wobei 0 der linke Rand und 1 der rechte Rand ist. /NhNZählt, wie oft das erste Zeichen im Präfix im Präfix vorkommt, während /zhNdie Anzahl der Vorkommen des ersten Zeichens im Präfix in der Zeichenfolge als Loch angegeben wird. Dies weist jedem Präfix, das von jedem Zeichen in einer Gruppe angeführt wird, einen anderen Bruch zu, von 1/kdem am weitesten rechts liegenden Vorkommen dieses Zeichens bis k/kzum am weitesten links liegenden. Wenn Sie die Präfixliste nach dieser Nummer neu ordnen, erhalten Sie die entsprechende Position im Layout. Die Aufteilung der Krawatten erfolgt nach der vorherigen Reihenfolge, die zuerst gezählt und dann nach Wunsch alphabetisch sortiert wurde.
Schließlich müssen wir das erste Zeichen aus jeder Präfixzeichenfolge extrahieren, sie zu einer einzelnen Zeichenfolge kombinieren und sie ausdrucken. Extrahieren der ersten Zeichen ist hC. CFührt eine Matrixtransponierung für die Liste durch. zip(*x)Tatsächlich hextrahiert Python 3. die erste Zeile der resultierenden Matrix. Dies ist tatsächlich die einzige Zeile, da das Vorhandensein des 1-Zeichen-Präfix verhindert, dass andere vollständige Zeilen gebildet werden. sfasst die Zeichen in diesem Tupel zu einer einzigen Zeichenfolge zusammen. Drucken ist implizit.
Prüfung:
$ pyth -c 'shCoc/NhN/zhNm>o_/zZSzdUz' <<< 'oroybgrbbyrorypoprr'
rorbyroprbyorrobypg
Inkrementelle Programmteile zu oroybgrbbyrorypoprr:
Sub-Piece Output
Sz bbbgoooopprrrrrryyy
o_/zNSz rrrrrroooobbbyyyppg (uses N because o uses N on first use.)
m>o_/zNSzdUz ['rrrrrroooobbbyyyppg', 'rrrrroooobbbyyyppg', 'rrrroooobbbyyyppg', 'rrroooobbbyyyppg', 'rroooobbbyyyppg', 'roooobbbyyyppg', 'oooobbbyyyppg', 'ooobbbyyyppg', 'oobbbyyyppg', 'obbbyyyppg', 'bbbyyyppg', 'bbyyyppg', 'byyyppg', 'yyyppg', 'yyppg', 'yppg', 'ppg', 'pg', 'g']
oc/NhN/zhNm>o_/zZSzdUz ['roooobbbyyyppg', 'obbbyyyppg', 'rroooobbbyyyppg', 'byyyppg', 'yppg', 'rrroooobbbyyyppg', 'oobbbyyyppg', 'pg', 'rrrroooobbbyyyppg', 'bbyyyppg', 'yyppg', 'ooobbbyyyppg', 'rrrrroooobbbyyyppg', 'rrrrrroooobbbyyyppg', 'oooobbbyyyppg', 'bbbyyyppg', 'yyyppg', 'ppg', 'g']
Coc/NhN/zhNm>o_/zZSzdUz [('r', 'o', 'r', 'b', 'y', 'r', 'o', 'p', 'r', 'b', 'y', 'o', 'r', 'r', 'o', 'b', 'y', 'p', 'g')]
shCoc/NhN/zhNm>o_/zZSzdUz rorbyroprbyorrobypg
Alte Antwort:
ssCm*+t*u*G/zHS{-zd1]kd/zdo_/zNS{z
Dieses Programm berechnet, wie oft eine bestimmte Unterliste repliziert werden muss. Die Unterliste sieht aus wie ['', '', '', '', ... , 'r']. Die Gesamtlänge dieser Unterliste ergibt sich aus der Häufigkeit aller anderen Bonbons u*G/zHS{-zd1. Die vollständige Unterliste wird erstellt, indem die Liste der leeren Zeichenfolge so oft wie möglich repliziert ]kund anschließend ein Element mit entfernt tund der Bonbonname am Ende mit hinzugefügt wird +d.
Diese Unterliste wird dann so oft repliziert, wie diese Süßigkeit in der Eingabe gefunden wird /zd, um sicherzustellen, dass die Liste jeder Süßigkeit gleich lang ist.
Mit dieser Funktion, die in der richtigen Reihenfolge ( o_/zNS{z) auf alle eindeutigen Bonbons abgebildet wird , haben wir ein Rechteck, das dem in der Frageanweisung ähnelt, aber leere Zeichenfolgen anstelle von Punkten enthält. Wenn Sie eine Matrixtransponierung ( C) gefolgt von zwei Summierungen ( ss) durchführen, erhalten Sie die endgültige Zeichenfolge.
Nachprüfung:
$ pyth programs/candy.pyth <<< 'oroybgrbbyrorypoprr'
rorbyroprbyorrobypg