Code golf: Phân phối các quả bóng (I)


12

Thử thách

Trong tác vụ này, bạn đã tính toán số cách chúng ta có thể phân phối các quả bóng A vào các ô B với mỗi ô có ít nhất một quả bóng.

Các đầu vào A và B được đưa ra trong một dòng được phân tách bằng khoảng trống, các đầu vào được kết thúc bằng EOF.

Bạn có thể muốn kiểm tra các giải pháp của bạn ở đây .

Đầu vào

0 0
1 0
12 4
6 3
18 17
20 19
15 13
18 9
20 20
17 14
9 2
14 13
18 11

Đầu ra

1
0
14676024
540
54420176498688000
23112569077678080000
28332944640000
38528927611574400
2432902008176640000
21785854970880000
510
566658892800
334942064711654400

Những ràng buộc

  • Mọi A và B có thể được phân biệt.
  • 0 <= A, B <= 20
  • Bạn có thể sử dụng bất kỳ ngôn ngữ nào bạn chọn
  • Giải pháp ngắn nhất sẽ thắng!

1
Có giới hạn thời gian không?

@Tim Nordenfur: Đã cập nhật :-)
Quixotic

Liên kết đó không hợp lệ đối với tôi.
mellamokb

3
@Debanjan Tôi không thích ý tưởng dán câu hỏi từ SPOJ ở đây. Mọi người gửi mã của họ để cạnh tranh ở đó và nó sẽ không công bằng cho họ.
fR0DDY

1
@Debanjan, tôi thấy tài liệu tham khảo của bạn và nâng cao bạn Mathworld (eqn. 5 nói rằng đó S(n,0)1nếu n=00nếu không). Nếu bạn muốn tôi có thể tìm một tài liệu tham khảo cho tuyên bố mạnh mẽ hơn rằng Stirling2 nằm trong nhóm phụ liên kết của nhóm Riordan theo cấp số nhân.
Peter Taylor

Câu trả lời:


4

JavaScript (90 93 )

function f(a,b){n=m=r=1;for(i=b;i>0;n*=-1){r+=n*m*Math.pow(i,a);m=m*i/(b-i--+1)}return--r}

http://jsfiddle.net/RDGUn/2/

Rõ ràng, bất kỳ ngôn ngữ dựa trên toán học nào như APL sẽ đánh bại tôi vì tính dài dòng cú pháp và thiếu các cấu trúc toán học tích hợp :)

Chỉnh sửa Ngoài ra, tôi không có bất kỳ chức năng nào liên quan đến đầu vào ngoại trừ các tham số được truyền vào chức năng, không chắc chắn cách sử dụng đầu vào tiêu chuẩn với JavaScript ...

Chỉnh sửa: Di chuyển i--vào m=m*biểu thức; di chuyển n*=-1vào for; bắt đầu r=1kết hợp các bài tập và loại bỏ một bài tập không liên quan. (lưu 3 ký tự)


Bạn có thể sử dụng vỏ spidermonkey - ít nhất nó có readlineprint. Tôi không biết những gì người khác ở đây sử dụng.
Jesse Millikan

@Jlie: Thú vị. Dù sao tôi cũng sẽ thua lol.
mellamokb

promptalertlà io "tiêu chuẩn" của JavaScript, vì chúng là các cuộc gọi io điển hình, mặc dù thực tế là bạn thường không bao giờ sử dụng chặn io với JavaScript.
zzzzBov

4

Golfscript - 56 50 49 48 41 40 38 37 ký tự

n%{~),{!}%\{0.@{.@+2$*@)@}/;;]}*)p;}/

Lưu ý: việc này xử lý nhiều dòng đầu vào, nhanh (1/8 giây để thực hiện các trường hợp kiểm tra) và không phá vỡ bất kỳ đầu vào hợp pháp nào.

(Phiên bản đầu tiên cũng là chương trình Golfscript đầu tiên của tôi; cảm ơn eBusiness đã chỉ ra một số thủ thuật mà tôi đã bỏ lỡ).

