Обчисліть бінарну послідовність трикутника Сірпінського


23

Послідовність бінарного трикутника Сірпінського - це послідовність чисел, двійкові представлення яких дають рядки Бінарного Сірпінського трикутника, яка задається, починаючи з 1 у нескінченному ряду нулів, а потім повторно замінюючи кожну пару біт на xor цих біт , як:

f(0)=      1                    =1
f(1)=     1 1                   =3
f(2)=    1 0 1                  =5
f(3)=   1 1 1 1                 =15
f(4)=  1 0 0 0 1                =17

Більше цифр наведено на OEIS: https://oeis.org/A001317

Введення: Невід'ємне ціле число n у будь-якому форматі, який вам подобається. (Має працювати для всіх n до 30).

Вихід: n-й член (0-індексований) послідовності у вигляді десяткового числа.

Це тож спробуйте дати найкоротший відповідь, у байтах якого вміє ваша мова. Відповідь не буде прийнято. Застосовуються стандартні лазівки (наприклад, відсутність жорсткого кодування послідовності), за винятком того, що ви можете використовувати мову, створену / модифіковану після опублікування цього виклику. (Не уникайте публікації іншого рішення мовою, яка вже використовувалася, якщо ваше рішення коротше.)

Таблиця лідерів

Фрагмент стека внизу цієї публікації генерує каталог з відповідей а) як список найкоротших варіантів для кожної мови та б) як загальний таблиця лідерів.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

## Language Name, N bytes

де Nрозмір вашого подання. Якщо ви покращите свій рахунок, ви можете зберегти старі бали у заголовку, прокресливши їх. Наприклад:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Якщо ви хочете включити у свій заголовок декілька чисел (наприклад, тому що ваш результат становить суму двох файлів або ви хочете окремо вказати штрафні санкції для перекладача), переконайтесь, що фактичний результат - це останнє число у заголовку:

## Perl, 43 + 2 (-p flag) = 45 bytes

Ви також можете зробити ім'я мови посиланням, яке з’явиться у фрагменті:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


8
Я не є великим шанувальником, я не повинен давати неправильну відповідь ні на яке . Це в основному змушує мови, які не використовують цілі числа довільної точності за замовчуванням, щоб перевірити, чи вхід недостатньо малий ...
Dennis

Будь ласка, уточніть, чи правильно ви розумієте правила (див. Коментарі тут і тут ), і якщо округлений вихід (наприклад, 1.288490189e10 для введення 33) вважається неправильним .
Денніс

"Має працювати для всіх n до 30, і не повинно виводити неправильну відповідь для жодного n." . Це суперечливо - напевно, "не повинно дати неправильної відповіді" - це те саме, що "Треба працювати" ???
Цифрова травма

5
Через перевагу широкого протистояння необгрунтованому та душевному тягарям перевірки введення, ця вимога була знята. Ви можете вивозити будь-яке сміття для великих російських. Насолоджуйтесь!
кінтопія

2
Замість того, щоб сказати, що результат не повинен бути помилковим, я б рекомендував просто сказати, що подання має підтримувати вхід до найбільшого, nдля якого нічого не переповнюється.
Олексій А.

Відповіді:


14

05AB1E , 5 4 байти

Я з гордістю представляю тобі, 05AB1E. Хоча це дуже коротко, але, ймовірно, дуже погано при довгих викликах.

Завдяки ETHproductions за гоління 1 байт :)

$Fx^

Пояснення:

$      # Pushes 1 and input
 F     # Pops x, creates a for-loop in range(0, x)
  x    # Pops x, pushes x and 2x
   ^   # Bitwise XOR on the last two elements
       # Implicit, ends the for-loop
       # Implicit, nothing has printed so the last element is printed automatically

Ви знаєте, хороший спосіб перемогти байт у багатьох програмах на спеціальній мові - це зробити трейлінг }автоматично вставленим. Тоді це було б 4 байти. :)
ETHproductions

1
@ETHproductions Почекайте хвилину, що вже реалізовано :). Дякуємо за гоління 1 байт-ха-ха
Аднан

2
У цьому коді помилка. Звідки я знаю? Це побиття Денніса.
Арктур

2
@Ampora Це не тільки побиття Денніса, це і побиття Денніса на власному гольф-мові. ;)
ETHproductions

@Adnan Wow Ти на щось.
РК.


6

Желе , 6 байт

1Ḥ^$³¡

Спробуйте в Інтернеті!

Бінарна версія, яка працює з цією редакцією інтерпретатора Jelly, має дамп xxd

0000000: 31 a8 5e 24 8b 80  1.^$..

Як це працює

1Ḥ^$³¡    Input: n

1         Set the left argument to 1.
 Ḥ        Multiple the left argument by two.
  ^       Hook; XOR it with its initial value.
   $      Create a monadic chain from the last two insructions.
    ³¡    Call the chain n times, updating the left argument after each call.

