Oblicz binarną sekwencję trójkątów Sierpińskiego

23

Binarna sekwencja trójkąta Sierpińskiego jest sekwencją liczb, których reprezentacje binarne dają rzędy binarnego trójkąta Sierpińskiego, którą podaje się zaczynając od 1 w nieskończonym rzędzie zer, a następnie wielokrotnie zastępując każdą parę bitów xor tych bitów , tak jak:

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

Więcej cyfr podano w OEIS: https://oeis.org/A001317

Dane wejściowe: nieujemna liczba całkowita n w dowolnym formacie. (Musi działać dla wszystkich n do 30.)

Wyjście: n-ty składnik (indeksowany 0) sekwencji jako liczba dziesiętna.

To jest więc postaraj się udzielić najkrótszej odpowiedzi w bajtach, jaką potrafi Twój język. Żadna odpowiedź nie zostanie zaakceptowana. Obowiązują standardowe luki (np. Brak kodowania sekwencji na stałe), z wyjątkiem ciebie mogą używać języka utworzone / zmodyfikowane po to wyzwanie została wysłana. (Unikaj publikowania innego rozwiązania w języku, który był już używany, chyba że twoje rozwiązanie jest krótsze).

Tabela liderów

Fragment kodu na dole tego postu generuje katalog na podstawie odpowiedzi a) jako listy najkrótszych rozwiązań według języka oraz b) jako ogólnej tabeli wyników.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

## Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik to suma dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

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

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie:

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

kwintopia
źródło
8
Nie jestem wielkim fanem, nie wolno podawać złej odpowiedzi dla żadnego n . To w zasadzie zmusza języki, które domyślnie nie używają liczb całkowitych precyzji do sprawdzenia, czy dane wejściowe są wystarczająco małe ...
Dennis
Wyjaśnij, czy poprawnie zrozumiałeś reguły (patrz komentarze tutaj i tutaj ) oraz czy zaokrąglone dane wyjściowe (np. 1.288490189e10 dla danych wejściowych 33) są uważane za nieprawidłowe .
Dennis,
„Musi działać dla wszystkich n do 30 i nie może podawać złej odpowiedzi dla żadnego n.” . Jest to wewnętrznie sprzeczne - z pewnością „nie wolno podawać złej odpowiedzi” jest tym samym, co „musi działać” ???
Cyfrowy uraz
5
Z powodu przeważającej powszechnej opozycji wobec nieuzasadnionego i przytłaczającego ciężaru walidacji danych wejściowych wymóg ten został usunięty. Możesz wypisać dowolne śmieci dla dużej liczby n. Cieszyć się!
kwintopia
2
Zamiast mówić, że dane wyjściowe nie powinny być błędne, polecam po prostu powiedzieć, że przesłane dane muszą obsługiwać dane wejściowe do największej, ndla której nic się nie przelewa.
Alex A.,

Odpowiedzi:

14

05AB1E , 5 4 bajtów

Z dumą przedstawiam wam, 05AB1E. Chociaż jest bardzo krótki, prawdopodobnie jest bardzo zły przy długich wyzwaniach.

Dzięki produktom ETH za golenie 1 bajtu :)

$Fx^

Wyjaśnienie:

$      # 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
Adnan
źródło
Wiesz, dobrym sposobem na zagranie w bajt wielu programów w niestandardowym języku jest }automatyczne wstawianie trailingu . To byłyby 4 bajty. :)
ETHproductions
1
@ETHproductions Poczekaj chwilę, to już zostało zaimplementowane :). Dzięki za wygolenie 1 bajta haha.
Adnan
2
W tym kodzie jest błąd. Skąd mam wiedzieć? To bije Dennisa.
Arcturus,
2
@Ampora Nie tylko pokonuje Dennisa, ale także niestandardowy język golfowy Dennisa. ;)
ETHproductions
@Adnan Wow. Jesteś na czymś.
RK.
12

Pari / GP , 27 bajtów

n->lift(Mod(x+1,2)^n)%(x-2)

Funkcja przyjmuje n-tą potęgę wielomianu x + 1 w pierścieniu F 2 [x], podnosi ją do Z [x], a następnie ocenia na 2.

Wypróbuj online!

alephalpha
źródło
6

Galaretka , 6 bajtów

1Ḥ^$³¡

Wypróbuj online!

Wersja binarna, która działa z tą wersją interpretera Jelly, ma zrzut xxd

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

Jak to działa

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.
Dennis
źródło
5

Haskell, 44 bajty

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

W ((->) r)monadzie (f >>= g) xrówna się g (f x) x.

Lynn
źródło
Myślę, że możesz (iterate((2*)>>=xor)1!!)
zanonimizować
Próbowałem tego, ale to nie działa, z powodu przerażających ograniczeń związanych z monomorfizmem .
Lynn
Może to jednak mieć zastosowanie jako wyrażenie prawne, ponieważ ograniczenie monomorfizmu nie dotyczy wyrażeń, ale deklaracji. A wyrażenia są uważane za odpowiedzi prawne, jeśli się nie mylę.
dumny haskeller
4

Matlab, 45 bajtów

Rozwiązanie:

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

Test:

ans(10)
ans =
1285

Objaśnienie: pascalkonstruuje trójkąt Pascala, ale zaczyna się od 1, więc wejście powinno być i+1. fliplrodwraca tablicę od lewej do prawej. mod(_,2)przyjmuje resztę po podzieleniu przez 2. diagwyodrębnia główną przekątną. Mnożenie za pomocą 2.^[0:i]przekształca wektor na dziesiętny

Cieszę się, @flawr, że znalazłem tutaj konkurenta Matlaba :)