Để làm cho bài viết này trở thành một bài viết giáo dục hữu ích, đây là một lời giải thích về cách thức hoạt động của nó. Chúng tôi bắt đầu với sự tái phát f(n, k) = k * (f(n-1, k) + f(n-1, k-1)). Điều này có thể được hiểu một cách kết hợp khi nói rằng để đặt ncác quả bóng có thể phân biệt vào kcác thùng có thể phân biệt sao cho mỗi thùng chứa ít nhất một quả bóng, bạn chọn một trong các kthùng cho quả bóng đầu tiên ( k *) và sau đó nó sẽ chứa ít nhất một quả bóng nữa ( f(n-1, k)) hoặc nó sẽ không ( f(n-1, k-1)).

Các giá trị kết quả từ dạng này là một lưới; lấy nlàm chỉ mục hàng và klàm chỉ mục cột và lập chỉ mục từ 0, nó bắt đầu

1   0   0   0    0    0   0 ...
0   1   0   0    0    0   0 ...
0   1   2   0    0    0   0 ...
0   1   6   6    0    0   0 ...
0   1  14  36   24    0   0 ...
0   1  30 150  240  120   0 ...
0   1  62 540 1560 1800 720 ...
.   .   .   .    .    .   . .
.   .   .   .    .    .   .  .
.   .   .   .    .    .   .   .

Vì vậy, chuyển sang chương trình,

n%{~ <<STUFF>> }/

chia đầu vào thành các dòng và sau đó cho mỗi dòng đánh giá nó, đặt nktrên ngăn xếp, sau đó gọi <<STUFF>>, như sau:

),{!}%\{0.@{.@+2$*@)@}/;;]}*)p;

Điều này tính toán các k+1mục đầu tiên của n+1hàng thứ của lưới đó. Ban đầu ngăn xếp là n k.
),đưa ra ngăn xếp n [0 1 2 ... k]
{!}%cho ngăn xếp của n [1 0 0 ... 0]nơi có k0s.
\{ <<MORE STUFF>> }*đưa nlên đỉnh và làm cho nó số lần chúng ta thực hiện <<MORE STUFF>>.
Ngăn xếp của chúng tôi hiện là một hàng của bảng: [f(i,0) f(i,1) ... f(i,k)]
0.@đặt một vài số 0 trước mảng đó. Cái đầu tiên sẽ là jvà cái thứ hai sẽ là f(i,j-1).
{ <<FINAL LOOP>> }/các vòng lặp thông qua các phần tử của mảng; đối với mỗi cái, nó đặt nó lên trên cùng của ngăn xếp và sau đó thực thi thân vòng lặp.
.@+2$*@)@là thao tác ngăn xếp nhàm chán để lấy ... j f(i,j-1) f(i,j)và sản ... j*(f(i,j-1)+f(i,j)) j+1 f(i,j)
;;]xuất bật ra khỏi phần còn lạik+1 f(i,k)và tập hợp mọi thứ thành một mảng, sẵn sàng cho vòng tiếp theo.
Cuối cùng, khi chúng ta tạo nhàng thứ ba của bảng,
)p;lấy phần tử cuối cùng, in nó và loại bỏ phần còn lại của hàng.

Đối với hậu thế, ba giải pháp 38-char theo nguyên tắc này:
n%{~),{!}%\{0.@{.@+@.@*\)@}/;;]}*)p;}/
n%{~),{!}%\{0:x\{x\:x+1$*\)}/;]}*)p;}/
n%{~),{!}%\{0.@{@1$+2$*\@)}/;;]}*)p;}/


1
Khá tốt cho người mới bắt đầu, có một vài cách giảm quy mô nhỏ có thể xảy ra, ngay lập tức tôi tìm thấy [0]-> 1,, không gian sau khi zip có thể được loại bỏ và không gian khác có thể được loại bỏ nếu bạn chỉ lưu trữ trong một toán tử thay vì k. Tôi chưa bước qua mã của bạn, nhưng tôi nghi ngờ bạn có thể thoát khỏi việc chỉ sử dụng một giá trị mà không đặt nó vào một mảng trong một số điểm.
aaaaaaaaaaaa

