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>)
,但键将使用lambda表达式,但将其保留为字符串。
然后,我们生成该字符串的前缀列表,从长度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
)映射到所有唯一糖果上,我们有一个类似于问题语句中的矩形的矩形,但其中包含空字符串而不是句点。进行矩阵转置(C
),然后进行两个求和(ss
),即可得到最终的字符串。
验证:
$ pyth programs/candy.pyth <<< 'oroybgrbbyrorypoprr'
rorbyroprbyorrobypg