Xếp chồng lên boong tàu!


15

Alice và Bob thích chơi một trò chơi bài, với một bộ bài được đánh số với các số nguyên không âm liên tiếp.

Alice có một cách rất đặc biệt để xáo trộn bộ bài, mặc dù. Đầu tiên, cô ấy lấy lá bài trên cùng từ bộ bài và đặt nó ở dưới bộ bài. Sau đó, cô ấy loại bỏ thẻ tiếp theo, và bắt đầu một đống với nó. Sau đó, một lần nữa cô đạp chiếc thẻ trên xuống dưới, và đặt chiếc thẻ trên cùng mới lên đống. Cô ấy lặp đi lặp lại quá trình này cho đến khi cô ấy dọn sạch bộ bài, lúc đó đống đồ là bộ bài mới.

  deck     |  pile
-----------+-----------
 3 1 4 0 2 | 
 1 4 0 2 3 | 
 4 0 2 3   |         1
 0 2 3 4   |         1
 2 3 4     |       0 1
 3 4 2     |       0 1
 4 2       |     3 0 1
 2 4       |     3 0 1
 4         |   2 3 0 1
           | 4 2 3 0 1
 4 2 3 0 1 | 

Hình 1: Alice thực hiện xáo trộn của mình trên bộ bài 5 lá "3, 1, 4, 0, 2". Mặt sau của thẻ đều hướng về bên trái.

Một ngày nọ, Bob thông báo anh sẽ nghỉ một tuần. Alice, không có ai để chơi trò chơi, mở rộng bạn của cô ấy đêm giao thừa. Bây giờ, Eve là một kẻ lừa đảo không biết xấu hổ, vì vậy khi cô nhìn thấy sự xáo trộn kỳ lạ của Alice, cô nhận ra rằng mình có thể xếp chồng lên boong trước để tạo lợi thế cho mình!

Khi Eve về nhà sau ngày đầu tiên, cô ấy thực hiện một số phân tích về trò chơi và nhận ra rằng tỷ lệ cược tốt nhất của cô ấy là khi các thẻ theo thứ tự 0, 1, 2, 3, 4, 5, ... Cô ấy đã không Tuy nhiên, hãy nắm bắt có bao nhiêu thẻ trong bộ bài, vì vậy cô ấy ấp ra một sơ đồ có hình chữ nhật để viết một số mã trên cánh tay của mình, khi chạy, sẽ lấy kích thước của bộ bài và hiển thị thứ tự mà Eve cần đặt các thẻ vào, để khi nào Alice xáo trộn bộ bài, bộ bài cuối cùng theo thứ tự 0, 1, 2, 3, ...

Nó không thực sự quan trọng với Eve ngôn ngữ đó là gì (cô ấy biết tất cả), hoặc liệu mã có phải là một hàm lấy một số nguyên và trả về một mảng hay một chương trình đầy đủ lấy đầu vào thông qua một đối số dòng lệnh hoặc STDIN và viết kết quả vào STDOUT. Cô ấy, tuy nhiên, cần mã càng ngắn càng tốt, để giảm thiểu khả năng Alice nhìn thấy nó và bắt được cô ấy.

Vô đạo đức như nó có thể, các bạn có thể giúp Eve ra ngoài?

Ví dụ đầu vào và đầu ra:

in  out
 1  0
 2  0 1
 5  2 4 0 3 1
10  2 9 4 8 0 7 3 6 1 5
52  6 51 25 50 12 49 24 48 1 47 23 46 11 45 22 44 5 43 21 42 10 41 20 40 2 39 19
    38 9 37 18 36 4 35 17 34 8 33 16 32 0 31 15 30 7 29 14 28 3 27 13 26

3
Phrasing đáng yêu, tôi sẽ nhận được nứt.
ɐɔıʇǝɥʇuʎs

Hơi khó hiểu khi ngăn xếp của bạn được căn chỉnh ở trên cùng. Và nói rõ thứ tự của ngăn xếp cũng sẽ giúp làm rõ câu hỏi một chút.
Martin Ender

Các boong cũng vậy.
Martin Ender

Ngoài ra: bạn đang cố lừa chúng tôi bằng cách lấy mẫu có chiều dài 5? Nếu không có nhu cầu hư hỏng: shuffle(shuffle(range(5))) == range(5)...
ɐɔıʇǝɥʇuʎs

