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. ojest 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. /NhNzlicza, ile razy pierwszy znak w prefiksie występuje w prefiksie, a jednocześnie /zhNpodaje 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/kskrajnego prawego wystąpienia tego znaku do k/kskrajnego 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. Cwykonuje transpozycję macierzy na liście, faktycznie zip(*x)w Pythonie 3. hwyodrębnia pierwszy wiersz wynikowej macierzy. Jest to właściwie jedyny wiersz, ponieważ obecność prefiksu 1 znaku uniemożliwia utworzenie innych kompletnych wierszy. ssumuje 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, ]kwiele razy, a następnie usuwanie i wstawianie toraz 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, /zdzapewniają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