この番号をデコードしてください!


8

この課題は、整数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のと最後のをすべて削除します110101100111000 => 1010110011
    • 0sと1sの最後の文字列をバイナリから整数に変換します。1010110011 => 691

このエンコーディングをデコードする

このアルゴリズムの興味深い特性は、全射的ではないことです。すべての整数がこのエンコードの結果であるとは限りません。

  • まず、結果のバイナリ表現はr、でなければならないbalance-able多くのことで0sは数超えてはならない1のです。短い偽のテストケースはで4、これは100バイナリです。
  • 次に、バイナリ表現の角かっこは、sorted ascending最後のs 1と末尾0のsがもう一度追加されるときでなければなりません。短い誤ったテストケースは12 <= 1100 <= 110010 <= (())()です。

ただし、この方法で数値がデコード可能かどうかを判断するだけでは、短い課題が生じます。代わりに、課題は、デコードできない数値またはサイクルに到達するまで所定の入力を繰り返しデコードし、結果として得られる数値のシーケンスを返すことです。

チャレンジ

  • 数与えられ1 <= r <= 2**20 = 1048576、戻り数列r 順次復号始まるへのr自身と非デコード可能数または周期で終わります。
  • 場合未デコード可能な数は、入力として与えられ、等412、入力のみを含むリストを返します。
  • 終わる配列周期のいずれかによって、いくつかの方法で示されなければならないマーカーを付加またはプリペンド(マーカーとして以外の正の整数、文字列、リスト、等を選ぶが、一貫性を保つ)、又はによってサイクルを繰り返すことで何らかの方法(最初の要素を繰り返す、サイクル全体を繰り返す、無限に繰り返すなど)。
  • シーケンスが無限になる可能性がある場合(たとえば、永久に増加することにより)、それを未定義の動作と見なします。
  • これはコードゴルフです。最小のバイト数が優先されます。

デコードの実際の例

   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]

この課題に対する提案とフィードバックは大歓迎です。幸運と良いゴルフを!



どうやって1与えるの3
Leaky Nun 2017

@LeakyNun- 11末尾にゼロを追加)-> 1100-> [[]]-> [[1]]-> [2]->3
Colera Su

6-> 110-> 110100どちらが無効ですか?入力は1与えるべき[1,3,5,6]ですか?
dylnan 2017

そして7の場合:7-> 111-> 11110000-> [[[[]]]]-> 4番目の素数= 7?多分私はアルゴリズムを理解していません
dylnan '15

回答:


4

Pythonの3379の 358 339 337 327 310 304バイト

推測:13循環につながる唯一の数は?(10 6未満の例外はありません。)

Sherlock9のおかげでバグが修正され、-7バイトになりました。Jonathan Frechの
おかげで-3バイト。ovsのおかげで-16バイト。Xcoder氏のおかげで-6バイト。

サイクルがある場合は、サイクル全体を繰り返します。

def p(a,x=0,n=1):
 while a:x+=1;a-=n%x;n*=x*x
 return x
def g(a):
 c=i=0
 for v in a:
  c+=int(v)*2-1
  if c<0:return 0,0
  if c<1:break
  i+=1
 if a:x=p(g(a[1:i])[0]);b,c=g(a[i+1:]);return(x>c>0)*(0,0)or(x*b,x)
 return 1,0
def f(a):
 x=a,
 while(x.count(a)<3)*a:a,t=g(bin(a-~a)[2:]);x+=a,
 return x[:-1]

オンラインでお試しください!

説明:

def p(a,x=0,n=1):     # return the a-th prime
 while a:             # magical way to enumerate primes
  x+=1
  a-=n%x
  n*=x*x
 return x

def g(a):             # decode a 0/1 string
 c=i=0
 for v in a:
  c+=int(v)*2-1       # +1 if 1, -1 if 0
  if c<0: return(0,0) # c<0: unbalanced parentheses
  if c<1: break       # first outermost parentheses
  i+=1
 if a:
   x=p(g(a[1:i])[0])  # recursive solve those inside the parentheses ...
   b,c=g(a[i+1:])     # and the remaining
   if x>c and c:      # if not ascending
    return (0,0)
   return (x*b,x)     # return (result, value of first closed parentheses)
 return (1,0)         # empty string

def f(a):
 x=a,
 while a and x.count(a)<3: # detect non-decodable or cycle
  a,t=g(bin(a-~a)[2:])     # a-~a is a*2+1
  x+=a,
 return x[:-1]

1

Pyth、62バイト

L?b**FKme.fP_Zyd)bSIK1fTseB.u.xyvs@L,"],"\[++JjN2 1m0h-/J1/J00

テストスイート

最後の数字を繰り返すことでサイクルを示します。

L?b**FKme.fP_Zyd)bSIK1    Define y to decode from list format. 0 if invalid.

fTseB.u.xyvs@L,"],"\[++JjN2 1m0h-/J1/J00
     .u                                     Repeat the following until it cycles
                                            Collecting the values in a list.
                     ++JjN2 1m0h-/J1/J0     Convert the number to expanded binary
            @L,"],"\[                       Map 0 to "],", 1 to "["
           s                                Flatten to a string.
          v                                 Evaluate as a Python object.
       .x                              0    If evaluation fails, return 0.
         y                                  Otherwise decode.
  seB                                       Duplicate the final number
fT                                          Remove all 0s.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.