คำนวณลำดับเลขฐานสอง Sierpinski ของไบนารี


23

Binary Sierpinski Triangle Sequence คือลำดับของตัวเลขซึ่งการแทนเลขฐานสองให้แถวของ Binary Sierpinski Triangle ซึ่งให้โดยเริ่มต้นด้วย 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 ในรูปแบบที่คุณต้องการ (ต้องใช้ได้กับทุกคนไม่เกิน 30 คน)

เอาต์พุต: คำที่ n (ดัชนี 0) ของลำดับเป็นตัวเลขทศนิยม

นี่คือดังนั้นลองตอบคำถามสั้น ๆ เป็นไบต์ซึ่งภาษาของคุณมีความสามารถ จะไม่ยอมรับคำตอบ ช่องโหว่มาตรฐานใช้ (เช่นไม่มีการเข้ารหัสลำดับยาก) ยกเว้นว่าคุณอาจใช้ภาษาที่สร้าง / แก้ไขหลังจากการโพสต์ความท้าทายนี้ (อย่าหลีกเลี่ยงการโพสต์วิธีแก้ไขปัญหาอื่นในภาษาที่มีการใช้ไปแล้วเว้นแต่ว่าโซลูชันของคุณจะสั้นกว่า)

ลีดเดอร์บอร์ด

สแต็คส่วนย่อยที่ด้านล่างของโพสต์นี้สร้างแคตตาล็อกจากคำตอบ a) เป็นรายการคำตอบสั้นที่สุดต่อภาษาและ b) เป็นลีดเดอร์บอร์ดโดยรวม

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต 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
ฉันไม่ได้เป็นแฟนตัวยงของจะต้องไม่ส่งออกเป็นคำตอบที่ถูกต้องสำหรับ n โดยพื้นฐานแล้วจะบังคับภาษาที่ไม่ใช้จำนวนเต็มความแม่นยำตามอำเภอใจโดยค่าเริ่มต้นเพื่อตรวจสอบว่าอินพุตมีขนาดเล็กเพียงพอหรือไม่
Dennis

กรุณาชี้แจงถ้าเข้าใจกฎระเบียบอย่างถูกต้อง (ดูความคิดเห็นที่นี่และที่นี่ ) และหากการส่งออกโค้งมน (เช่น 1.288490189e10 สำหรับการป้อนข้อมูล 33) นับเป็นผิด
เดนนิส

"ต้องใช้งานได้กับ n ทั้งหมดถึง 30 และต้องไม่ส่งคำตอบที่ผิดสำหรับ n ใด ๆ " . นี่คือความขัดแย้งในตัวเอง - แน่นอนว่า"ต้องไม่ส่งคำตอบที่ผิด"เหมือนกับ"ต้องทำงาน" ???
บาดเจ็บทางดิจิตอล

5
เนื่องจากการต่อต้านที่ได้รับความนิยมอย่างล้นหลามต่อภาระการตรวจสอบความถูกต้องของข้อมูลที่ไม่มีเหตุผลและไม่มีเหตุผลข้อกำหนดนี้จึงถูกลบออก คุณสามารถส่งออกขยะใด ๆ ที่คุณต้องการสำหรับ n ขนาดใหญ่ สนุก!
quintopia

2
แทนที่จะบอกว่าผลลัพธ์ไม่ควรผิดฉันขอแนะนำเพียงแค่บอกว่าการส่งผลงานต้องสนับสนุนอินพุตที่ใหญ่ที่สุดnโดยไม่มีสิ่งใดล้นเกิน
Alex A.

คำตอบ:


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 ไบต์ฮ่าฮ่า
Adnan

2
มีข้อบกพร่องในรหัสนี้ ฉันจะรู้ได้อย่างไร มันเต้นเดนนิส
Arcturus

2
@Ampora ไม่เพียง แต่จะเต้น Dennis เท่านั้น แต่ยังตีภาษากอล์ฟของ Dennis ด้วย ;)
ETHproductions

@Adnan Wow คุณกำลังจะทำอะไรบางอย่าง
RK


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)monad, เท่ากับ(f >>= g) xg (f x) x


