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
. o
ist 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. /NhN
Zählt, wie oft das erste Zeichen im Präfix im Präfix vorkommt, während /zhN
die 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/k
dem am weitesten rechts liegenden Vorkommen dieses Zeichens bis k/k
zum 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
. C
Führt eine Matrixtransponierung für die Liste durch. zip(*x)
Tatsächlich h
extrahiert 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. s
fasst 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 ]k
und anschließend ein Element mit entfernt t
und 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