Mô tả nhị phân đệ quy


14

Mô tả nhị phân đệ quy

Gần đây, tôi đã đóng góp đầu tiên cho OEIS bằng cách mở rộng và thêm tệp b vào chuỗi A049064 . Chuỗi bắt đầu bằng 0, và sau đó các giá trị tiếp theo được lấy từ việc đưa ra "mô tả nhị phân" của mục cuối cùng.

Ví dụ, thuật ngữ thứ hai sẽ là 10bởi vì có một 0trong phần tử đầu tiên. Thuật ngữ thứ ba sẽ là 1110, bởi vì có một 1và một 0. Thứ tư sẽ là 11110. bởi vì có ba ( 11trong nhị phân!) 1 và một 0. Dưới đây là bảng phân tích của thuật ngữ thứ năm để làm cho quá trình này rõ ràng:

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

Và đây là một ví dụ để đi từ nhiệm kỳ thứ 6 đến thứ 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

Bạn có thể kiểm tra một chương trình tài liệu tham khảo φ tôi đã thực hiện để tính toán các điều khoản.

Công việc của bạn

Bạn cần tạo một chương trình hoặc hàm lấy số nthông qua đầu vào tiêu chuẩn hoặc đối số hàm và in ra chuỗi từ 1stthuật ngữ này sang (n+1)ththuật ngữ, được phân tách bằng một dòng mới. Nếu bạn muốn xem các số thấp hơn, bạn có thể tham khảo tệp b từ trang OEIS. Tuy nhiên, chương trình / chức năng của bạn nên hỗ trợ 0 <= n <= 30, tức là đến nhiệm kỳ thứ 31. Đây là một kỳ công không nhỏ, như A049064(30)là hơn 140.000 chữ số dài δ . Nếu bạn muốn xem thuật ngữ thứ 31 sẽ là gì, tôi đã đặt nó trên Pastebin .

Ví dụ I / O

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

func(0)
0

func(3)
0
10
1110
11110

Chỉ có một quy tắc: Không có sơ hở tiêu chuẩn!

Đây là , vì vậy số byte thấp nhất sẽ thắng.


- Gist có thể được tìm thấy ở đây , và một bản demo ideone ở đây .

δ - Chỉ trong trường hợp bạn đang tự hỏi, ước tính của tôi ở độ dài của nhiệm kỳ thứ 100 đặt nó dài khoảng 3,28x10 250 ký tự, sẽ khá nhiều cho bất cứ ai tính toán.


Đầu ra như danh sách cho phép? Thích[0]\n[1, 0]\n[1, 1, 1, 0]\n...
Jakube

@Jakube Không, bạn sẽ cần thực hiện một chuỗi tham gia vào nó.
Kade

5
Chúc mừng bạn đã đóng góp cho OEIS!
Alex A.

Câu trả lời:


8

CJam, 18 17 byte

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

Cảm ơn @ MartinBüttner vì đã chơi golf một byte!

Hãy thử trực tuyến trong trình thông dịch CJam .

Làm thế nào nó hoạt động

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

Bình thường, 18 17 byte

J]0VQjk~JsjR2srJ8

Dùng thử trực tuyến: Trình diễn

Cảm ơn @isaacg đã lưu một byte.

Giải trình:

                     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

Điều này sử dụng thực tế, 0 và 1 trong nhị phân cũng là 0 và 1.


Đây là ngắn hơn 1 byte bằng cách sử dụng Vthay vì .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()

Đã lưu 1 byte nhờ @ Sp3000 và 5 byte bằng cách xóa intcuộc gọi dự phòng .

Phiên bản cũ hơn:

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

Đã lưu rất nhiều, rất nhiều byte nhờ @ Vioz-!

Phiên bản gốc:

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 byte

Là một chức năng:

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

Gọi nó là ví dụ với: f[6]


Bạn có thể lưu một vài byte nếu bạn lấy đầu vào làm đối số hàm:->m{l=?0;0.upto(m){puts l;l.gsub!(/1+|0+/){$&.size.to_s(2)+$&[0]}}}
blutorange

@blutorange Đẹp quá! Hoàn toàn quên mất upto! - Cảm ơn :)
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()

Bằng cách nào đó, sự kết hợp giữa các đối tượng itertoolsdài hơn regroupbytrả về groupercó nghĩa là việc sử dụng regex ngắn hơn một chút ...


0

Rắn hổ mang - 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')

0

Haskell, 136 130 byte

import Text.Printf
import Data.List
f n=putStr.unlines.take(n+1).iterate(concatMap(\n->(printf"%b"$length n)++[head n]).group)$"0"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.