Deskripsi Biner Rekursif

14

Deskripsi Biner Rekursif

Baru-baru ini, saya membuat kontribusi pertama saya ke OEIS dengan memperluas dan menambahkan file-b ke urutan A049064 . Urutan dimulai dengan 0, dan kemudian nilai selanjutnya diperoleh dari memberikan "deskripsi biner" dari item terakhir.

Misalnya, istilah kedua adalah 10, karena ada satu 0di elemen pertama. Istilah ketiga adalah 1110, karena ada satu 1dan satu 0. Yang keempat adalah 11110. karena ada tiga ( 11dalam biner!) 1 dan satu 0. Di bawah ini adalah uraian dari istilah kelima untuk memperjelas proses ini:

> 11110
> 1111 0    (split into groups of each number)
> 4*1 1*0   (get count of each number in each group)
> 100*1 1*0 (convert counts to binary)
> 100110    (join each group back together)

Dan inilah contoh untuk beralih dari istilah ke-6 ke ke-7:

> 1110010110
> 111 00 1 0 11 0
> 3*1 2*0 1*1 1*0 2*1 1*0
> 11*1 10*0 1*1 1*0 10*1 1*0
> 111100111010110

Anda dapat memeriksa program referensi φ Saya membuat untuk menghitung persyaratan.

Pekerjaan Anda

Anda perlu membuat program atau fungsi yang mengambil angka nmelalui input standar atau argumen fungsi , dan mencetak urutan dari 1stterm ke (n+1)thterm, dipisahkan oleh baris baru. Jika Anda ingin melihat angka yang lebih rendah, Anda dapat merujuk ke file-b dari halaman OEIS. Namun, program / fungsi Anda harus mendukung 0 <= n <= 30, yaitu hingga istilah ke-31. Ini bukan prestasi kecil, seperti A049064(30)lebih dari 140.000 digit δ . Jika Anda ingin melihat seperti apa seharusnya istilah ke-31, saya sudah meletakkannya di Pastebin .

Contoh I / O

func(10)
0
10
1110
11110
100110
1110010110
111100111010110
100110011110111010110
1110010110010011011110111010110
1111001110101100111001011010011011110111010110
1001100111101110101100111100111010110111001011010011011110111010110

func(0)
0

func(3)
0
10
1110
11110

Hanya ada satu aturan: Tidak ada celah standar!

Ini adalah , sehingga jumlah byte terendah menang.


φ - Intisari dapat ditemukan di sini , dan demo ideone ada di sini .

δ - Kalau-kalau Anda bertanya-tanya, perkiraan saya pada panjang istilah ke-100 meletakkannya di sekitar 3,28x10 250 karakter, yang akan cukup banyak bagi siapa pun untuk menghitung.

Kade
sumber
Keluaran karena daftar diizinkan? Suka[0]\n[1, 0]\n[1, 1, 1, 0]\n...
Jakube
@Jakube Tidak, Anda harus melakukan penggabungan string di atasnya.
Kade
5
Selamat atas kontribusi Anda pada OEIS!
Alex A.

Jawaban:

8

CJam, 18 17 byte

0{sN1$e`2af.b}ri*

Terima kasih kepada @ MartinBüttner untuk bermain golf satu byte!

Cobalah online di penerjemah CJam .

Bagaimana itu bekerja

0                 e# Push 0.
 {           }ri* e# Repeat int(input)) times:
  s               e#   Stringify the element on top of the stack.
                       EXAMPLE: [[[1 1] '1] [[1] '0]] -> "11110"
   N              e#   Push a linefeed.
    1$            e#   Copy the last stack.
      e`          e#   Perform run-length encoding.
                  e#   EXAMPLE: "100110" -> [[1 '1] [2 '0] [2 '1] [1 '0]]
        2a        e#   Push [2].
          f.b     e#   For each pair [x 'y], execute: [x 'y][2].b
                  e#   This pushes [x2b 'y], where b is base conversion.
Dennis
sumber
4

Pyth, 18 17 byte

J]0VQjk~JsjR2srJ8

Cobalah online: Peragaan

Terima kasih kepada @isaacg untuk menghemat satu byte.

Penjelasan:

                     implicit: Q = input number
 ]0                  create an initial list [0]
J                    and store in J
   VQ                for loop, repeat Q times:
              rJ8       run-length-encoding of J
             s          sum, unfolds lists
          jR2           convert each value to base 2
         s              sum, unfolds lists
       ~J               store the result in J

                        but return the old list,
     jk                 join it and print it

Ini menggunakan fakta, bahwa 0 dan 1 dalam biner juga 0 dan 1.

Jakube
sumber
Ini lebih pendek 1 byte Vdaripada menggunakan .u:J]0VQjk~JsjR2srJ8
isaacg
2

Python 2, 125 116 110 byte

from itertools import*
v='0'
exec"print v;v=''.join(bin(len(list(g)))[2:]+k for k,g in groupby(v));"*-~input()

Disimpan 1 byte berkat @ Sp3000 dan 5 byte dengan menghapus intpanggilan yang berlebihan .

Versi yang lebih lama:

import itertools as t
v='0'
exec"print v;v=''.join(bin(int(len(list(g))))[2:]+k for k,g in t.groupby(v));"*-~input()

Disimpan banyak, banyak byte berkat @ Vioz-!

Versi asli:

import itertools as t
v='0'
for n in range(input()+1):print v;v=''.join(bin(int(len(list(g))))[2:]+k for k,g in t.groupby(v))
kirbyfan64sos
sumber
1

Ruby, 80 72 69 byte

Sebagai fungsi:

f=->m{l=?0;0.upto(m){puts l;l.gsub!(/1+|0+/){$&.size.to_s(2)+$&[0]}}}

Sebut saja misalnya dengan: f[6]

daniero
sumber
Anda dapat menyimpan beberapa byte jika Anda mengambil input sebagai argumen fungsi:->m{l=?0;0.upto(m){puts l;l.gsub!(/1+|0+/){$&.size.to_s(2)+$&[0]}}}
blutorange
@blutorange Bagus! Benar-benar lupa uptodan ! - Terima kasih :)
daniero
1

Python 2, 102 byte

import re
o='0'
exec"print o;o=''.join(bin(len(x))[2:]+x[0]for x in re.findall('0+|1+',o));"*-~input()

Entah bagaimana kombinasi itertoolsmenjadi lebih dari redan groupbymengembalikan grouperobjek berarti bahwa menggunakan regex sedikit lebih pendek ...

Sp3000
sumber
0

Cobra - 128

do(i)=if(i-=1,(r=RegularExpressions).Regex.replace(f(i),'1+|0+',do(m=r.Match())=Convert.toString('[m]'.length,2)+'[m]'[:1]),'0')
Suram
sumber
0

Haskell, 136 130 Bytes

import Text.Printf
import Data.List
f n=putStr.unlines.take(n+1).iterate(concatMap(\n->(printf"%b"$length n)++[head n]).group)$"0"
ankh-morpork
sumber