shCoc/NhN/zhNm>o_/zZSzdUz
Wykorzystuje zupełnie nowy algorytm, zainspirowany tą odpowiedzią .
(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))
Krok po kroku:
Najpierw posortowaliśmy postacie według ich pospolitości, powiązania zerwane alfabetycznie. Jest o_/zZSz
. o
jest taki sam jak Python sorted(<stuff>,key=<stuff>)
, z wyrażeniem lambda dla klucza, tyle że zachowuje go jako ciąg znaków.
Następnie generujemy listę prefiksów tego ciągu, od długości len(z)
do długości 1. >
jest równoważna pythonowi <stuff>[<int>:]
.
Następnie zmieniamy kolejność tej listy ciągów prefiksów według położenia ułamkowego, gdzie 0 oznacza lewą krawędź, a 1 prawą, pierwszego znaku prefiksu na układzie prostokątnym widocznym w pytaniu. /NhN
zlicza, ile razy pierwszy znak w prefiksie występuje w prefiksie, a jednocześnie /zhN
podaje liczbę wystąpień pierwszego znaku w prefiksie w ciągu jako dziury. Przypisuje to każdemu prefiksowi prowadzonemu przez każdą postać w grupie inną frakcję, od 1/k
skrajnego prawego wystąpienia tego znaku do k/k
skrajnego lewego. Zmiana kolejności listy prefiksów o ten numer daje odpowiednią pozycję w układzie. Więzy są zrywane przy użyciu wcześniejszego zamówienia, które najpierw było zliczane, a następnie alfabetycznie, zgodnie z życzeniem.
Na koniec musimy wyodrębnić pierwszy znak z każdego ciągu prefiksu, połączyć je w jeden ciąg i wydrukować. Wyodrębnianie pierwszych znaków to hC
. C
wykonuje transpozycję macierzy na liście, faktycznie zip(*x)
w Pythonie 3. h
wyodrębnia pierwszy wiersz wynikowej macierzy. Jest to właściwie jedyny wiersz, ponieważ obecność prefiksu 1 znaku uniemożliwia utworzenie innych kompletnych wierszy. s
sumuje znaki w tej krotce w pojedynczy ciąg. Drukowanie jest niejawne.
Test:
$ pyth -c 'shCoc/NhN/zhNm>o_/zZSzdUz' <<< 'oroybgrbbyrorypoprr'
rorbyroprbyorrobypg
Przyrostowe elementy programu na 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
Stara odpowiedź:
ssCm*+t*u*G/zHS{-zd1]kd/zdo_/zNS{z
Ten program działa na zasadzie obliczania, ile razy ma być replikowana określona lista podrzędna. Wygląda na to lista podrzędna ['', '', '', '', ... , 'r']
. Całkowita długość tej podlisty jest iloczynem liczby wystąpień wszystkich innych cukierków, to jest u*G/zHS{-zd1
. Pełna lista podrzędna jest konstruowana poprzez replikację listy pustego łańcucha, ]k
wiele razy, a następnie usuwanie i wstawianie t
oraz dodawanie nazwy cukierka na końcu za pomocą +d
.
Wtedy to sub-lista jest powtórzone tyle razy, że cukierek znajduje się w wejściu, /zd
zapewniając każdej listy cukierek jest jednakowej długości.
Teraz, gdy ta funkcja jest odwzorowana na wszystkie unikalne cukierki w odpowiedniej kolejności sortowania ( o_/zNS{z
), mamy prostokąt podobny do tego w pytaniu, ale z pustymi ciągami zamiast kropek. Wykonanie transpozycji macierzy ( C
), po której następują dwa sumy ( ss
), daje końcowy ciąg znaków.
Weryfikacja:
$ pyth programs/candy.pyth <<< 'oroybgrbbyrorypoprr'
rorbyroprbyorrobypg