Tính toán chuỗi tam giác nhị phân Sierpinki


23

Chuỗi Tam giác nhị phân nhị phân là chuỗi các số có biểu diễn nhị phân cho các hàng của Tam giác nhị phân nhị phân, được đưa ra bằng cách bắt đầu bằng 1 trong một hàng số vô hạn, sau đó liên tục thay thế mọi cặp bit bằng xor của các bit đó , như vậy:

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

Nhiều chữ số được đưa ra tại OEIS: https://oeis.org/A001317

Dữ liệu vào: Một số nguyên không âm n ở bất kỳ định dạng nào bạn muốn. (Phải làm việc cho tất cả n đến 30.)

Đầu ra: Số hạng thứ n (được lập chỉ mục 0) của chuỗi dưới dạng số thập phân.

Đây là vì vậy hãy thử đưa ra câu trả lời ngắn nhất bằng byte mà ngôn ngữ của bạn có khả năng. Không có câu trả lời sẽ được chấp nhận. Các lỗ hổng tiêu chuẩn được áp dụng (ví dụ: không mã hóa trình tự cứng), ngoại trừ việc bạn có thể sử dụng ngôn ngữ được tạo / sửa đổi sau khi thử thách này được đăng. (Đừng tránh đăng một giải pháp khác bằng ngôn ngữ đã được sử dụng trừ khi giải pháp của bạn ngắn hơn.)

Bảng xếp hạng

Đoạn trích Stack ở cuối bài đăng này tạo ra danh mục từ các câu trả lời a) dưới dạng danh sách các giải pháp ngắn nhất cho mỗi ngôn ngữ và b) dưới dạng bảng xếp hạng tổng thể.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

## Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích:

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


8
Tôi không phải là một fan hâm mộ lớn của việc không được đưa ra một câu trả lời sai cho bất kỳ n . Điều này về cơ bản buộc các ngôn ngữ không sử dụng các số nguyên chính xác tùy ý theo mặc định để kiểm tra xem đầu vào có đủ nhỏ không ...
Dennis

Vui lòng làm rõ nếu hiểu đúng các quy tắc (xem các bình luận ở đâyở đây ) và nếu đầu ra được làm tròn (ví dụ: 1.288490189e10 cho đầu vào 33) được tính là sai .
Dennis

"Phải làm việc cho tất cả n đến 30 và không được đưa ra câu trả lời sai cho bất kỳ n nào." . Điều này là tự mâu thuẫn - chắc chắn "không được đưa ra một câu trả lời sai" giống như "Phải làm việc" ???
Chấn thương kỹ thuật số

5
Do sự phản đối phổ biến áp đảo đối với gánh nặng vô lý và đè bẹp tâm hồn của xác nhận đầu vào, yêu cầu này đã được gỡ bỏ. Bạn có thể xuất bất cứ thứ gì bạn muốn cho n lớn. Thưởng thức!
quintopia

2
Thay vì nói rằng đầu ra không nên sai, tôi khuyên bạn chỉ nên nói rằng các bài nộp phải hỗ trợ đầu vào lên đến mức lớn nhất nmà không có gì tràn ra.
Alex A.

Câu trả lời:


14

05AB1E , 5 4 byte

Tôi tự hào giới thiệu với bạn, 05AB1E. Mặc dù nó rất ngắn, nhưng có lẽ nó rất tệ ở những thử thách dài.

Cảm ơn ETHproductions đã loại bỏ 1 byte :)

$Fx^

Giải trình:

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

Bạn biết đấy, một cách hay để loại bỏ một byte trong nhiều chương trình bằng ngôn ngữ tùy chỉnh là làm cho một dấu vết }được tự động chèn vào. Sau đó, đây sẽ là 4 byte. :)
Sản phẩm ETH

1
@ETHproductions Đợi một chút, điều đó đã được thực hiện :). Cảm ơn đã cạo sạch 1 byte haha.
Ad Nam

2
Có một lỗi trong mã này. Làm sao tôi biết? Nó đang đánh Dennis.
Arcturus

2
@Ampora Không chỉ đánh bại Dennis, nó còn đánh bại ngôn ngữ chơi gôn tùy chỉnh của Dennis. ;)
Sản phẩm ETH

@Ad Nam Wow. Bạn đang làm gì đó.
RK.


6

Thạch , 6 byte

1Ḥ^$³¡

Hãy thử trực tuyến!

Phiên bản nhị phân hoạt động với phiên bản sửa đổi này của trình thông dịch Jelly có kết xuất xxd

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