ฉันคิดว่าคุณสามารถปิดบังบรรทัดสุดท้ายไปที่(iterate((2*)>>=xor)1!!)
xnor

ฉันลองมัน แต่มันใช้งานไม่ได้ด้วยเหตุผลข้อ จำกัด monomorphism ที่หวั่นกลัว
Lynn

อย่างไรก็ตามนั่นอาจใช้เป็นนิพจน์ทางกฎหมายเนื่องจากข้อ จำกัด monomorphism ใช้ไม่ได้กับการแสดงออก แต่เป็นการประกาศ และการแสดงออกถือเป็นคำตอบทางกฎหมายถ้าฉันไม่ผิด
ภูมิใจ haskeller

4

Matlab ขนาด 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 ที่นี่ :)


ดูเหมือนว่าจะทำงานกับอ็อกเทฟเช่นกัน
เดนนิส

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
Dennis

1
@Dennis รอดังนั้นถ้าฉันไม่สามารถส่งออกค่าที่ผิดพลาดฉันควรจะทำอย่างไรกับอินพุตที่สูงกว่า 30?
ETHproductions

ฉันไม่แน่ใจ (และฉันหวังว่ากฎจะเปลี่ยน ) แต่สิ่งที่ต้องการf=x=>x?(y=f(x-(x<31)))^y*2:1จะใช้งานได้
Dennis

@Dennis Ah, rec เพียบ infinitely = ไม่มีเอาต์พุต ฉันจะแก้ไขปัญหานี้เมื่อฉันกลับไปที่คอมพิวเตอร์ของฉัน ฉันหวังว่ากฎจะเปลี่ยนไปเช่นกัน
ETHproductions

กฎถูกลบออกจากคำถาม
เดนนิส

3

Matlab, 77 70 ไบต์

ฟังก์ชันนี้จะคำนวณแถวที่ n ของสามเหลี่ยมปาสคาลผ่านการทำซ้ำประโยคด้วย[1,1](การขยายแบบทวินามหรือการคูณซ้ำด้วยทวินาม) และคำนวณจำนวนจากนั้น

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

Samau , 4 ไบต์

ตอนนี้ซามัวมีฟังก์ชั่นในตัวสำหรับการคูณ XOR และพลังงาน XOR

▌3$ⁿ

Hex dump (Samau ใช้การเข้ารหัส CP737):

dd 33 24 fc

คำอธิบาย:

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

สิ่งนี้จะลดลงเหลือ 3 ไบต์โดยการสลับคำสั่งสองคำสั่งแรกและกำจัดการสลับหรือไม่
quintopia

@quintopia No. Samau ส่งสัญญาณอินพุตไปยังสแต็กโดยอัตโนมัติเป็นสตริงและอ่านตัวเลขจากสตริง หากเราสลับสองคำสั่งแรกมันจะพยายามอ่านตัวเลขจาก3ซึ่งไม่ใช่สตริง
alephalpha

ทำไม samau ถึงไม่ลอง eval string เมื่อทำได้
quintopia



2

Python 2.7.6, 38 33 ไบต์

ขอบคุณเดนนิสที่โกนหนวดออกไปสองสามไบต์!

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

1
ยินดีต้อนรับสู่ Programming Puzzles & Code Golf! exec'x^=x*2;'*input()บันทึกไม่กี่ไบต์กว่าforวิธีการ
เดนนิส

นี่คือการบันทึก Python ของฉันซึ่งฉันจะทิ้งไว้ที่นี่เพื่อลูกหลาน:f=lambda n:f(n-1)^2*f(n-1)if n>0 else 1
Jack Brounstein



2

MIPS, 28 ไบต์

การป้อนข้อมูลในการส่งออกใน$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\:แปลงตัวเลขให้เป็นบูลีนเวกเตอร์ (เช่น bitstring), XOR ถูกนำมาใช้เป็น "ไม่เท่ากัน", 2/:แปลง bitstring กลับไปที่ตัวเลขโดยถือว่าเป็นพหุนามเพื่อประเมินผลและx f/yด้วยxจำนวนเต็มจะถูกfนำไปใช้yก่อนแล้วจึงเปลี่ยนเป็น เอาท์พุทต่อเนื่องxครั้ง