1
+ 1, tôi không hiểu Golfscript nhưng điều này có vẻ đủ nhanh và rất ngắn.
Quixotic

@eBusiness và @Peter Taylor: Trên một lưu ý khác .. các bạn đánh giá Golfscript bao nhiêu trên thang điểm dễ học?
Quixotic

@Debanjan, phụ thuộc vào những gì bạn đã biết. Đó là một ngôn ngữ dựa trên ngăn xếp chức năng. Trước đây tôi đã sử dụng một ngôn ngữ chức năng (SML - cộng với tôi đã viết mã kiểu chức năng bằng các ngôn ngữ OO) và trước đây tôi đã sử dụng các ngôn ngữ dựa trên ngăn xếp (mã byte Java được lắp ráp với Jasmin, PostScript), do đó, trở ngại thực sự duy nhất Tôi phải đối mặt với việc học những gì các nhà khai thác có sẵn. Nếu bạn chỉ biết các ngôn ngữ từ gia đình Algol (C, Java, v.v.) thì bạn sẽ có ba chướng ngại vật để nhảy cùng một lúc.
Peter Taylor

@Debanjan - Nó dễ hơn nhiều so với vẻ ngoài của nó, bạn có thể bắt đầu viết mã gần như ngay lập tức, nhưng tất nhiên phải mất một thời gian để tìm hiểu tất cả các thủ thuật nhỏ.
aaaaaaaaaaaa

3

J, 40

4 :'|-/x(^~*y!~])i.1x+y'/&.".;._2(1!:1)3 

Ví dụ

4 :'-/((x^~|.@:>:)*y&(!~))i.y'/x:".>{.;:(1!:1)3
15 13
28332944640000

<1 giây cho tất cả các trường hợp thử nghiệm.

Chỉnh sửa

  • (52 → 47) Giảm bằng -/thay vì xen kẽ (1 _1)*(ý tưởng của JB)
  • (47 → 53) Yêu cầu đầu vào đa dòng được chú ý: - /
  • (53 → 48) Khai thác tính đối xứng của nhị thức.
  • (48 → 48) Hãy ngầm!
  • (48 → 41)
  • (41 → 40) Bóp tăng + chuyển đổi thành1x+

1
Chào! Đó là ý tưởng của tôi ! O :-)
JB

Ok, tôi sẽ ăn cắp điều 1x+đó sau đó, nhưng điều đó chỉ mua lại cho tôi 1 ký tự, trong khi bạn mất 5!
JB

3

Lisp thường gặp (83)

(defun b (x y)
  (if (= (* x y) 0)
      (if (= (+ x y) 0) 1 0)
      (* y (+ (b (decf x) y) (b x (1- y)))))))

Có vẻ như nên có một cách ngắn hơn để kiểm tra các trường hợp cơ bản, nhưng không có gì xảy ra với tôi.


3

J, 38 đến 42

Tùy thuộc vào sở thích nghiêm ngặt của bạn về ngôn ngữ tương tác và bản trình bày đầu ra, hãy chọn lựa từ giải pháp J:

  • 38 tương tác ngắn nhất: 4 :'|-/(!&y*^&x)i.1x+y'/&".;._2(1!:1)3
    Khởi chạy jconsole, nhập nó, sau đó dán đầu vào (kết thúc bằng Cd). Bạn sẽ nhận thấy đầu ra được phân tách bằng dấu cách (J là ngôn ngữ vectơ, nó thực hiện tính toán trên toàn bộ đầu vào và trả về dưới dạng vectơ 1D, có phần trình bày mặc định nằm trên một dòng). Tôi cho rằng ok, tinh thần của vấn đề này là tính toán, không phải trình bày. Nhưng nếu bạn khăng khăng muốn có dòng mới thay thế:
  • 39 tương tác dài hơn: 4 :'|-/(!&y*^&x)i.1x+y'/&.".;._2(1!:1)3
    Thay thế Compose ( &) bằng Under ( &.) trả về một vectơ của chuỗi, phần trình bày kết thúc trên các dòng riêng biệt.
  • Chế độ hàng loạt 42 : 4 :'echo|-/(!&y*^&x)i.1x+y'/&".;._2(1!:1)3
    Chạy từ dòng lệnh như$ jconsole balls.ijs < balls.in

