İkili Sierpinski Üçgen Dizisini Hesaplayın


23

İkili Sierpinski Üçgeni dizisi, ikili gösterimleri sonsuz bir satırda 1 ile başlayan, ardından her bir bit çiftini bu bitlerin xor'uyla değiştirerek tekrarlayan Binary Sierpinski Üçgeni'nin satırlarını veren sayıların dizisidir. , bunun gibi:

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'te daha fazla rakam verilmiştir: https://oeis.org/A001317

Girdi: İstediğiniz herhangi bir biçimde negatif olmayan bir tam sayı n. (30'a kadar olan herkes için çalışması gerekir.)

Çıktı: Dizinin nth terimi (0 dizinli) ondalık sayı olarak.

Bu olduğundan, dilinizin yapabileceği bayt cinsinden en kısa cevabı vermeye çalışın. Hiçbir cevap kabul edilmeyecek. Standart boşluklar (örn sabit kodlama dizisi) uygulamak, o hariç olabilecek bu meydan okuma yayınlanmıştır sonra dil değiştirilme / kullanın. (Çözümünüz kısaltılmamışsa, zaten kullanılmış bir dilde başka bir çözüm yayınlamaktan kaçının.)

Liderler Sıralaması

Bu yazının altındaki Yığın Parçacığı, cevapları a) dil başına en kısa çözümün bir listesi olarak ve b) genel bir lider tablosu olarak oluşturur.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

## Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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

Başlığınıza birden çok sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğundan veya tercüman bayrağı cezalarını ayrı ayrı listelemek istediğinizden dolayı), gerçek puanın başlıktaki son sayı olduğundan emin olun :

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

Dil adını, daha sonra pasajda görünecek bir bağlantı da yapabilirsiniz:

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


8
Ben büyük bir hayranı değilim , hiçbir n için yanlış cevap vermemelisiniz . Bu temelde, girişin yeterince küçük olup olmadığını kontrol etmek için varsayılan olarak rasgele kesinlikli tamsayı kullanmayan dilleri zorlar ...
Dennis

Lütfen kuralların doğru anlaşılıp anlaşılmadığını ( buradaki ve buradaki yorumları inceleyin ) ve yuvarlak çıktının (örneğin, 33. giriş için 1.288490189e10) yanlış olduğunu sayın .
Dennis,

"30 yaşına kadar olan herkes için çalışmalı ve hiçbir n için yanlış cevap vermemelidir." . Bu kendi kendine çelişkili - elbette "yanlış bir cevap vermemeli" , "Çalışmalı" olarak aynıdır ???
Dijital Travma

5
Girdi onaylama işleminin mantıksız ve ruhsal ezilme yüküne karşı muazzam halk muhalefetinden dolayı, bu gereklilik kaldırılmıştır. Büyük n için istediğiniz çöpü çıkarabilirsiniz. Keyfini çıkarın!
quintopia

2
Çıktının yanlış olmaması gerektiğini söylemek yerine, sadece gönderilerin, nhiçbir şeyin taşmadığı en büyük seviyeye kadar olan girişi desteklemesi gerektiğini söylemenizi tavsiye ederim .
Alex A.

Yanıtlar:


14

05AB1E , 5 4 bayt

Gururla size sunarım, 05AB1E. Çok kısa olmasına rağmen, uzun zorluklarda muhtemelen çok kötü.

1 byte tıraş için ETHproductions sayesinde :)

$Fx^

Açıklama:

$      # 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

Bilirsiniz, birçok programın bir baytını özel bir dilde atmanın iyi bir yolu, izlemeyi }otomatik olarak eklemektir. O zaman bu 4 bayt olurdu. :)
ETHproductions

1
@ETHproductions Zaten uygulanmış bir dakika bekleyin :). 1 bayt haha'yı tıraş ettiğiniz için teşekkürler.
Adnan

2
Bu kodda bir hata var. Nasıl bilebilirim? Dennis'i atıyor.
Arcturus,

2
@Ampora Sadece Dennis'i dövmekle kalmıyor, Dennis'in özel golf dilini de yeniyor . ;)
ETHProductions

@Adnan Wow. Bir şey yapıyorsun.
RK.


6

Jöle , 6 bayt

1Ḥ^$³¡

Çevrimiçi deneyin!

