재귀 이진 설명


14

재귀 이진 설명

최근에 나는 시퀀스 A049064에 b 파일을 확장하고 추가하여 OEIS에 가장 먼저 기여했습니다 . 순서는로 시작 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

항을 계산하기 위해 만든 참조 프로그램 φ를 확인할 수 있습니다 .

작업

표준 입력 또는 함수 인수 를 통해 숫자 를 가져 와서 개행으로 구분 된 용어 에서 용어까지 순서를 인쇄 하는 프로그램 또는 함수 를 작성해야합니다 . 더 낮은 숫자를 보려면 OEIS 페이지에서 b 파일을 참조하십시오. 그러나 귀하의 프로그램 / 기능은 최대 31 학기까지 지원해야합니다 . 140,000 자리가 넘는 δ 와 같이 이것은 작은 위업이 아닙니다 . 31 번째 용어가 무엇인지 알고 싶다면 Pastebin에 넣습니다 .n1st(n+1)th0 <= n <= 30A049064(30)

예제 I / O

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

func(0)
0

func(3)
0
10
1110
11110

단 하나의 규칙이 있습니다 : 표준 허점 없음!

이것은 이므로 가장 낮은 바이트 수가 이깁니다.


φ-Gist는 여기 에서 찾을 수 있으며 , 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*

1 바이트를 골라 낸 @ 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

온라인으로 사용해보십시오 : 데모

1 바이트를 저장해 준 @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이라는 사실을 사용합니다.


이것은 다음 V대신에 1 바이트 더 짧습니다 .u.J]0VQjk~JsjR2srJ8
isaacg

2

파이썬 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()

@ Sp3000 덕분에 1 바이트 절약 및 중복 제거를 통해 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

루비, 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

파이썬 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보다 오래되고 regroupby복귀 grouper정규식을 사용하여 비트 짧다고 개체 수단 ...


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

0

하스켈, 136130 바이트

import Text.Printf
import Data.List
f n=putStr.unlines.take(n+1).iterate(concatMap(\n->(printf"%b"$length n)++[head n]).group)$"0"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.