Yinelemeli İkili Açıklama


14

Yinelemeli İkili Açıklama

Son zamanlarda, A049064 sekansına bir b dosyası genişletip ekleyerek OEIS'e ilk katkımı yaptım . Dizi ile başlar 0ve sonraki değerler son öğenin "ikili açıklaması" verilmesinden türetilir.

Örneğin, ikinci terim olurdu 10, çünkü 0ilk elementte bir tane vardı. Üçüncü terim olurdu 1110, çünkü bir 1ve bir vardı 0. Dördüncü olurdu 11110. çünkü üç ( 11ikili olarak!) 1 s ve bir tane var 0. Aşağıda bu süreci açıklığa kavuşturmak için beşinci dönemin dökümü verilmiştir:

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

İşte 6. - 7. terim için bir örnek:

> 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

Bir referans programı kontrol edebilirsiniz φ Ben terimleri hesaplamak için yaptı.

Senin işin

Standart girdi veya işlev bağımsız değişkenleri aracılığıyla bir sayı alan ve diziyi terimden terime, yeni satırla ayırarak yazdıran bir program veya işlev oluşturmanız gerekir . Düşük sayılara bakmak isterseniz, OEIS sayfasından b dosyasına başvurabilirsiniz. Ancak, programınız / işleviniz , yani 31. döneme kadar desteklemelidir . 140.000 basamak uzunluğunda olduğu gibi bu küçük bir başarı değildir δ . 31'inci terimin ne olması gerektiğini görmek istiyorsanız, Pastebin'e koydum .n1st(n+1)th0 <= n <= 30A049064(30)

Örnek G / Ç

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

func(0)
0

func(3)
0
10
1110
11110

Tek bir kural var: Standart boşluk yok!

Bu , bu yüzden en düşük bayt sayısı kazanır.


G - Gist burada bulunabilir ve bir ideone demosu burada .

δ - Merak ediyorsanız, 100'üncü dönem uzunluğundaki tahminlerim yaklaşık 3.28x10 250 karakter uzunluğundaydı, bu da herkesin hesaplaması için oldukça fazla olurdu.


Liste olarak çıktıya izin veriliyor mu? Beğen[0]\n[1, 0]\n[1, 1, 1, 0]\n...
Jakube

@ Jakube Hayır, üzerinde bir dize birleştirmesi yapmanız gerekecek.
Kade

5
OEIS'e katkıda bulunduğunuz için tebrikler!
Alex

Yanıtlar:


8

CJam, 18 17 bayt

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

@ MartinBüttner'a bir baytlık golf için teşekkürler!

CJam yorumlayıcısında çevrimiçi deneyin .

Nasıl çalışır

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 bayt

J]0VQjk~JsjR2srJ8

Çevrimiçi deneyin: Gösteri

@İsaacg'a bir bayt kaydettiği için teşekkürler.

Açıklama:

                     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

Bu, ikili dosyadaki 0 ​​ve 1'in de 0 ve 1 olduğu gerçeğini kullanır.


Bu, Vyerine 1 bayt daha kısadır .u:J]0VQjk~JsjR2srJ8
isaacg

2

Python 2, 125 116 110 bayt

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

@ Sp3000 sayesinde 1 bayt ve yedekli intaramayı kaldırarak 5 bayt kaydedildi .

Eski versiyon:

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- sayesinde çok, çok bayt kurtardı!

Orijinal versiyon:

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

Yakut, 80 72 69 bayt

İşlev olarak:

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

Örneğin aşağıdakilerle arayın: f[6]


İşlev argümanı olarak girdi alırsanız birkaç bayt kaydedebilirsiniz:->m{l=?0;0.upto(m){puts l;l.gsub!(/1+|0+/){$&.size.to_s(2)+$&[0]}}}
blutorange

@blutorange Güzel! Tamamen unuttum uptove ! - Teşekkürler :)
daniero

1

Python 2, 102 bayt

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

Bir itertoolsşekilde daha uzun olma reve nesneleri groupbydöndürme kombinasyonu, groupernormal ifade kullanmanın biraz daha kısa olduğu anlamına gelir ...


0

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

Haskell, 136130 Bayt

import Text.Printf
import Data.List
f n=putStr.unlines.take(n+1).iterate(concatMap(\n->(printf"%b"$length n)++[head n]).group)$"0"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.