Jelly yorumlayıcısının bu revizyonuyla çalışan ikili versiyonunda xxd dökümü var

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

Nasıl çalışır

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 bayt

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

In ((->) r)monad, (f >>= g) xeşittir g (f x) x.


Sana son satırı anonim düşünüyorum(iterate((2*)>>=xor)1!!)
XNOR

Bunu denedim, ama korkunç monomorfizm kısıtlaması nedeniyle işe yaramıyor .
Lynn

Bununla birlikte, bu monomorfizm kısıtlaması ifadelere değil beyanlara uygulandığından yasal bir ifade olarak geçerli olabilir. Yanılmıyorsam ifadeler yasal cevaplar olarak kabul edilir.
Gurur haskeller

4

Matlab, 45 bayt

Çözüm:

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

Ölçek:

ans(10)
ans =
1285

Açıklama: pascalPascal üçgeni inşa eder, ancak 1'den başlar, bu nedenle girişin olması gerekir i+1. fliplrdiziyi soldan sağa döndürür. mod(_,2)bölüm 2'den sonra kalan diagkısımları ana diagonaltan çıkarır. 2.^[0:i]Vektörü ondalık kullanarak dönüştürür.

Memnun oldum, @flawr burada Matlab yarışmacısını buldum :)


Octave ile de çalışıyor gibi görünüyor.
Dennis,

4

JavaScript (ES6), 23 bayt

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

OEIS sayfasındaki ilk formüle dayanarak. Neredeyse sonsuza kadar bir 30 giriş için bitirmek için alma kodunu sakıncası yoksa, bir bayt tıraş olabilir:

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

İşte özyinesiz versiyonu kullanılarak, var forbir in döngüeval : (32 bayt)

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

Kurallar, şu anda yazılı olarak, çünkü bu cevabı geçersiz f(35)getiriler 15. Ayrıca çatal bomba uyarısı: Chromium'u çalışmamasını f(30)(orijinal revizyonu) önlemek için zorla kapatmak zorunda kaldım . : P
Dennis,

1
@Dennis Bekleyin, bu nedenle yanlış bir değer veremezsem, 30'dan büyük girişlerle ne yapmam gerekir?
ETHProductions

Emin değilim (ve umarım kural değişir ), ama f=x=>x?(y=f(x-(x<31)))^y*2:1bunun gibi bir şey işe yarayabilir.
Dennis,

@Dennis Ah, sonsuz tekrarla = çıkış yok. Bilgisayarıma geri döndüğümde bunu düzelteceğim. Umarım bu kural da değişmiştir.
ETHProductions

Kural sorudan çıkarıldı.
Dennis,

3

Matlab, 77 70 bayt

Bu işlev Pascal üçgeninin n. Sırasını yinelenen evrişim ile [1,1](aka binom genişlemesi veya binom ile tekrarlanan çarpma) hesaplar ve bu sayıyı hesaplar.

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

3

Ruby, 26 bayt

yineleme ile anonim işlev.

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

bu özyinelemeli işlev bir bayt daha kısadır, ancak kendisine atıfta bulunabilmesi için adlandırılması gerektiğinden, bir bayt daha uzun olur.

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

3

Yakut, 25 bayt

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

Buradaki diğer cevaplardan daha kısa. Bu dizeyi oluşturur:

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

Sonra ayarlar n=1(bu aslında dize yapılırken gerçekleşir) ve yukarıdaki dizgiyi değerlendirerek sonucu döndürür.


Bu *n=1aslında bir şeyleri kurtarıyor mum=1;"m^=2*"*n+?1
Martin Ender

Hayır, ama sadece bir değişkenle yapmak çok gösterişli :)
Lynn

3

Samau , 4 bayt

Şimdi Samau, XOR çarpımı ve XOR gücü için yerleşik işlevlere sahiptir .

▌3$ⁿ

Hex dökümü (Samau, CP737 kodlamasını kullanır):

dd 33 24 fc

Açıklama:

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

İlk iki komutu değiştirip takas işlemini kaldırarak bu 3 bayta indirgenebilir mi?
quintopia,

@quintopia No. Samau girişi otomatik olarak yığına dizge olarak iter ve dizeden bir sayı okur. İlk iki komutu değiştirirsek, 3bir dize olmayan bir sayı okumaya çalışır .
alephalpha

