Rekursive binäre Beschreibung

14

Rekursive binäre Beschreibung

Kürzlich habe ich meinen ersten Beitrag zu OEIS geleistet, indem ich der Sequenz A049064 eine B-Datei hinzugefügt habe . Die Sequenz beginnt mit 0und die nächsten Werte werden aus einer "binären Beschreibung" des letzten Elements abgeleitet.

Zum Beispiel wäre der zweite Term 10, weil es einen 0im ersten Element gab. Die dritte Amtszeit wäre 1110, weil es eins 1und eins gab 0. Der vierte wäre 11110. denn es gibt drei ( 11in binären!) 1 s und eins 0. Nachfolgend finden Sie eine Aufschlüsselung des fünften Terms, um diesen Prozess zu verdeutlichen:

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

Und hier ist ein Beispiel für den Übergang vom 6. zum 7. Semester:

> 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

Sie können ein Referenzprogramm φ auschecken, das ich erstellt habe, um die Terme zu berechnen.

Deine Arbeit

Sie müssen ein Programm oder eine Funktion erstellen, die eine Zahl nüber Standardeingabe oder Funktionsargumente aufnimmt und die Sequenz von 1stBegriff zu (n+1)thBegriff, durch einen Zeilenumbruch getrennt, ausgibt. Wenn Sie sich die niedrigeren Zahlen ansehen möchten, können Sie sich auf die B-Datei auf der OEIS-Seite beziehen. Ihr Programm / Ihre Funktion sollte dies jedoch unterstützen 0 <= n <= 30, dh bis zur 31. Amtszeit. Dies ist keine Kleinigkeit, da δA049064(30) mehr als 140.000 Stellen lang ist . Wenn Sie sehen möchten, wie das 31. Semester aussehen soll, habe ich es auf Pastebin gesetzt .

Beispiel I / O

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

func(0)
0

func(3)
0
10
1110
11110

Es gibt nur eine Regel: Keine Standardlücken!

Das ist , also gewinnt die niedrigste Bytezahl.


φ - Gist gefunden werden kann hier , und eine ideone Demo ist hier .

δ - Nur für den Fall, dass Sie sich wundern sollten, meine Schätzungen für die Länge des 100. Terms haben ergeben, dass es sich um ungefähr 3,28 x 10 250 Zeichen handelt, was für jedermann eine Menge zu berechnen wäre.

Kade
quelle
Ausgabe als Liste erlaubt? Like[0]\n[1, 0]\n[1, 1, 1, 0]\n...
Jakube
@Jakube Nein, du musst einen String Join machen.
Kade,
5
Herzlichen Glückwunsch zu Ihrem Beitrag zu OEIS!
Alex A.

Antworten:

8

CJam, 18 17 Bytes

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

Danke an @ MartinBüttner für das Golfen von einem Byte!

Probieren Sie es online im CJam-Interpreter aus .

Wie es funktioniert

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

Pyth, 18 17 Bytes

J]0VQjk~JsjR2srJ8

Probieren Sie es online aus: Demonstration

Vielen Dank an @isaacg für das Speichern eines Bytes.

Erläuterung:

                     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

Dies nutzt die Tatsache, dass 0 und 1 in binär auch 0 und 1 sind.

Jakube
quelle
Dies ist 1 Byte kürzer mit Vanstelle von .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()

1 Byte dank @ Sp3000 und 5 Byte durch Entfernen eines redundanten intAnrufs eingespart .

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

Viele, viele Bytes gespart dank @ Vioz-!

Originalfassung:

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

Ruby, 80 72 69 Bytes

Als eine Funktion:

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

Nennen Sie es zum Beispiel mit: f[6]

daniero
quelle
Sie könnten ein paar Bytes sparen, wenn Sie Eingaben als Funktionsargument nehmen:->m{l=?0;0.upto(m){puts l;l.gsub!(/1+|0+/){$&.size.to_s(2)+$&[0]}}}
blutorange
@blutorange Schön! Völlig vergessen uptound ! - Danke :)
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()

Irgendwie die Kombination von itertoolslänger als reund groupbyzurückkehr grouperObjekte mittels daß regex verwendet , ist ein bisschen kürzer ...

Sp3000
quelle
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
quelle
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
quelle