@Synthetica Tôi đoán điều đó xảy ra khi Alice xáo trộn trên bộ bài 5 lá là một sự xâm lược. Tôi đã không thực sự nghĩ về nó khi đăng bởi vì nó không nói chung.
thuật toán

Câu trả lời:


5

GolfScript, 15 14 13 byte

])~,{\+)\+}/`

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

Thí dụ

$ golfscript alice.gs <<< 10
[2 9 4 8 0 7 3 6 1 5]

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

])    # Collect the stack into an array and pop. This leaves [] below the input string.
~     # Interpret the input string.
,     # For input “N”, push the array [ 0 … N-1 ] (the pile).
{     # For each card on the pile:
  \+  # Put the card on top of the deck.
  )   # Remove a card from the bottom of the deck.
  \+  # Put the card on top of the deck.
}/    #
`     # Convert the deck into a string.

1
Bạn có thể sử dụng {}/thay vì toán tử bản đồ để lưu char.
Howard

Cảm ơn! Tôi muốn một mảng, vì vậy tôi đã sử dụng bản đồ. Lực lượng của thói quen ...
Dennis

1
](vì hai ký tự đầu tiên thực sự đặt một mảng trống dưới đầu vào, giúp bạn tiết kiệm sau []\ .
Peter Taylor

Cảm ơn! Tôi đã mất quá nhiều thời gian để tìm ra lý do tại sao điều này không hoạt động với trình thông dịch trực tuyến. Quên xóa ngăn xếp ...
Dennis

5

Julia, 83

u(n)=(a=[n-1:-1:0];l=Int[];[push!(l,shift!(push!(l,pop!(a)))) for i=1:length(a)];l)

Phần tử cuối cùng trong vector trả về là đỉnh của bộ bài.


4

Toán học, 92 77 46 byte

Yêu cầu đầu vào trong biến n:

l={};(l=RotateRight[{#-1}~Join~l])&/@Range@n;l

Nó thực sự chỉ chơi trò xáo trộn ngược, bằng cách di chuyển qua một thẻ và sau đó đặt thẻ dưới lên trên.

EDIT: Không cần theo dõi ngăn xếp đầu ra, chỉ cần lặp qua các số nguyên.


2

Con trăn 2.7 - 57

d=[0]
for j in range(1,input()):d=[d.pop()]+[j]+d
print d

Đẹp và đơn giản, chỉ cần đảo ngược shuffle. Khá gần với cách Golfscript làm điều đó.


1

J (13 ký tự) và K (9)

Hóa ra, đó là một quá trình đơn giản để hoàn tác xáo trộn và những người thích APL có trạng từ gấp /để giúp họ thực hiện điều này càng ngắn càng tốt.

J mất 13 char với (_1|.,)/@i.@-, trong khi K chỉ cần 9 : |(1!,)/!:. APL sẽ tương tự như vậy.

Đây là dấu vết từng bước của phiên bản J.

(_1|.,)/@i.@- 4                  NB. recall that J is right-associative
(_1|.,)/@i. - 4                  NB. u@v y  is  u v y
(_1|.,)/@i. _4                   NB. monad - is Negate
(_1|.,)/ i. _4                   NB. @
(_1|.,)/ 3 2 1 0                 NB. monad i. is Integers, negative arg reverses result
3 (_1|.,) 2 (_1|.,) 1 (_1|.,) 0  NB. u/ A,B,C  is  A u B u C
3 (_1|.,) 2 (_1|.,) _1 |. 1 , 0  NB. x (M f g) y  is  M f x g y
3 (_1|.,) 2 (_1|.,) _1 |. 1 0    NB. dyad , is Append
3 (_1|.,) 2 (_1|.,) 0 1          NB. dyad |. is Rotate
3 (_1|.,) _1 |. 2 , 0 1          NB. repeat ad nauseam
3 (_1|.,) _1 |. 2 0 1
3 (_1|.,) 1 2 0
_1 |. 3 , 1 2 0
_1 |. 3 1 2 0
0 3 1 2

Bạn có thể nhận thấy rằng trong J, chúng tôi đảo ngược mảng các số nguyên đầu tiên, nhưng trong K chúng tôi làm điều đó sau: đây là vì K lần là giống như một foldl, so với của J foldr.

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.