Brainkz
źródło
Wydaje się również współpracować z Octave.
Dennis,
4

JavaScript (ES6), 23 bajty

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

Na podstawie pierwszej formuły na stronie OEIS. Jeśli nie przeszkadza ci to, że kod zajmuje prawie wieczność, gdy dane wejściowe wynoszą 30, możemy zgolić bajt:

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

Oto wersja nierekurencyjna, wykorzystująca forpętlę w eval: (32 bajty)

x=>eval("for(a=1;x--;a^=a*2);a")
ETHprodukcje
źródło
Reguły, jak obecnie napisano, unieważniają tę odpowiedź, ponieważ f(35)zwraca 15. Ponadto, ostrzeżenie o bombach widłowych: musiałem wymusić zamknięcie Chromium, aby zatrzymać f(30)(oryginalną wersję) od uruchomienia. : P
Dennis
1
@Dennis Poczekaj, więc jeśli nie mogę wyprowadzić żadnej niewłaściwej wartości, co mam zrobić z danymi wejściowymi wyższymi niż 30?
ETHproductions
Nie jestem pewien (i mam nadzieję, że reguła ulegnie zmianie ), ale coś takiego f=x=>x?(y=f(x-(x<31)))^y*2:1działałoby.
Dennis,
@Dennis Ah, recurse nieskończenie = brak wyjścia. Naprawię to, kiedy wrócę do komputera. Mam nadzieję, że ta zasada również się zmieni.
ETHproductions
Reguła została usunięta z pytania.
Dennis,
3

Matlab, 77 70 bajtów

Ta funkcja oblicza n-ty rząd trójkąta Pascala za pomocą powtarzalnego splotu z [1,1](aka ekspansji dwumianowej lub powtarzanego mnożenia przez dwumianowy) i na tej podstawie oblicza liczbę.

function r=c(n);k=1;for i=1:n;k=conv(k,[1,1]);end;r=2.^(0:n)*mod(k,2)'
wada
źródło
3

Rubinowy, 26 bajtów

anonimowa funkcja z iteracją.

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

ta funkcja rekurencyjna jest o jeden bajt krótsza, ale ponieważ należy ją nazwać, aby móc się do niej odwoływać, kończy się o jeden bajt dłużej.

f=->n{n<1?1:(s=f[n-1])^s*2}
Level River St
źródło
3

Rubin, 25 bajtów

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

Krótszy niż inne dotychczasowe odpowiedzi tutaj. Konstruuje ten ciąg:

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

Następnie ustawia się n=1(dzieje się tak podczas tworzenia łańcucha) i ocenia powyższy ciąg, zwracając wynik.

Lynn
źródło
Czy to *n=1naprawdę cos oszczędzam=1;"m^=2*"*n+?1
Martin Ender,
Nie, ale robienie tego przy użyciu tylko jednej zmiennej jest bardzo efektowne :)
Lynn,
3

Samau , 4 bajty

Teraz Samau ma wbudowane funkcje mnożenia XOR i mocy XOR.

▌3$ⁿ

Zrzut szesnastkowy (Samau używa kodowania CP737):

dd 33 24 fc

Wyjaśnienie:

▌       read a number
 3      push 3
  $     swap
   ⁿ    take the XOR power
alephalpha
źródło
Czy można to zmniejszyć do 3 bajtów, zamieniając pierwsze dwa polecenia i eliminując zamianę?
kwintopia
@ quintopia Nie. Samau automatycznie wypycha dane wejściowe na stos jako ciąg i odczytuje liczbę z ciągu. Jeśli zamienimy pierwsze dwa polecenia, spróbuje odczytać liczbę 3, która nie jest łańcuchem.
alephalpha
dlaczego Samau nie próbuje ewaluować łańcucha, gdy jest to możliwe?
kwintopia
2

Pure Bash (bez zewnętrznych narzędzi), 37

Liczby całkowite Bash są podpisane 64-bit, więc działa to na dane wejściowe do 62 włącznie:

for((x=1;i++<$1;x^=x*2)){
:
}
echo $x
Cyfrowa trauma
źródło
2

Python 2.7.6, 38 33 bajtów

Dzięki Dennisowi za zgolenie kilku bajtów!

x=1
exec'x^=x*2;'*input()
print x
MCS-Kaijin
źródło
1
Witamy w Programowaniu Puzzle i Code Golf! exec'x^=x*2;'*input()oszczędza kilka bajtów nad forpodejściem.
Dennis,
To bije mój wpis w Pythonie, który zostawię tutaj dla potomności:f=lambda n:f(n-1)^2*f(n-1)if n>0 else 1
Jack Brounstein
2

Pyth, 7 bajtów

uxyGGQ1

Wypróbuj online: demonstracja

Wyjaśnienie:

u    Q1   apply the following statement input-times to G=1:
 xyGG        update G with (2*G xor G)
Jakube
źródło
2

MIPS, 28 bytes

Input in $a0, output in $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
qwr
źródło
1

Mathematica, 40 24 bytes

Nest[BitXor[#,2#]&,1,#]&
alephalpha
źródło
1

k4, 26 bytes

{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
Aaron Davies
źródło
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}
Sherlock9
źródło
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              
Luis Mendo
źródło
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.

Jo King
źródło
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.

Aaron Davies
źródło
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
quintopia
źródło
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!

mudkip201
źródło
0

Stax, 5 bytes

±s┤ε─

Run and debug online!

Port of the Jelly answer.

Uses ASCII representation to explain:

ODcH|^
O         Put 1 under top of stack
 D        Repeat for times specified by input
  cH|^    Xor the number with itself doubled
          Implicit output
Weijun Zhou
źródło