Nếu bạn đã bỏ phiếu này, bạn cũng có thể muốn cung cấp cho giải pháp của Eelvex một số tín dụng.


Bạn cần có Under &.để nó hoạt động chính xác trên chế độ tương tác.
Eelvex

@Eelvex bạn phải có một cách hiểu khác về "đúng". Tôi bắt đầu jconsole, dán mã, dán đầu vào, Cd và nhận đầu ra. Không cần thiết. Của bạn là gì
JB

Mã của chúng tôi kết hợp : 4 :'|-/(!&y*^&x)i.1x+y'/&.".;._2(1!:1)3. 39 ký tự.
Eelvex

Không có tiếng vang hoặc Dưới tôi chỉ nhận được đầu ra trong một dòng (thay vì nhiều dòng).
Eelvex

@Eelvex thực sự, nhưng điều đó không bị cấm rõ ràng.
JB

3

GolfScript - 45 38 36 ký tự

Quan hệ tái phát thực hiện bẩn trung bình ( 38 36 ký tự):

n%{~{.2$*{\(.2$f\2$(f+*}{=}if}:f~p}/

Mối quan hệ tái phát tôi đã đánh cắp từ giải pháp Peter Taylors, nó diễn ra như sau:

f(x, y) = y * ( f(x-1, y) + f(x-1, y-1) )

Với các trường hợp đặc biệt nếu một trong hai biến là 0.

Việc triển khai của tôi không sử dụng lại các kết quả trước đó, vì vậy mỗi hàm gọi nhánh đến hai cuộc gọi mới, trừ khi đã đạt được một trong các trường hợp không. Điều này đưa ra một trường hợp xấu nhất là 2 ^ 21-1 chức năng gọi mất 30 giây trên máy của tôi.

Giải pháp loạt lực nhẹ (45 ký tự):

n%{~.),0\{.4$?3$,@[>.,,]{1\{)*}/}//*\-}/p;;}/

2

J, 55 ký tự

(wd@(4 :'(y^x)--/(!&y*^&x)|.i.y')/@".@,&'x');._2(1!:1)3
  • Vượt qua các trường hợp thử nghiệm hiện tại. Tôi nghĩ rằng tôi hiểu toán học ...
  • j602, chỉ bàn điều khiển ( wd). Đầu vào trên stdin, đầu ra trên thiết bị xuất chuẩn.

Kịch bản kiểm tra Bash:

jconsole disballs.ijs <<END
12 4
6 3
END

Cái j6xx đó wdlàm gì?
JB

Tôi thực sự có nghĩa là j602 ... Tôi đoán nó cũng trong j601. Nó được định nghĩa là echo, được định nghĩa là 0 0&$@(1!:2&2). Tôi không chắc điều đó có nghĩa là gì, nhưng nó thực hiện một cái gì đó giống như in các mục xếp hạng 1 với dấu ngắt dòng. (Bây giờ tôi mới nhận thấy rằng sử dụng 2 chứ không phải 4 ... Tôi nghĩ rằng nó vẫn đi đến thiết bị xuất chuẩn trong chế độ bảng điều khiển, ít nhất.)
Jesse Millikan

Tôi gặp sự cố khi chạy mã này. Tôi chỉ cần gõ nó vào giao diện điều khiển?
mellamokb

@mellamokb Tôi đã sử dụng một cái gì đó giống như tập lệnh thử nghiệm ở trên, với chương trình được lưu dưới dạng disballs.ijs và đường dẫn chính xác đến j602 / bin / jconsole.
Jesse Millikan

@Jlie: Tôi đang chạy cái này trên windows. Tôi nhận được << was unexpected at this time. Xin lỗi Tôi mới sử dụng đầu vào J, tôi luôn sử dụng nó trong chế độ bảng điều khiển.
mellamokb

2

Golfscript - 26 ký tự

Cảnh báo: Trường hợp 12 4 cần rất nhiều bộ nhớ (mặc dù không nhiều như câu trả lời dưới đây) và mất khá nhiều thời gian để chạy

~:)\?:x,{x+)base(;.&,)=},,

Rõ ràng câu trả lời này có một số vấn đề, nhưng tôi sẽ để nó ở đây vì các ý kiến ​​đề cập đến nó và câu trả lời của mellamokb dựa trên nó.

Golfscript - 24 ký tự

Cảnh báo: Trường hợp 12 4 cần nhiều bộ nhớ và mất nhiều thời gian để chạy

~:o)\?,{o)base[0]-,o=},,

