Descrição binária recursiva

14

Descrição binária recursiva

Recentemente, fiz minha primeira contribuição ao OEIS estendendo e adicionando um arquivo b à sequência A049064 . A sequência começa com 0e, em seguida, os próximos valores são derivados de fornecer uma "descrição binária" do último item.

Por exemplo, o segundo termo seria 10, porque havia um 0no primeiro elemento. O terceiro termo seria 1110, porque havia um 1e um 0. O quarto seria 11110. porque existem três ( 11em binário!) se 1 um 0. Abaixo está um detalhamento do quinto mandato para tornar esse processo claro:

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

E aqui está um exemplo para ir do 6º ao 7º termo:

> 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

Você pode conferir um programa de referência φ eu fiz para calcular os termos.

Seu emprego

Você precisa criar um programa ou função que receba um número nvia argumentos de entrada ou função padrão e imprima a sequência do 1sttermo para o (n+1)thtermo, separada por uma nova linha. Se você quiser ver os números mais baixos, consulte o arquivo b na página OEIS. No entanto, seu programa / função deve suportar 0 <= n <= 30, ou seja, até o 31º termo. Isso não é pouca coisa, pois A049064(30)tem mais de 140.000 dígitos δ . Se você gostaria de ver qual deve ser o 31º termo, eu o coloquei em Pastebin .

Exemplo de E / S

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

func(0)
0

func(3)
0
10
1110
11110

Há apenas uma regra: sem brechas padrão!

Isso é , então a menor contagem de bytes vence.


φ - A essência pode ser encontrada aqui , e uma demonstração de ideone está aqui .

δ - Para o caso de você estar se perguntando, minhas estimativas, no comprimento do 100º termo, o colocam em aproximadamente 3,28 x 250 caracteres, o que seria bastante para qualquer um calcular.

Kade
fonte
Saída como lista permitida? Como[0]\n[1, 0]\n[1, 1, 1, 0]\n...
Jakube 03/07
@Jakube Não, você precisará fazer uma junção de string.
Kade
5
Parabéns por contribuir com a OEIS!
Alex A.

Respostas:

8

CJam, 18 17 bytes

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

Obrigado a @ MartinBüttner por jogar um byte!

Experimente on-line no intérprete CJam .

Como funciona

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
fonte
4

Pitão, 18 17 bytes

J]0VQjk~JsjR2srJ8

Experimente online: Demonstração

Agradecemos a @isaacg por salvar um byte.

Explicação:

                     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

Isso usa o fato de que 0 e 1 em binário também são 0 e 1.

Jakube
fonte
Este é 1 byte mais curto usando Vem vez de .u:J]0VQjk~JsjR2srJ8
isaacg
2

Python 2, 125 116 110 bytes

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

Economizou 1 byte graças a @ Sp3000 e 5 bytes removendo uma intchamada redundante .

Versão antiga:

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

Salvei muitos, muitos bytes graças a @ Vioz-!

Versão original:

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
fonte
1

Ruby, 80 72 69 bytes

Como uma função:

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

Chame por exemplo com: f[6]

daniero
fonte
Você poderia economizar alguns bytes se você tirar a entrada como um argumento da função:->m{l=?0;0.upto(m){puts l;l.gsub!(/1+|0+/){$&.size.to_s(2)+$&[0]}}}
blutorange
@blutorange Nice! Esqueci totalmente uptoe ! - Obrigado :) #
daniero
1

Python 2, 102 bytes

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

De alguma forma, a combinação de itertoolsser maior que ree groupbyretornar grouperobjetos significa que usar regex é um pouco mais curto ...

Sp3000
fonte
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')
Furioso
fonte
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
fonte