samau neden mümkünse ipi değerlendirmeye çalışmıyor?
quintopia


2

Saf Bash (harici yardımcı program yoktur), 37

Bash tamsayıları 64 bit işaretlidir, bu yüzden 62'ye kadar girişler için çalışır:

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

2

Python 2.7.6, 38 33 bayt

Dennis'e birkaç baytı tıraş ettiğin için teşekkürler!

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

1
Programlama Bulmacaları ve Kod Golf'üne Hoşgeldiniz! yaklaşımın exec'x^=x*2;'*input()üzerine birkaç bayt kaydeder for.
Dennis,

Bu benim Python girişimi atıyor, ben sadece buraya f=lambda n:f(n-1)^2*f(n-1)if n>0 else 1
gelecekler

2

Pyth, 7 bayt

uxyGGQ1

Çevrimiçi deneyin: Gösteri

Açıklama:

u    Q1   apply the following statement input-times to G=1:
 xyGG        update G with (2*G xor G)


2

MIPS, 28 bayt

Giriş girişi $a0, çıkış girişi $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 bayt

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

0b\:bir boolean vektörüne dönüştürülen bir sayı (yani Bit dizisi), XOR "eşit değil" olarak uygulanır, 2/:değerlendirmek için bir polinom olarak işlenmesiyle bir sayıya Bit dizisi geri dönüştürür ve x f/ysahip xbir tam sayı olduğu ftatbik yiçin daha sonra ilk ve onun art arda çıktılarx zamanları.

Örnek çalışma:

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

1

Ruby, 31 26 bayt

EDIT: Tamamen farklı bir dile değiştirildi! Tüm golf önerileri hoş geldiniz!

Bu program bitsel XOR, dizinin önceki elemanını iki kere kendisi, yani f(n) = f(n-1) ^ 2*f(n-1).

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

1

MATL , 15 bayt

@ Flawr adlı kullanıcının cevabına benzer :

i:1w"TToX+]2\XB

EDIT (20 May 2016) Çevrimiçi dene! ile X+yerini Y+dilin sürümüne 18.0.0 uyması için.

Örnek

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

açıklama

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 bayt

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

Çevrimiçi deneyin!

Sonsuz büyüklükteki hücreleri varsayar (aksi takdirde uygun bir şekilde 255 olan 7'yi geçemez). Pascal'ın üçgen mod 2 yöntemi aslında pahalı mod 2 işleminden dolayı çok daha uzun sürerken XOR'un uygulanması çok daha kolaydır.


0

APL, 31 bayt

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

Bu neredeyse kesinlikle korkunç bir kod, ancak ben tam bir APL newb. Herhangi bir beceriye sahip olanların tüm D-fonksiyonlarından kurtulabilmelerini ve çok kısa sürmelerini beklerim. Mantık benim k4cevabımla hemen hemen aynıdır - ile çarpın 1ya da 2, bitlerle dönüştürün , XOR ile eşit değil, bir sayıya geri dönün , her şeyi bir işleve sarın ve kullanarak belirli sayıda yineleme isteyin . İç üründen çıkan sonucun neden kapalı olduğu hakkında hiçbir fikrim yok, ancak bunu temizliyor.


Sen değiştirerek byte kaydetmek gerekir ~1 2=.için1 2≠.
Zachary

Ve, hangi APL sistemi açık? Eğer {({2⊥⊃1 2≠.((64⍴2)⊤×)⍵}⍣⍵)1}
Dyalog'daysa,

0

Cidden, 12 bayt

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

Hex Dump:

322cb960324025604dee6aa8

Çevrimiçi deneyin

Cidden cidden bitsel xor yapmanın herhangi bir yolunu içermediğinden, bu çözüm tam anlamıyla, üçgenin verilen satırını doğrudan hesaplayarak meydan okumayı üstlenir. Bu yöntem n = 1029'a kadar doğru cevap verir (bundan sonra verilen Pascal üçgeni sırasını hesaplamak için yeterli bellek yoktur).

Açıklama:

 ,                       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 bayt

Đ0⇹Řć2%ǰ2Ĩ

Açıklama:

İkili Sierpinski Üçgeni'nin Pascal Üçgeni mod 2'ye eşdeğer olduğunu gözlemleyerek,

                      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

Çevrimiçi deneyin!


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.