2
Tôi không thể hiểu làm thế nào bạn đưa ra được mã đó, không chỉ phương thức này sẽ hết bộ nhớ cho các đầu vào lớn, tôi cũng không thể tìm ra toán tử gia tăng nào tốt. Rằng bạn thực sự đạt được mục tiêu cho 6 3 dường như không có gì ngoài may mắn.
aaaaaaaaaaaa

Đó không phải là chú hề, đó là vợ tôi!
Jesse Millikan

2
Tôi không hiểu Golfscript nhưng như bạn đã nói và tôi đồng ý cách tiếp cận của bạn quá chậm.
Quixotic

3
@mellamokb, chúc bạn làm việc tốt như thế nào :) Nó chỉ mất thêm 2 ký tự để sửa lỗi đó. Bây giờ chúng ta đang ở trong khu vực âm u nơi mã ngắn nhất có thể đúng nhưng không thực tế. Code-golf bị đánh đố với những câu trả lời cực kỳ kém hiệu quả nhưng micro giây so với giây thường không thành vấn đề. Đây là một trường hợp cực đoan ( rất nhiều bộ nhớ quá). Debanjan đã chỉ ra rằng các câu trả lời cần phải nhanh hơn, nhưng trang web này không phải là SPOJ, câu hỏi này được gắn thẻ code-golf
gnibbler

1
@gnibbler, 0 0nên sản xuất 1; 0 kcho bất kỳ khác knên sản xuất 0; n 1cho n > 0nên sản xuất 1.
Peter Taylor

2

Python 140 Chars

import sys
f=lambda n,k:(n and k and n>=k and k*(f(n-1,k-1)+f(n-1,k)))or(n+k==0 and 1)or 0
for l in sys.stdin:print f(*(map(int,l.split())))

2

dc, 100 ký tự

[0q]s5[1q]s6[l2l3>5l3 0>5l2 0=6l2 1-S2l3dS3 1-S3l1xL3s9l1xL2s9+L3*]s1[?z0=5S3S2l1xL3L2+s9fs9l4x]ds4x

Than ôi, dc dường như không được ideone hỗ trợ. Có thể có một hoặc hai nhân vật vẫn vắt kiệt sức, nhưng đó là giờ đi ngủ.

Lưu ý: điều này hỗ trợ nhiều dòng đầu vào, có độ chính xác đủ để cung cấp đầu ra chính xác ngay cả đối với 20 19(nguyền rủa bạn, Perl, trong thời gian tôi lãng phí gỡ lỗi giải pháp của mình!) Và đưa ra đầu ra chính xác cho 0 0.

Gợi ý từ Nabb cho phép rút ngắn ít nhất là

[0q]sZ[1q]sI[?z0=ZSkSn[lnlk>Zlk0>Zln0=Iln1-SnlkdSk1-SklFxLks9lFxLns9+Lk*]dsFxfs9l4x]ds4x

