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 sorted(<stuff>,key=<stuff>)
, с лямбда-выражением для ключа, за исключением того, что оно хранится в виде строки.
Затем мы генерируем список префиксов этой строки, от длины len(z)
до длины 1. >
Это эквивалентно Python <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
), у нас есть прямоугольник, похожий на прямоугольник в вопросе, но с пустыми строками вместо точек. Выполнение матрицы transpose ( C
) с последующими двумя суммами ( ss
) дает окончательную строку.
Проверка:
$ pyth programs/candy.pyth <<< 'oroybgrbbyrorypoprr'
rorbyroprbyorrobypg