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'sと同等<stuff>[<int>:]
です。
次に、このプレフィックス文字列のリストを、質問で見られる長方形レイアウトのプレフィックスの最初の文字の小数位置(0は左端、1は右)で並べ替えます。/NhN
接頭辞の最初の文字が接頭辞に何回出現するかをカウント/zhN
し、文字列の接頭辞の最初の文字の出現回数を穴として提供します。これにより、グループ内の各文字が先頭にある各プレフィックスに、その文字1/k
の右端から左端まで、異なる割合が割り当てられますk/k
。この番号でプレフィックスリストを並べ替えると、レイアウト内の適切な位置が決まります。ネクタイは、必要に応じて最初にカウント順、次にアルファベット順の事前の順序を使用して壊れます。
最後に、各プレフィックス文字列から最初の文字を抽出し、それらを1つの文字列に結合して印刷する必要があります。最初の文字の抽出はhC
です。C
実際zip(*x)
にPython 3でリストの行列転置を実行しh
ます。結果の行列の最初の行を抽出します。これは実際には唯一の行です。これは、1文字のプレフィックスが存在すると、他の完全な行が形成されないためです。s
このタプルの文字を合計して1つの文字列にします。印刷は暗黙的です。
テスト:
$ 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
)の後に2つの加算(ss
)を実行すると、最終的な文字列が得られます。
検証:
$ pyth programs/candy.pyth <<< 'oroybgrbbyrorypoprr'
rorbyroprbyorrobypg