với chi phí để lại rác trong ngăn xếp đăng ký (và do đó hết bộ nhớ nếu chúng ta tính toán hàng tỷ câu trả lời).


Các thanh ghi luôn là các ký tự đơn (bạn có thể sử dụng bất kỳ ký tự nào, điều này sẽ giúp mã dễ đọc hơn), do đó l11được phân tích cú pháp l1 1(bạn có thể sử dụng Klàm mã thông báo một ký tự 0nếu bạn không thay đổi độ chính xác). Bạn có thể thay đổi vòng lặp đầu vào ?[...?z1=4]. Bạn có thể nội tuyến macro trong đăng ký 1. Và bạn có thể nói chung có thể tiết kiệm được nhiều ký tự hơn, nhưng tôi sẽ đợi nó ngắn hơn để hiểu nó.
Nabb

@Nabb, ah, tôi đã không đọc trang người đàn ông đủ cẩn thận. Tôi chỉ sử dụng 8 hoặc 9 thanh ghi, vì vậy tôi đã không gặp phải hậu quả của sự hiểu lầm của mình. Cảm ơn.
Peter Taylor

1

Golf (28 31 37 )

~):$\.($\?:@;?,{@+}%{$base$,\-[0]=},,

Sửa đổi gnibblergiải pháp GolfScript. Tôi nghĩ rằng đây là một giải pháp hiệu quả - được thử nghiệm với [3,2], [4.2], [6,3] và [9,2] với câu trả lời đúng. (Tôi đã sử dụng $@cho các biến để thắt chặt không gian xung quanh basetừ khóa).

Có hai vấn đề với gnibblergiải pháp hiện tại.

  1. Kiểm tra độ dài sau khi xóa [0] không đảm bảo giải pháp, vì [1,1,1,1] sẽ hợp lệ cho đầu vào [4.2], mặc dù cả 4 quả bóng đều nằm trong cùng một ô (1). Vì vậy, tôi đã sửa đổi để kiểm tra xem tất cả các chữ số được sử dụng, tức là mảng chứa 1-2, vì vậy mỗi ô chứa ít nhất một quả bóng.
  2. Trong trường hợp đầu vào [4.2], định dạng cơ sở 3 của các số 0-27 nhỏ hơn 4 chữ số và không bao gồm hầu hết các số 0 bên trái. Điều đó có nghĩa là [1,1] được bao gồm như một giải pháp hợp lệ, mặc dù về mặt kỹ thuật thực sự là [0,0,1,1], có nghĩa là hai quả bóng đầu tiên không được đặt ở bất cứ đâu. Tôi khắc phục bằng cách thêm 3 ^ 3 vào mỗi mục nhập (nói chung là k ^ n-1 vào mảng các mục nhập k ^ n) để các mục nhập đầu tiên được chuyển lên trên để có ít nhất n chữ số ở định dạng cơ sở-k và cuối cùng các mục sẽ tự động không hợp lệ và sẽ không ảnh hưởng đến giải pháp (vì chữ số thứ hai sẽ luôn là 0).

Biên tập

~:@\?:$,{$+}%{@base(;@,\-,0=},,

`~:@\?:$,{$+@base(;@,\-,0=},,`

Giải pháp tốt hơn chưa! Không cần tăng, chỉ cần thêm vào tất cả các số để chúng bắt đầu bằng [1] và sẽ không có chữ số nào bị mất (kể cả phần đệm bên trái là 0) sau khi bạn giải mã chữ số đầu tiên đó. Giải pháp này sẽ hoạt động và đã được thử nghiệm với các mục tương tự ở trên. Nó cũng nhanh hơn rất nhiều vì chúng tôi không tăng trước khi lấy số mũ để tạo mảng (nhưng vẫn gặp vấn đề về hiệu năng / bộ nhớ cho đầu vào lớn hơn).

Chỉnh sửa : Sử dụng gnibblerý tưởng di chuyển bổ sung $bên trong bộ lọc thay vì thêm một bước. (lưu 3 ký tự).


Phá vỡ đầu vào 0 0.
Peter Taylor

Cũng xuất hiện để chỉ xử lý một dòng đầu vào.
Peter Taylor

Và phá vỡ n 1cho bất kỳ n, làm cho nó bị treo. hmm ..
mellamokb

1
chuyển đổi số sang cơ sở 1 sẽ làm điều đó :)
gnibbler

@gnibbler: Bạn có gợi ý nào không? Tôi sẽ chỉ cần ném vào một số nếu các tuyên bố lúc đầu để bắt những trường hợp đó? Có vẻ như tôi sẽ mất rất nhiều đất theo cách đó.
mellamokb

0

05AB1E , 19 byte

#D`ULX.Œʒ€gßĀ}gs_P+

LƯU Ý: Nó cực kỳ chậm và đã hết thời gian 12 4. Nó đang làm việc như dự định, mặc dù. Sẽ xem liệu tôi có thể đưa ra một phương pháp thay thế phù hợp cho tất cả các trường hợp thử nghiệm trong một thời gian hợp lý không. Xem bên dưới để biết phiên bản nhanh hơn nhiều, chạy tất cả các trường hợp thử nghiệm trong chưa đầy một giây.

Hãy thử trực tuyến hoặc xác minh thêm một vài trường hợp thử nghiệm (nhỏ hơn) .

Giải trình:

#               # Split the (implicit) input-string by spaces
 D              # Duplicate it
  `             # Push both values to the stack
   U            # Pop and store the second value in variable `X`
    L           # Create a list in the range [1,n] for the first value
     X        # Create a list of all possible ways to divide this list into `X` partitions
                # (including empty sublists, so we'll have to filter them out:)
        ʒ       # Filter this list of lists of partition-lists by:
         g     #  Get the length of each partition-list
           ß    #  Get the minimum length
            Ā   #  Truthify; 0 remains 0 (falsey); anything else becomes 1 (truthy)
             }g # After the filter, take the length to get the amount left
 s              # Swap so the duplicated input-list is at the top of the stack again
  _             # Check for each value if they're equal to 0 (1 if truthy; 0 if falsey)
   P            # Take the product of the two to check if both input-values are 0
    +           # And add it to the earlier calculated product (edge case for [0,0] = 1)
                # (After which the result is output implicitly)

05AB1E , 29 byte

Đây là phiên bản nhanh hơn nhiều, hoạt động cho tất cả các trường hợp thử nghiệm trong khoảng 0,5 giây trên TIO:

Î#R`V©LRvyYmX*NÈ·<*+Xy*®y->÷U

Câu trả lời JavaScript của @mellamokb , vì vậy hãy đảm bảo nâng cao anh ấy!

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

Î                    # Push (result=) 0 and the input
 #                   # Split the input by spaces
  R`                 # Push the values to the stack reversed
    V                # Pop and store the first value in variable `Y`
     ©               # Store the second value in variable `®` (without popping)
      LRv            # Loop `y` in the range [`®`,1], with index `N` in the range [0,`®`):
         yYm         #  Calculate `y` to the power `Y`
            X*       #  Multiply it by `X`
                     #  (Note: `X` is 1 before setting it to another value initially)
              NÈ     #  Check if index `N` is even (1 if truthy; 0 if falsey)
                ·<   #  Double it; and decrease it by 1 (1 if truthy; -1 if falseY0
                  *  #  Multiply it to the earlier number
                   + #  And add it to the result
         Xy*         #  Push `X` multiplied by `y`
         ®y->        #  Push `®` - `y` + 1
             ÷       #  Integer divide them
              U      #  Pop and store it as new variable `X`
                     # (output the result at the top of the stack implicitly after the loop)

LƯU Ý: Hoạt động cho trường hợp cạnh 0 0trong trường hợp này (không giống như câu trả lời JavaScript tôi đã chuyển phương thức này từ), bởi vì Lnội dung sẽ tạo một danh sách [0,1].

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.