วิ่งตัวอย่าง:

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

1

Ruby, 31 26 ไบต์

แก้ไข:เปลี่ยนเป็นภาษาอื่นโดยสิ้นเชิง! ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟทั้งหมด!

บิตโปรแกรมนี้ XORs f(n) = f(n-1) ^ 2*f(n-1)องค์ประกอบที่ก่อนหน้านี้ของลำดับด้วยตัวเองเป็นครั้งที่สองคือ

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

1

MATL , 15 ไบต์

คล้ายกับคำตอบของ @ flawr :

i:1w"TToX+]2\XB

แก้ไข (20 พฤษภาคม 2016) ลองออนไลน์! ด้วยX+แทนที่ด้วยY+เพื่อให้สอดคล้องกับรุ่น 18.0.0 ของภาษา

ตัวอย่าง

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

คำอธิบาย

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 ไบต์

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

ลองออนไลน์!

ถือว่าเซลล์ขนาดไม่ จำกัด (ไม่เช่นนั้นจะไม่สามารถผ่าน 7 ซึ่งเป็น 255 ได้อย่างสะดวก) จริง ๆ แล้ววิธีสามเหลี่ยม mod 2 ของ Pascal นั้นใช้เวลานานกว่ามากเนื่องจากการดำเนินการ mod 2 ที่มีราคาแพงในขณะที่ XOR นั้นง่ายต่อการใช้งาน


0

APL, 31 ไบต์

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

นี่เป็นรหัสที่แย่มาก แต่ฉันเป็น APL ที่สมบูรณ์ ฉันคาดหวังว่าทุกคนที่มีความสามารถจะสามารถกำจัด D-function ทั้งหมดและทำให้สั้นลงอย่างมาก ตรรกะนั้นมากหรือน้อยเหมือนกับk4คำตอบของฉัน- คูณด้วย1หรือ2แปลงเป็นบิตด้วย, XOR ที่ใช้ไม่เท่ากับ, แปลงกลับเป็นตัวเลขด้วย, ห่อทุกสิ่งในฟังก์ชั่นแล้วถามจำนวนซ้ำโดยใช้. ฉันไม่รู้ว่าทำไมผลที่ออกมาจากผลิตภัณฑ์ด้านในนั้นถูกปิดล้อม แต่ทำความสะอาดสิ่งนั้น


คุณควรจะสามารถบันทึกไบต์โดยเปลี่ยน~1 2=.เป็น1 2≠.
Zacharý

แล้วระบบ APL นี้เป็นแบบไหน? หากอยู่ใน Dyalog คุณควรจะสามารถทำได้{({2⊥⊃1 2≠.((64⍴2)⊤×)⍵}⍣⍵)1}[28 bytes]
Zacharý

0

จริงจัง 12 ไบต์

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

ฐานสิบหก:

322cb960324025604dee6aa8

ลองออนไลน์

เนื่องจากอย่างจริงจังไม่ได้รวมวิธีการใด ๆ ในการทำ bitor xor การแก้ปัญหานี้ใช้ความท้าทายอย่างแท้จริงแท้จริงคำนวณแถวที่กำหนดของรูปสามเหลี่ยมโดยตรง วิธีนี้ให้คำตอบที่ถูกต้องสูงสุด n = 1,029 (หลังจากนั้นมีหน่วยความจำไม่เพียงพอที่จะคำนวณแถวของสามเหลี่ยมปาสคาลที่กำหนด)

คำอธิบาย:

 ,                       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 ไบต์

Đ0⇹Řć2%ǰ2Ĩ

คำอธิบาย:

การสังเกตว่าสามเหลี่ยมไบนาชปินสกี้สามเหลี่ยมนั้นเทียบเท่ากับสามเหลี่ยมดัดแปลงของปาสกาล 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

ลองออนไลน์!


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.