Làm thế nào nó hoạt động

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 byte

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

Trong ((->) r)đơn nguyên, (f >>= g) xbằng nhau g (f x) x.


Tôi nghĩ bạn có thể ẩn danh dòng cuối cùng thành(iterate((2*)>>=xor)1!!)
xnor

Tôi đã thử điều đó, nhưng nó không hoạt động, vì lý do hạn chế sự đơn hình đáng sợ .
Lynn

Tuy nhiên, điều đó có thể áp dụng như một biểu thức pháp lý, vì hạn chế đơn hình không áp dụng cho các biểu thức, nhưng khai báo. Và các biểu thức được coi là câu trả lời hợp pháp, nếu tôi không nhầm.
tự hào

4

Matlab, 45 byte

Dung dịch:

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

Kiểm tra:

ans(10)
ans =
1285

Giải thích: pascalxây dựng tam giác Pascal, nhưng nó bắt đầu từ 1, vì vậy đầu vào phải là i+1. fliplrlật mảng từ trái sang phải. mod(_,2)mất phần còn lại sau khi chia cho 2. diagtrích xuất đường chéo chính. Đa biến bằng cách sử dụng 2.^[0:i]chuyển đổi vectơ thành thập phân

Tôi rất vui, @flawr rằng tôi đã tìm thấy đối thủ cạnh tranh Matlab ở đây :)


Có vẻ như để làm việc với Octave là tốt.
Dennis

4

JavaScript (ES6), 23 byte

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

Dựa trên công thức đầu tiên trên trang OEIS. Nếu bạn không nhớ mã mất gần như mãi mãi để hoàn thành đầu vào là 30, chúng ta có thể tắt một byte:

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

Đây là phiên bản không đệ quy, sử dụng forvòng lặp trong eval: (32 byte)

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

Các quy tắc, như được viết hiện tại, vô hiệu hóa câu trả lời này, kể từ khi f(35)trả về 15. Ngoài ra, cảnh báo bom ngã ba: Tôi đã buộc đóng Chromium để dừng f(30)(sửa đổi ban đầu) không chạy. : P
Dennis

1
@Dennis Chờ, vậy nếu tôi không thể xuất bất kỳ giá trị sai nào, tôi phải làm gì với đầu vào cao hơn 30?
Sản xuất ETH

Tôi không chắc chắn (và tôi hy vọng quy tắc sẽ được thay đổi ), nhưng một cái gì đó giống như f=x=>x?(y=f(x-(x<31)))^y*2:1sẽ hoạt động.
Dennis

@Dennis Ah, recurse vô hạn = không có đầu ra. Tôi sẽ sửa lỗi này khi tôi quay lại máy tính của mình. Tôi hy vọng quy tắc đó cũng được thay đổi.
Sản xuất ETH

Các quy tắc đã được loại bỏ khỏi câu hỏi.
Dennis

3

Matlab, 77 70 byte

Hàm này tính toán hàng thứ n của tam giác Pascal thông qua phép tích chập lặp lại với [1,1](hay còn gọi là phép nhân nhị phân hoặc phép nhân lặp lại với một nhị thức) và tính số từ đó.

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 byte

hàm ẩn danh với phép lặp.

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

hàm đệ quy này ngắn hơn một byte, nhưng vì nó cần được đặt tên để có thể tham chiếu đến chính nó, nó kết thúc lâu hơn một byte.

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

3

Ruby, 25 byte

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

Ngắn hơn các câu trả lời khác ở đây cho đến nay. Nó xây dựng chuỗi này:

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

Sau đó, nó thiết lập n=1(điều này thực sự xảy ra trong khi chuỗi đang được thực hiện) và đánh giá chuỗi trên, trả về kết quả.


Điều đó có *n=1thực sự cứu vãn được gì khôngm=1;"m^=2*"*n+?1
Martin Ender

Không, nhưng thực hiện nó chỉ với một biến là rất sặc sỡ :)
Lynn

3

Samau , 4 byte

Bây giờ Samau đã tích hợp các chức năng cho phép nhân XOR và sức mạnh XOR.

▌3$ⁿ

Hex dump (Samau sử dụng mã hóa CP737):

dd 33 24 fc

Giải trình:

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

Điều này có thể được giảm xuống 3 byte bằng cách hoán đổi hai lệnh đầu tiên và loại bỏ trao đổi?
quintopia

@quintopia Số Samau tự động đẩy đầu vào lên ngăn xếp dưới dạng chuỗi và đọc một số từ chuỗi. Nếu chúng ta trao đổi hai lệnh đầu tiên, nó sẽ cố đọc một số từ 3đó không phải là một chuỗi.
alephalpha

