Simpan Decoding Nomor Ini!

8

Tantangan ini menimbulkan algoritma untuk pengkodean integer nsebagai integer lain r. Berikut ini adalah penjelasan singkat tentang algoritma itu, menggunakan n=60sebagai contoh.

Algoritma asli

  • Pertama, kami menyandikan nomor tersebut sebagai string tanda kurung.

    • Jika n = 1, kembalikan string kosong.
    • Jika tidak, kami mengambil npenguraian utama yang diurutkan naik dan mengganti setiap elemen dengan indeks prima (1-diindeks) dalam tanda kurung.60 = 2*2*3*5 => [1][1][2][3]
    • Lakukan ini secara rekursif sampai semua yang kita miliki adalah tanda kurung. [1][1][2][3] => [][][[1]][[2]] => [][][[]][[[1]]] => [][][[]][[[]]]
  • Setelah kami memiliki serangkaian tanda kurung, kami mengubahnya menjadi bilangan bulat dengan proses berikut.

    • Konversikan setiap braket pembuka ke a 1dan setiap braket penutup menjadi a 0.[][][[]][[[]]] => 10101100111000
    • Hapus semua trailing 0dan final 1.10101100111000 => 1010110011
    • Konversi string akhir 0s dan 1s dari biner ke integer.1010110011 => 691

Decoding encoding ini

Properti yang menarik dari algoritma ini adalah tidak bersifat surjektif. Tidak setiap bilangan bulat dapat menjadi hasil pengkodean ini.

  • Pertama, representasi biner dari hasilnya r, harus balance-abledalam jumlah 0s tidak boleh melebihi jumlah 1s. Kasus uji falsey pendek adalah 4, yang 100dalam biner.
  • Kedua, tanda kurung dalam representasi biner harus sorted ascendingketika akhir 1dan trailing 0ditambahkan sekali lagi. Kasus uji falsey pendek adalah 12 <= 1100 <= 110010 <= (())().

Namun, hanya menentukan apakah angka dapat didekodekan dengan cara ini akan membuat tantangan singkat. Sebagai gantinya, tantangannya adalah berulang kali mendekode input yang diberikan sampai salah satu angka yang tidak dapat didekodekan atau siklus tercapai, dan mengembalikan urutan angka yang dihasilkan .

Tantangan

  • Diberi nomor 1 <= r <= 2**20 = 1048576, kembalikan urutan angka yang secara r berturut - turut diterjemahkan , dimulai dengan rdirinya sendiri dan diakhiri dengan angka yang tidak dapat didekode atau siklus.
  • Jika nomor yang tidak dapat didekodekan diberikan sebagai input, seperti 4atau 12, akan mengembalikan daftar yang hanya berisi input.
  • Urutan yang berakhir dalam suatu siklus harus diindikasikan dengan beberapa cara, baik dengan menambahkan atau menambahkan penanda (pilih bilangan bulat, string, daftar, dll. Apa pun sebagai penanda, tetapi tetap konsisten), atau dengan mengulangi siklus dalam beberapa cara (mengulangi elemen pertama, mengulangi seluruh siklus, mengulangi tanpa batas, dll.).
  • Jika ada urutan yang tidak terbatas (dengan meningkatkan selamanya, misalnya), anggap itu perilaku yang tidak terdefinisi.
  • Ini golf kode. Jumlah byte terkecil menang.

Contoh decoding yang berhasil

   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

Uji kasus

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]

Saran dan umpan balik untuk tantangan ini dipersilahkan. Semoga berhasil dan bermain golf dengan baik!

Sherlock9
sumber
Kotak pasir .
user202729
Bagaimana 1memberi 3?
Leaky Nun
@LeakyNun 1- (menambahkan 1dan mengekor nol) -> 1100-> [[]]-> [[1]]-> [2]->3
Colera Su
6-> 110-> 110100yang tidak valid, bukan? Jadi haruskah input 1memberi [1,3,5,6]?
dylnan
Dan untuk 7: 7-> 111-> 11110000-> [[[[]]]]-> 4th prime = 7? Mungkin saya tidak mengerti algoritme
dylnan

Jawaban:

4

Python 3 , 379 358 339 337 327 310 304 byte

Dugaan: Apakah 13hanya angka yang akan mengarah pada siklus? (Tidak ada pengecualian yang lebih kecil dari 10 6 ).

Memperbaiki bug dan -7 byte berkat Sherlock9 .
-3 byte terima kasih kepada Jonathan Frech .
-16 bytes terima kasih kepada ovs .
-6 byte terima kasih kepada Tn . Xcoder .

Jika ada siklus, itu akan mengulangi seluruh siklus.

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]

Cobalah online!

Penjelasan:

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]
Colera Su
sumber
1

Pyth, 62 byte

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

Suite uji

Menunjukkan siklus dengan mengulangi angka terakhir.

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.
isaacg
sumber