再帰的バイナリ記述


14

再帰的バイナリ記述

最近、シーケンスA049064に bファイルを拡張および追加することで、OEISに初めて貢献しました。シーケンスはで始まり0、次の値は最後のアイテムの「バイナリ説明」の提供から派生します。

たとえば、最初の要素10に1つあったため、2番目の用語はになり0ます。第三項は次のようになり11101があったので、1一つ0。4番目はになります11110。なぜなら3つ11バイナリで!) 1と1つだから0です。以下は、このプロセスを明確にするための第5項の内訳です。

> 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

項を計算するために作成した参照プログラムφIを確認できます。

あなたの仕事

標準入力または関数の引数を介して数値を取り込み、改行で区切られた用語から用語へのシーケンスを出力するプログラムまたは関数を作成する必要があります。小さい数字をご覧になりたい場合は、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

ルールは1つだけです。標準的な抜け穴はありません!

これはであるため、最小のバイト数が優先されます。


φ-Gistはここにあり、ideoneのデモはここにあります

δ-念のために、100番目の用語の長さでの私の見積もりでは、約3.28x10 250文字の長さであるため、計算するのは非常に多くなります。


リストとして出力できますか?いいね[0]\n[1, 0]\n[1, 1, 1, 0]\n...
ジャクベ

@ジャクベいいえ、文字列を結合する必要があります。
カデ

5
OEISへの貢献に感謝します!
アレックス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.u次の代わりに1バイト短くなります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バイト、冗長なint呼び出しを削除して5バイト節約しました。

古いバージョン:

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

Python 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

ハスケル、136の 130バイト

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.