Tại sao samau không thử đánh bại chuỗi khi có thể?
quintopia


2

Pure Bash (không có tiện ích bên ngoài), 37

Số nguyên Bash được ký 64 bit, do đó, số này hoạt động cho các đầu vào lên đến và bao gồm 62:

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

2

Python 2.7.6, 38 33 byte

Cảm ơn Dennis vì đã cạo sạch một vài byte!

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

1
Chào mừng bạn đến với Câu đố lập trình & Code Golf! exec'x^=x*2;'*input()lưu một vài byte qua forcách tiếp cận.
Dennis

Điều này đánh bại mục Python của tôi, thứ mà tôi sẽ để lại cho hậu thế:f=lambda n:f(n-1)^2*f(n-1)if n>0 else 1
Jack Brounstein

2

Bình thường, 7 byte

uxyGGQ1

Dùng thử trực tuyến: Trình diễn

Giải trình:

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


2

MIPS, 28 byte

Đầu vào $a0, đầu ra trong $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 byte

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

0b\:chuyển đổi một số thành một vectơ boolean (tức là chuỗi bit), XOR được triển khai là "không bằng", 2/:chuyển đổi một chuỗi bit trở lại một số bằng cách coi nó là một đa thức để đánh giá và x f/yvới xmột số nguyên được fáp dụng cho yđầu tiên, sau đó thành một số nguyên lần đầu ra liên tiếp x.

Chạy mẫu:

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

1

Ruby, 31 26 byte

CHỈNH SỬA: Thay đổi hoàn toàn sang một ngôn ngữ khác! Chào mừng tất cả các đề nghị chơi golf!

Chương trình này bitwise XOR là phần tử trước của chuỗi với hai lần chính nó, nghĩa là f(n) = f(n-1) ^ 2*f(n-1).

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

1

MATL , 15 byte

Tương tự như câu trả lời của @ flawr :

i:1w"TToX+]2\XB

EDIT (ngày 20 tháng 5 năm 2016) Hãy thử trực tuyến! được X+thay thế bằng Y+để phù hợp với phiên bản 18.0.0 của ngôn ngữ.

Thí dụ

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

Giải trình

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 byte

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

Hãy thử trực tuyến!

Giả sử các ô có kích thước vô hạn (nếu không, nó không thể vượt qua 7, thuận tiện là 255). Phương thức tam giác mod 2 của Pascal thực sự dài hơn nhiều do thao tác mod 2 tốn kém, trong khi XOR dễ thực hiện hơn nhiều.


0

APL, 31 byte

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

Đây gần như là mã khủng khiếp, nhưng tôi là một người mới hoàn thành APL. Tôi hy vọng bất cứ ai có bất kỳ kỹ năng nào cũng có thể thoát khỏi tất cả các chức năng D và rút ngắn đáng kể. Logic ít nhiều giống với k4câu trả lời của tôi - nhân với 1hoặc 2, chuyển đổi thành bit với , XOR không sử dụng bằng, chuyển đổi lại thành một số với , bọc toàn bộ trong một hàm và yêu cầu một số lần lặp cụ thể bằng cách sử dụng . Tôi không biết tại sao kết quả đi ra từ sản phẩm bên trong được đính kèm, nhưng làm sạch nó lên.


Bạn sẽ có thể lưu một byte bằng cách thay đổi ~1 2=.thành1 2≠.
Zacharý

Và, hệ thống APL này là gì? Nếu là trên Dyalog, bạn sẽ có thể tạo nó {({2⊥⊃1 2≠.((64⍴2)⊤×)⍵}⍣⍵)1}[28 byte]
Zacharý

0

Nghiêm túc, 12 byte

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

Bãi rác Hex:

322cb960324025604dee6aa8

Dùng thử trực tuyến

Vì Nghiêm túc không bao gồm bất kỳ phương tiện nào để thực hiện xor bitwise, giải pháp này thực hiện thách thức hoàn toàn theo nghĩa đen, trực tiếp tính toán hàng đã cho của tam giác. Phương pháp này cho câu trả lời đúng lên tới n = 1029 (sau đó không có đủ bộ nhớ để tính hàng tam giác đã cho của Pascal).

Giải trình:

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

Đ0⇹Řć2%ǰ2Ĩ

Giải trình:

Quan sát rằng Tam giác nhị phân nhị phân tương đương với Tam giác 2 của Pascal,

                      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

Hãy thử trực tuyến!


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.