Description binaire récursive

14

Description binaire récursive

Récemment, j'ai apporté ma toute première contribution à OEIS en étendant et en ajoutant un fichier b à la séquence A049064 . La séquence commence par0 , puis les valeurs suivantes sont dérivées de la fourniture d'une "description binaire" du dernier élément.

Par exemple, le deuxième terme serait 10, car il y en avait un 0dans le premier élément. Le troisième terme serait 1110, car il y en avait un 1et un 0. Le quatrième serait 11110. car il y a trois ( 11en binaire!) 1 s et un 0. Voici une ventilation du cinquième mandat pour clarifier ce processus:

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

Et voici un exemple pour passer du 6e au 7e trimestre:

> 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

Vous pouvez consulter un programme de référence φ j'ai fait pour calculer les termes.

Votre travail

Vous devez créer un programme ou une fonction qui prend un nombre nvia des arguments d'entrée ou de fonction standard , et imprime la séquence du 1stterme au (n+1)thterme, séparée par une nouvelle ligne. Si vous souhaitez consulter les chiffres inférieurs, vous pouvez vous référer au fichier b de la page OEIS. Cependant, votre programme / fonction devrait prendre en charge 0 <= n <= 30, c'est-à-dire jusqu'au 31ème trimestre. Ce n'est pas un mince exploit, car il A049064(30)comporte plus de 140 000 chiffres δ . Si vous souhaitez voir quel devrait être le 31ème mandat, je l'ai mis sur Pastebin .

Exemple d'E / S

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

func(0)
0

func(3)
0
10
1110
11110

Il n'y a qu'une seule règle: pas de failles standard!

C'est le , donc le nombre d'octets le plus bas l'emporte.


φ - Gist peut être trouvé ici , et une démo d'idéone est ici .

δ - Juste au cas où vous vous poseriez la question, mes estimations de la longueur du 100e terme le mettaient à environ 3,28x10 250 caractères, ce qui serait beaucoup pour tout le monde à calculer.

Kade
la source
Sortie comme liste autorisée? Comme[0]\n[1, 0]\n[1, 1, 1, 0]\n...
Jakube
@Jakube Non, vous devrez y joindre une chaîne.
Kade
5
Félicitations pour votre contribution à l'OEIS!
Alex A.

Réponses:

8

CJam, 18 17 octets

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

Merci à @ MartinBüttner pour avoir joué un octet au golf!

Essayez-le en ligne dans l' interpréteur CJam .

Comment ça fonctionne

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
la source
4

Pyth, 18 17 octets

J]0VQjk~JsjR2srJ8

Essayez-le en ligne: Démonstration

Merci à @isaacg d'avoir enregistré un octet.

Explication:

                     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

Cela utilise le fait que 0 et 1 en binaire sont également 0 et 1.

Jakube
la source
C'est 1 octet plus court en utilisant Vau lieu de .u:J]0VQjk~JsjR2srJ8
isaacg
2

Python 2, 125 116 110 octets

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

1 octet enregistré grâce à @ Sp3000 et 5 octets en supprimant un redondant int appel .

Ancienne version:

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

Beaucoup, beaucoup d'octets enregistrés grâce à @ Vioz-!

Version originale:

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
la source
1

Rubis, 80 72 69 octets

En tant que fonction:

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

Appelez-le par exemple avec: f[6]

daniero
la source
Vous pourriez économiser quelques octets si vous prenez l'entrée comme argument de fonction:->m{l=?0;0.upto(m){puts l;l.gsub!(/1+|0+/){$&.size.to_s(2)+$&[0]}}}
blutorange
@blutorange Nice! Totalement oublié uptoet ! - Merci :)
daniero
1

Python 2, 102 octets

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

D'une certaine façon la combinaison d' itertoolsêtre plus longue que reet le groupbyretour des groupermoyens d'objets que l' utilisation est regex un peu plus court ...

Sp3000
la source
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')
Οurous
la source
0

Haskell, 136 130 octets

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
la source