5

Haskell, 44 байти

import Data.Bits
f n=iterate((2*)>>=xor)1!!n

У ((->) r)монаді (f >>= g) xдорівнює g (f x) x.


Я думаю, ви можете анонімізувати останній рядок до(iterate((2*)>>=xor)1!!)
xnor

Я спробував це, але це не спрацювало з жахливих причин обмеження мономорфізму .
Лінн

Однак це може застосовуватися як юридичний вираз, оскільки обмеження мономорфізму застосовується не до виразів, а до декларацій. І вирази вважаються юридичними відповідями, якщо я не помиляюся.
гордий haskeller

4

Матлаб, 45 байт

Рішення:

@(i)2.^[0:i]*diag(mod(fliplr(pascal(i+1)),2))

Тест:

ans(10)
ans =
1285

Пояснення: pascalбудує трикутник Паскаля, але він починається з 1, тому введення має бути i+1. fliplrобертає масив зліва направо. mod(_,2)займає залишок після ділення на 2. diagвитягує головну діагональ. Множення за допомогою 2.^[0:i]перетворює вектор у десятковий

Я радий, @flawr, що знайшов конкурента Matlab тут :)


Здається, працює і з Octave.
Денніс

4

JavaScript (ES6), 23 байти

f=x=>x?(y=f(x-1))^y*2:1

На основі першої формули на сторінці OEIS. Якщо ви не заперечуєте проти того, щоб код майже назавжди закінчився введенням 30, ми можемо оббризати байт:

f=x=>x?f(--x)^f(x)*2:1

Ось нерекурсивна версія, що використовує forцикл у eval: (32 байти)

x=>eval("for(a=1;x--;a^=a*2);a")

Як написано наразі правила, ця відповідь недійсна, оскільки f(35)повертається 15. Крім того, попередження про вилку бомби: мені довелося змусити закрити Chromium, щоб зупинити f(30)(оригінальна версія) від запуску. : P
Денніс

1
@ Денніс Зачекайте, тож якщо я не можу вивести неправильне значення, що мені робити з введеннями вище 30?
ETHproductions

Я не впевнений (і, сподіваюся, правило змінилося ), але щось подібне f=x=>x?(y=f(x-(x<31)))^y*2:1спрацювало б.
Денніс

@ Денніс Ах, повторюйте нескінченно = немає результату. Я це виправлю, коли повернусь до свого комп’ютера. Я сподіваюся, що це правило також зміниться.
ETHproductions

Правило було видалено з питання.
Денніс

3

Матлаб, 77 70 байт

Ця функція обчислює n-й ряд трикутника Паскаля за допомогою повторного згортання [1,1](aka біноміальне розширення або повторне множення на двочлен) і обчислює число з цього.

function r=c(n);k=1;for i=1:n;k=conv(k,[1,1]);end;r=2.^(0:n)*mod(k,2)'

3

Рубін, 26 байт

анонімна функція з ітерацією.

->n{a=1;n.times{a^=a*2};a}

ця рекурсивна функція на один байт коротша, але оскільки її потрібно називати, щоб мати можливість посилатися на себе, вона закінчується на один байт довше.

f=->n{n<1?1:(s=f[n-1])^s*2}

3

Рубін, 25 байт

->n{eval"n^=2*"*n+?1*n=1}

Коротше, ніж інші відповіді на даний момент поки що. Він будує цей рядок:

n^=2*n^=2*n^=2*n^=2*1

Потім він встановлює n=1(це насправді відбувається під час створення рядка) і оцінює вищезазначений рядок, повертаючи результат.


Чи *n=1насправді це щось рятуєm=1;"m^=2*"*n+?1
Мартін Ендер

Ні, але робити це лише однією змінною - це дуже показно :)
Лінн

3

Самау , 4 байти

Тепер Samau має вбудовані функції для множення XOR XOR та потужності XOR.

▌3$ⁿ

Шестнадцятковий дамп (Samau використовує кодування CP737):

dd 33 24 fc

Пояснення:

▌       read a number
 3      push 3
  $     swap
   ⁿ    take the XOR power

Чи можна це зменшити до 3-х байт, замінивши перші дві команди та усунувши своп?
Кінтопія

@quintopia Ні. Самау автоматично висуває вкладку на стек у вигляді рядка і зчитує число з рядка. Якщо ми поміняємо місцями перші дві команди, воно спробує прочитати число 3, яке не є рядком.
алефальфа

Чому Samau не намагається зрівняти рядок, коли це можливо?
Кінтопія


2

Pure Bash (без зовнішніх утиліт), 37

Цілі числа Bash підписані 64-бітними, тому це працює для входів до 62 включаючи:

for((x=1;i++<$1;x^=x*2)){
:
}
echo $x

2

