คำอธิบายไบนารีแบบเรียกซ้ำ


14

คำอธิบายไบนารีแบบเรียกซ้ำ

เร็ว ๆ นี้ผมทำผลงานแรกของฉันที่จะ OEIS โดยการขยายและเพิ่มเป็นขแฟ้มลำดับA049064 ลำดับเริ่มต้นด้วย0จากนั้นค่าถัดไปจะได้รับจากการให้ "คำอธิบายไบนารี" ของรายการสุดท้าย

ตัวอย่างเช่นเทอมที่สองจะเป็น10เพราะมีหนึ่ง0ในองค์ประกอบแรก ระยะที่สามจะเป็น1110เพราะมีผู้หญิงคนหนึ่งและเป็นหนึ่งใน1 ที่สี่จะเป็น0 11110เพราะมีสาม( 11ในไบนารี!) และหนึ่ง1 0ด้านล่างคือการแยกคำที่ห้าเพื่อทำให้กระบวนการนี้ชัดเจน:

> 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)

และนี่คือตัวอย่างของการไปจากเทอมที่ 6 ถึงที่ 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

คุณสามารถตรวจสอบโปรแกรมการอ้างอิงφฉันทำในการคำนวณเงื่อนไข

งานของคุณ

คุณจำเป็นต้องสร้างโปรแกรมหรือฟังก์ชั่นที่รับจำนวนnผ่านการป้อนค่ามาตรฐานหรืออาร์กิวเมนต์ของฟังก์ชั่นและพิมพ์ลำดับจาก1stเทอมเป็น(n+1)thเทอมโดยคั่นด้วย newline หากคุณต้องการดูตัวเลขที่ต่ำกว่าคุณอาจอ้างถึง b-file จากหน้า OEIS อย่างไรก็ตามโปรแกรม / ฟังก์ชั่นของคุณควรรองรับ0 <= n <= 30ได้สูงสุด 31 เทอม นี้จะไม่มีฝีมือขนาดเล็กขณะที่A049064(30)มีมากกว่า 140,000 ตัวเลขยาวδ หากคุณต้องการที่จะเห็นสิ่งที่ระยะ 31 ควรจะเป็นผมเคยวางไว้บนPastebin

ตัวอย่าง I / O

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

func(0)
0

func(3)
0
10
1110
11110

มีกฎข้อเดียวเท่านั้น: ไม่มีช่องโหว่มาตรฐาน!

นี่คือดังนั้นจำนวนไบต์ที่น้อยที่สุดจึงชนะ


φ - สรุปสาระสำคัญสามารถพบได้ที่นี่และสาธิต ideone เป็นที่นี่

δ - ในกรณีที่คุณสงสัยการประมาณการของฉันที่ความยาวของเทอมที่ 100 จะมีความยาวประมาณ 3.28x10 250ตัวอักษรซึ่งจะค่อนข้างมากสำหรับทุกคนในการคำนวณ


ส่งออกตามรายการอนุญาตหรือไม่ กดถูกใจ[0]\n[1, 0]\n[1, 1, 1, 0]\n...
Jakube

@Jakube ไม่คุณจะต้องเข้าร่วมกับสตริง
Kade

5
ขอแสดงความยินดีกับการมีส่วนร่วมกับ OEIS!
Alex A.

คำตอบ:


8

CJam, 18 17 ไบต์

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

ขอบคุณ @ MartinBüttnerสำหรับการตีหนึ่งไบต์!

ลองใช้ออนไลน์ในล่าม CJam

มันทำงานอย่างไร

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.

4

Pyth, 18 17 ไบต์

J]0VQjk~JsjR2srJ8

ลองใช้งานออนไลน์: การสาธิต

ขอบคุณ @isaacg สำหรับการบันทึกหนึ่งไบต์

คำอธิบาย:

                     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

สิ่งนี้ใช้ความจริงว่า 0 และ 1 ในไบนารีนั้นเป็น 0 และ 1


นี่คือ 1 byte ที่สั้นกว่าโดยใช้Vแทน.u:J]0VQjk~JsjR2srJ8
isaacg

2

Python 2, 125 116 110 ไบต์

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

บันทึก 1 ไบต์ด้วย @ Sp3000 และ 5 ไบต์โดยการลบการintโทรซ้ำซ้อน

รุ่นเก่ากว่า:

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()

บันทึกแล้วหลายไบต์ต้องขอบคุณ @ Vioz-!

รุ่นเดิม:

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))

1

Ruby, 80 72 69 ไบต์

ในฐานะที่เป็นฟังก์ชั่น:

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

เรียกมันว่าเป็นตัวอย่างด้วย: f[6]


คุณสามารถบันทึกไม่กี่ไบต์ถ้าคุณรับเข้าเป็นอาร์กิวเมนต์ของฟังก์ชัน:->m{l=?0;0.upto(m){puts l;l.gsub!(/1+|0+/){$&.size.to_s(2)+$&[0]}}}
blutorange

@ blutorange ดีมาก! ลืมไปหมดuptoแล้ว! - ขอบคุณ :)
daniero

1

Python 2, 102 ไบต์

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

การรวมกันของitertoolsการเป็นนานกว่าreและวัตถุที่groupbyส่งคืนgrouperหมายความว่าการใช้ regex นั้นสั้นกว่าเล็กน้อย ...


0

งูเห่า - 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')

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.