shCoc/NhN/zhNm>o_/zZSzdUz
Використовує весь новий алгоритм, натхненний цією відповіддю .
(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))
Крок за кроком:
Спочатку ми сортували персонажів за їх спільністю, зв’язками, розірваними за алфавітом. Це o_/zZSz
. o
такий же, як і Python's sorted(<stuff>,key=<stuff>)
, з лямбда-виразом для ключа, за винятком того, що він зберігає його як рядок.
Тоді ми формуємо список префіксів цього рядка від довжини len(z)
до довжини 1. >
еквівалентний пітонному <stuff>[<int>:]
.
Потім ми упорядковуємо цей список рядків префіксів за дробовим розташуванням, 0 - лівий край, а 1 - правий, першого символу префікса прямокутного макета, зазначеного в питанні. /NhN
підраховує, скільки разів перший символ у префіксі зустрічається у префіксі, при цьому /zhN
дає кількість входів першого символу в префіксі в рядку як отвір. Це призначає кожному префіксу, який веде кожен символ у групі, різну частку, від 1/k
правої більшості зустрічань цього символу до k/k
більшості зліва. Упорядкування списку префіксів за цим номером надає відповідне місце в макеті. Зв'язки розриваються, використовуючи попереднє замовлення, яке спочатку було підраховано, а за алфавітом, за бажанням.
Нарешті, нам потрібно витягнути перший символ з кожної рядки префікса, об'єднати їх в один рядок та роздрукувати їх. Вилучення перших символів є hC
. C
виконує транспортування матриці за списком, фактично zip(*x)
з Python 3. h
витягує перший рядок отриманої матриці. Це насправді єдиний рядок, оскільки наявність префіксу 1 символу перешкоджає формуванню будь-яких інших повних рядків. s
підсумовує символів у цьому кортежі в один рядок. Друк неявний.
Тест:
$ pyth -c 'shCoc/NhN/zhNm>o_/zZSzdUz' <<< 'oroybgrbbyrorypoprr'
rorbyroprbyorrobypg
Додаткові твори програми про 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
Стара відповідь:
ssCm*+t*u*G/zHS{-zd1]kd/zdo_/zNS{z
Ця програма працює, обчислюючи, скільки разів повторювати певний підпис. Схожий підсклад ['', '', '', '', ... , 'r']
. Загальна довжина цього підспису - це добуток кількості зустрічей усіх інших цукерок, що є u*G/zHS{-zd1
. Повний підпис складається з реплікації списку порожнього рядка, ]k
який багато разів, потім видаляючи та елемент із t
і додаючи назву цукерки до кінця +d
.
Потім цей підсклад реплікується стільки разів, скільки цукерки знайдені на вході /zd
, гарантуючи, що кожен список цукерок має однакову довжину.
Тепер, коли ця функція відображається над усіма унікальними цукерками у відповідному відсортованому порядку ( o_/zNS{z
), у нас є прямокутник, аналогічний тому, що йдеться у виписці, але з порожніми рядками замість періодів. Виконання транспонування матриці ( C
) з подальшими двома ss
підсумками ( ) дає заключний рядок.
Підтвердження:
$ pyth programs/candy.pyth <<< 'oroybgrbbyrorypoprr'
rorbyroprbyorrobypg