Python 2.7.6, 38 33 байт

Дякуємо Деннісу за те, що поголив кілька байтів!

x=1
exec'x^=x*2;'*input()
print x

1
Ласкаво просимо до головоломки програмування та коду для гольфу! exec'x^=x*2;'*input()економить кілька байт на forпідході.
Денніс

Це обіграє мій запис Python, який я просто залишу тут для нащадків:f=lambda n:f(n-1)^2*f(n-1)if n>0 else 1
Джек Брунштайн



2

MIPS, 28 bytes

Вхід $a0, вихід у $v0.

0x00400004  0x24020001          li      $v0, 1
0x00400008  0x10800005  loop:   beqz    $a0, exit
0x0040000c  0x00024021          move    $t0, $v0
0x00400010  0x00021040          sll     $v0, $v0, 1
0x00400014  0x00481026          xor     $v0, $v0, $t0
0x00400018  0x2084ffff          addi    $a0, $a0, -1
0x0040001c  0x08100002          j       loop


1

k4, 26 байт

{x{2/:~(=). 0b\:'1 2*x}/1}

0b\: converts a number to a boolean vector (i.e. bitstring), XOR is implemented as "not equal", 2/: converts a bitstring back to a number by treating it as a polynomial to evaluate, and x f/y with x an integer is f applied to y first, and then to its successive outputs x times.

Sample run:

  {x{2/:~(=). 0b\:'1 2*x}/1}'!5                                                                                                                                                                                    
1 3 5 15 17

1

Ruby, 31 26 bytes

EDIT: Changed to a different language entirely! All golfing suggestions welcome!

This program bitwise XORs the previous element of the sequence with twice itself, i.e. f(n) = f(n-1) ^ 2*f(n-1).

->n{v=1;n.times{v^=2*v};v}

1

MATL, 15 bytes

Similar to @flawr's answer:

i:1w"TToX+]2\XB

EDIT (May 20, 2016) Try it online! with X+ replaced by Y+ to conform to version 18.0.0 of the language.

Example

>> matl i:1w"TToX+]2\XB
> 5
51

Explanation

i              % input                                                     
:              % vector of values 1, 2, ... to previous input                           
1              % number literal                                            
w              % swap elements in stack                                    
"              % for                                                       
    TTo        % vector [1 1]
    X+         % convolution                                               
]              % end                                                       
2\             % modulo 2
XB             % convert from binary to decimal              

1

brainfuck, 87 bytes

,[>>[>]++<[[->+>+<<]>-->[-<<+>>]<[>+<-[>-<-]]>+<<<]>>>[[-<+>]>]<<[<]<-]>>[<[->++<]>>]<+

Try it online!

Assumes infinite sized cells (otherwise it can’t get past 7, which is conveniently 255). The Pascal’s triangle mod 2 method is actually much longer because of the costly mod 2 operation, while XOR is much easier to implement.


0

APL, 31 bytes

{({2⊥⊃~1 2=.{(64⍴2)⊤⍺×⍵}⍵}⍣⍵)1}

This is almost certainly awful code, but I'm a complete APL newb. I expect anyone with any skill could get rid of all the D-functions and shorten it considerably. The logic is more or less the same as my k4 answer -- multiply by 1 or 2, convert to bits with , XOR using not equals, convert back to a number with , wrap the whole thing in a function and ask for a specific number of iterations using . I have no idea why the result coming out of the inner product is enclosed, but cleans that up.


You should be able to save a byte by changing ~1 2=. to 1 2≠.
Zacharý

And, which APL system is this on? If it's on Dyalog, you should be able to make it {({2⊥⊃1 2≠.((64⍴2)⊤×)⍵}⍣⍵)1} [28 bytes]
Zacharý

0

Seriously, 12 bytes

2,╣`2@%`Mεj¿

Hex Dump:

322cb960324025604dee6aa8

Try it online

Since Seriously does not include any means of doing a bitwise xor, this solution takes the challenge completely literally, directly computing the given row of the triangle. This method gives correct answers up to n=1029 (after which there is not enough memory to compute the given row of Pascal's triangle).

Explanation:

 ,                       get input
  ╣                 push the nth row of pascal's triangle
   `2@%`M           take each element of the row mod 2
         εj         join all the binary digits into a string
2          ¿        interpret it as a base 2 number

0

Pyt, 40 10 bytes

Đ0⇹Řć2%ǰ2Ĩ

Explanation:

Observing that the Binary Sierpinski Triangle is equivalent to Pascal's Triangle mod 2,

                      Implicit input
Đ                     Duplicate input
 0⇹Ř                  Push [0,1,2,...,input]
    ć2%               Calculate the input-th row of Pascal's Triangle mod 2
       ǰ              Join elements of the array into a string
        2Ĩ            Interpret as a binary number
                      Implicit print

Try it online!


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.