この課題は、整数n
を別の整数としてエンコードするアルゴリズムを提起しましたr
。以下はn=60
、例として使用して、そのアルゴリズムの簡潔な説明です。
オリジナルのアルゴリズム
まず、括弧の文字列として数値をエンコードします。
- の場合
n = 1
、空の文字列を返します。 - それ以外の場合は、
n
昇順でソートされたの素数分解を取り、各要素を角括弧内のその素数インデックス(1インデックス付き)で置き換えます。60 = 2*2*3*5 => [1][1][2][3]
- ブラケットがすべて揃うまでこれを再帰的に行います。
[1][1][2][3] => [][][[1]][[2]] => [][][[]][[[1]]] => [][][[]][[[]]]
- の場合
ブラケットの文字列を取得したら、次のプロセスでそれを整数に変換します。
- 各開始ブラケットをaに
1
、各終了ブラケットをaに変換します0
。[][][[]][[[]]] => 10101100111000
- 末尾
0
のと最後のをすべて削除します1
。10101100111000 => 1010110011
0
sと1
sの最後の文字列をバイナリから整数に変換します。1010110011 => 691
- 各開始ブラケットをaに
このエンコーディングをデコードする
このアルゴリズムの興味深い特性は、全射的ではないことです。すべての整数がこのエンコードの結果であるとは限りません。
- まず、結果のバイナリ表現は
r
、でなければならないbalance-able
多くのことで0
sは数超えてはならない1
のです。短い偽のテストケースはで4
、これは100
バイナリです。 - 次に、バイナリ表現の角かっこは、
sorted ascending
最後のs1
と末尾0
のsがもう一度追加されるときでなければなりません。短い誤ったテストケースは12 <= 1100 <= 110010 <= (())()
です。
ただし、この方法で数値がデコード可能かどうかを判断するだけでは、短い課題が生じます。代わりに、課題は、デコードできない数値またはサイクルに到達するまで所定の入力を繰り返しデコードし、結果として得られる数値のシーケンスを返すことです。
チャレンジ
- 数与えられ
1 <= r <= 2**20 = 1048576
、戻り数列r
順次復号始まるへのr
自身と非デコード可能数または周期で終わります。 - 場合未デコード可能な数は、入力として与えられ、等
4
や12
、入力のみを含むリストを返します。 - 終わる配列周期のいずれかによって、いくつかの方法で示されなければならないマーカーを付加またはプリペンド(マーカーとして以外の正の整数、文字列、リスト、等を選ぶが、一貫性を保つ)、又はによってサイクルを繰り返すことで何らかの方法(最初の要素を繰り返す、サイクル全体を繰り返す、無限に繰り返すなど)。
- シーケンスが無限になる可能性がある場合(たとえば、永久に増加することにより)、それを未定義の動作と見なします。
- これはコードゴルフです。最小のバイト数が優先されます。
デコードの実際の例
1 -> 1 -> 1100 -> [[]] -> [2] -> 3
-> 3 -> 11 -> 111000 -> [[[]]] -> [[2]] -> [3] -> 5
-> 5 -> 101 -> 101100 -> [][[]] -> 2*[2] -> 2*3 -> 6
-> 6 -> 110 -> 110100 -> [[][]] -> [2*2] -> [4] -> 7
-> 7 -> 111 -> 11110000 -> [[[[]]]] -> [[[2]]] -> [[3]] -> [5] -> 11
-> 11 -> 1011 -> 10111000 -> [][[[]]] -> 2*[[2]] -> 2*[3] -> 2*5 -> 10
-> 10 -> 1010 -> 101010 -> [][][] -> 2*2*2 -> 8
-> 8 -> 1000 ERROR: Unbalanced string
テストケース
4 -> [4]
12 -> [12]
1 -> [1, 3, 5, 6, 7, 11, 10, 8]
2 -> [2, 4]
13 -> [13, 13] # cycle is repeated once
23 -> [23, 22, 14, 17]
51 -> [51, 15, 31, 127, 5381]
691 -> [691, 60]
126 -> [126, 1787, 90907]
1019 -> [1019, 506683, 359087867, 560390368728]
この課題に対する提案とフィードバックは大歓迎です。幸運と良いゴルフを!
サンドボックス。
—
user202729 2017
どうやって
—
Leaky Nun 2017
1
与えるの3
?
@LeakyNun-
—
Colera Su
1
(1
末尾にゼロを追加)-> 1100
-> [[]]
-> [[1]]
-> [2]
->3
6
-> 110
-> 110100
どちらが無効ですか?入力は1
与えるべき[1,3,5,6]
ですか?
そして7の場合:
—
dylnan '15
7
-> 111
-> 11110000
-> [[[[]]]]
-> 4番目の素数= 7?多分私はアルゴリズムを理解していません