สแต็คดาดฟ้า!


15

อลิซและบ็อบชอบเล่นเกมไพ่โดยมีจำนวนการ์ดเป็นจำนวนเต็มจำนวนต่อเนื่องกัน

อลิซมีวิธีในการสับสำรับโดยเฉพาะอย่างยิ่ง อันดับแรกเธอหยิบไพ่ใบบนสุดจากเด็คและวางไว้ที่ด้านล่างของเด็ค จากนั้นเธอก็เอาไพ่ใบต่อไปออกและเริ่มกองกับมัน จากนั้นเธอวนรอบการ์ดใบบนสุดลงไปด้านล่างและวางการ์ดใบใหม่ลงบนกอง เธอทำขั้นตอนนี้ซ้ำจนกระทั่งเธอเทสำรับตรงจุดที่กองเป็นเด็คใหม่

  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 | 

รูปที่ 1: อลิซทำการสับไพ่ในสำรับไพ่ 5 ใบ "3, 1, 4, 0, 2" ด้านหลังของการ์ดหันหน้าไปทางซ้าย

อยู่มาวันหนึ่งบ๊อบประกาศว่าเขากำลังหยุดพักผ่อนหนึ่งสัปดาห์ อลิซที่ไม่มีใครเล่นเกมนี้ชวนเพื่อน ๆ ของเธอส่งท้าย ตอนนี้อีฟเป็นสิบแปดมงกุฎไร้ยางอายดังนั้นเมื่อเธอเห็นการสับที่ผิดปกติของอลิซเธอก็ตระหนักว่าเธอสามารถวางสำรับไว้ล่วงหน้าเพื่อผลประโยชน์ของเธอ!

เมื่ออีฟกลับถึงบ้านหลังจากวันแรกเธอทำการวิเคราะห์ในเกมและคิดว่าอัตราต่อรองที่ดีที่สุดของเธอคือเมื่อการ์ดอยู่ในลำดับ 0, 1, 2, 3, 4, 5, ... เธอไม่ได้ จับได้ว่ามีการ์ดอยู่ในสำรับจำนวนเท่าใดดังนั้นเธอจึงวางโครงร่าง harebrained ในการเขียนโค้ดลงบนแขนของเธอว่าเมื่อวิ่งจะใช้ขนาดของเด็คและแสดงลำดับที่อีฟจำเป็นต้องใส่การ์ดเข้าไป อลิซสับดาดฟ้าดาดฟ้าสุดท้ายอยู่ในลำดับ 0, 1, 2, 3, ...

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

ผิดศีลธรรมอย่างที่เป็นไปได้คุณช่วยเอฟได้ไหม?

ตัวอย่างอินพุตและเอาต์พุต:

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
ประโยคที่น่ารักฉันจะแตก
ɐɔıʇǝɥʇuʎs

มันค่อนข้างสับสนว่าสแต็คของคุณอยู่ในแนวที่ด้านบน และการระบุลำดับของสแต็กอย่างชัดเจนก็จะช่วยชี้แจงคำถามเล็กน้อย
Martin Ender

เช่นเดียวกับสำรับ
Martin Ender

นอกจากนี้: คุณพยายามหลอกเราด้วยการมีตัวอย่างความยาว 5 หรือไม่? โดยไม่ต้องการทำให้เสีย: shuffle(shuffle(range(5))) == range(5)...
14:00

@Synthetica ฉันคิดว่ามันเกิดขึ้นแล้วว่าการสลับของอลิซในเด็ค 5 ใบนั้นเป็นการร่วมด้วย ฉันไม่ได้คิดถึงมันจริงๆเมื่อโพสต์เพราะมันไม่ได้ถือโดยทั่วไป
algorithmshark

คำตอบ:


5

GolfScript, 15 14 13 ไบต์

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

ลองออนไลน์

ตัวอย่าง

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

มันทำงานอย่างไร

])    # 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
คุณอาจใช้{}/แทนโอเปอเรเตอร์แผนที่เพื่อบันทึกถ่าน
Howard

ขอบคุณ! ฉันต้องการอาร์เรย์ดังนั้นฉันจึงใช้แผนที่ แรงนิสัย ...
เดนนิส

1
]([]\ ขณะที่ทั้งสองตัวอักษรแรกได้อย่างมีประสิทธิภาพทำให้อาร์เรย์ที่ว่างเปล่าภายใต้การป้อนข้อมูลของคุณประหยัดต่อมา
Peter Taylor

ขอบคุณ! ฉันใช้เวลานานเกินไปที่จะเข้าใจว่าทำไมการทำงานกับล่ามออนไลน์จึงไม่ทำงาน ลืมล้างสแต็ค ...
เดนนิส

5

จูเลีย, 83

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

องค์ประกอบสุดท้ายในเวกเตอร์ที่ส่งคืนคือส่วนบนสุดของเด็ค


4

Mathematica, 92 77 46 ไบต์

คาดว่าอินพุตในตัวแปรn:

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

มันเป็นเพียงการเล่นสลับแบบย้อนกลับโดยการเลื่อนไปที่การ์ดแล้ววางการ์ดด้านล่างไว้ด้านบน

แก้ไข:ไม่จำเป็นต้องติดตามเอาต์พุตสแต็กเพียงแค่วนซ้ำตามจำนวนเต็ม


2

Python 2.7 - 57

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

ดีและเรียบง่ายเพียงสลับสับเปลี่ยน ใกล้เคียงกับที่ Golfscript ทำ


1

J (13 ตัวอักษร) และ K (9)

เมื่อปรากฎว่ามันเป็นกระบวนการง่ายๆในการเลิกทำการสับเปลี่ยนและการชอบ APL ก็มีคำวิเศษณ์แบบพับ/เพื่อช่วยพวกเขาในการทำให้สิ่งนี้สั้นที่สุดเท่าที่จะทำได้

J ใช้เวลา 13 ถ่านด้วย(_1|.,)/@i.@-ในขณะที่ K เพียงความต้องการที่ |(1!,)/!:9: APL จะมีลักษณะคล้ายกัน

นี่คือการติดตามทีละขั้นตอนของเวอร์ชั่น 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

คุณอาจพบว่าใน J เราย้อนกลับอาร์เรย์ของจำนวนเต็มครั้งแรก แต่ใน K ที่เราทำมันหลังจากนั้น: นี้เป็นเพราะ K พับเป็นเหมือนเมื่อเทียบกับเจfoldlfoldr

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