Pyth、49 48 46 44バイト
_s.b@+kNsYc3mC+913d-.iU25smXm17hT4Cd"KGO"17_
ここで試してください。
アルファベットを生成する関数の短縮に取り組んでいます...はい、ジェネレーターはアルファベットを4文字ハードコードするよりも長くなりますが、バイト単位ではありません。
_s.b@+kNsYc3[...]_
_ get input (implicit) and reverse
[...] generate "ΑΒΓΔΕϜΖΗΘΙΚΛΜΝΞΟΠϘΡΣΤΥΦΧΨΩϠ" (see below)
c3 split into 3 equal chunks
.b map over each input digit (as Y) and chunk (as N)...
+kN prepend empty string to N (to support digits of 0)
@ sY get the Yth element of the empty-string-plus-digits array
s concatenate all the digits
_ reverse again to put digits back in the right order
アルファベットを生成する関数の動作は次のとおりです。すべてのコードポイントを取り、913(最小値)を引きます。
0 1 2 3 4 75 5 6 7 8 9 10 11 12 13 14 15 71 16 18 19 20 21 22 23 24 79
次に、パターンに適合しないものを引き出します。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 22 23 24
75 71 79
さて、戦略が形成されています:0から24の範囲を生成し(不足している17は後で扱います)、75、71、79を正しい場所に挿入します。
外れ値を挿入するにはどうすればよいですか?Pythには.i
exを取るnterleave関数があります。[1,2,3]
そして[4,5,6]
結果は[1,4,2,5,3,6]
です。ただし、明らかに外れ値が離れているため、いくつかのプレースホルダーを追加する必要があります。Xでプレースホルダーを表現しましょう:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 22 23 24
X X X X 75 X X X X X X X X X X 71 X X X X X X X 79
右、したがって、下の外れ値配列は4つので始まりX
ます。それぞれの外れ値の前に4 X
s をグループ化して、残っているものを確認できますか?
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 22 23 24
[four X]75 X X X X X X [ four X ]71 X X X [ four X ]79
今、私たちは別のキーの観測を行います。79で来ているので非常に終わりがありうる任意の数X
、それに先立つS、および任意の数X
だけでなく、それを次の!これは、インタリーブされているため、[1,2,3]
と[4,5,6,7,8,9]
の結果で[1,4,2,5,3,6,7,8,9]
-NOTEという二番目の配列の終わりまでに余分な要素が終わり、彼らはとにかく削除することになるだろうから、私たちは安全にそれを許可することができます。
つまり、すべての外れ値が4 X
秒先行し、6秒成功するようにこれを正規化できます。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 22 23 24
[four X]75[ six X ] [ four X ]71[ six X ] [four X]79[six X]
すごい!これで、配列を取得し、[75, 71, 79]
各要素の前に4つのプレースホルダー値を挿入し、その後に6つのプレースホルダー値を挿入して、それを範囲でインターリーブできます。0..24
。
しかし、待ってください、何が起こりました17
か?これらすべての例の一番上の行には17がありません。インターリーブ後に17を削除するだけです。しかし、これは別の楽しい悪の可能性を開いたままにします。お察しの通り、私たちが参照してきたプレースホルダーの値X
17になります。これにより、無関係な17とすべてのプレースホルダー値の両方を一度に削除できます。
最終的に!これを実装するために使用されるコードは次のとおりです。
mC+913d-.iU25smXm17hT4Cd"KGO"17
m "KGO" for each char in the string "KGO"...
Cd take its ASCII value ("KGO" -> 75,71,79)
m17hT generate an 11-element array filled with 17
X 4 replace the 5th element with the ASCII value ^^
s concatenate all of these together
.iU25 interleave with range(25)
- 17 remove all the 17s
m d for each value in the resulting array...
+913 add 913 (to get the real character value)
C convert to character