Рекурсивное двоичное описание


14

Рекурсивное двоичное описание

Недавно я внес свой первый вклад в OEIS, расширив и добавив b-файл в последовательность A049064 . Последовательность начинается с 0, а затем следующие значения выводятся из «двоичного описания» последнего элемента.

Например, второй член будет 10, потому что 0в первом элементе был один . Третий срок будет 1110, потому что был один 1и один 0. Четвертый будет 11110. потому что есть три ( 11в двоичном виде!) 1 и один 0. Ниже приводится разбивка пятого слагаемого, чтобы прояснить этот процесс:

> 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

Вы можете проверить ссылочную программу φ Я сделал для расчета условий.

Твоя работа

Вам необходимо создать программу или функцию, которая принимает число nчерез стандартные аргументы ввода или функции и выводит последовательность от 1stтермина к (n+1)thтермину, разделенную новой строкой. Если вы хотите взглянуть на нижние цифры, вы можете обратиться к b-файлу со страницы OEIS. Тем не менее, ваша программа / функция должна поддерживать 0 <= n <= 30, то есть до 31-го семестра. Это не маленький подвиг, так как δA049064(30) более 140 000 цифр . Если вы хотите узнать, каким должен быть 31-й срок, я положил его на Пастебина .

Пример ввода / вывода

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

func(0)
0

func(3)
0
10
1110
11110

Существует только одно правило: никаких стандартных лазеек!

Это , поэтому выигрывает самое низкое число байтов.


φ - Gist можно найти здесь , а демонстрация ideone здесь .

δ - Просто на тот случай, если вам интересно, мои оценки по длине сотого семестра оценивают его примерно в 3,28х10 250 символов в длину, что будет достаточно для любого.


Вывод как список разрешен? Нравится[0]\n[1, 0]\n[1, 1, 1, 0]\n...
Jakube

@Jakube Нет, вам нужно присоединиться к строке.
Каде

5
Поздравляю с внесением вклада в OEIS!
Алекс А.

Ответы:


8

CJam, 18 17 байтов

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

Спасибо @ 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

Попробуйте онлайн: демонстрация

Спасибо @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.


Это на 1 байт меньше, Vвместо .u:J]0VQjk~JsjR2srJ8
isaacg

2

Python 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 и 5 байтам удалось сэкономить 1 байт, удалив избыточный intвызов.

Старая версия:

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и ! - Спасибо :)
Даниеро

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длинных reи groupbyвозвращаемых 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

Haskell, 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"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.