Güverte yığını!


15

Alice ve Bob, ardışık negatif olmayan tamsayılarla numaralandırılmış bir deste desteyle bir kart oyunu oynamayı severler.

Yine de Alice'in güverteyi karıştırmanın çok özel bir yolu var. İlk olarak, üst kartı desteden alır ve destenin altına koyar. Sonra bir sonraki kartı çıkarır ve onunla bir yığın başlatır. Ardından, yine üst kartı alta çevirir ve yeni üst kartı yığına koyar. Desteyi boşaltıncaya kadar bu işlemi tekrarlar, bu noktada kazık yeni güverte olur.

  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 | 

Şekil 1: Alice, karmasını 5 kartlı "3, 1, 4, 0, 2" destesinde yapıyor. Kartların arkaları sola bakacak şekilde.

Bir gün, Bob bir haftalık tatile çıktığını duyurur. Oyunu oynayacak kimsesi olmayan Alice, arkadaşı Havva'yı ister. Eve, utanmaz bir aldatmacadır, bu yüzden Alice'in tuhaf karışıklığını gördüğünde, güverteyi önceden kendi yararına istifleyebileceğini fark eder!

Eve ilk günden sonra eve döndüğünde, oyunda biraz analiz yapar ve en iyi oranlarının kartların 0, 1, 2, 3, 4, 5, ... sıralamasında olduğunu anlar ... Bununla birlikte, destede kaç kart olduğunu yakalayın, bu yüzden koluna, çalıştırıldığında destenin boyutunu alan ve Havva'nın kartları koyması gereken sırayı görüntüleyen bir kod yazmak için hararetli bir plan çıkarır. Alice güverteyi karıştırır, son güverte 0, 1, 2, 3, ...

Eve, kodun hangi dilde olduğunu (hepsini biliyor) ya da kodun bir tamsayı argümanı alan ve bir dizi döndüren bir işlev mi yoksa bir komut satırı argümanı veya STDIN aracılığıyla girdi alan bir program mı olduğu önemli değildir. ve sonuçları STDOUT'a yazmak. Bununla birlikte, Alice'in kodu görme ve yakalama şansını en aza indirgemek için koda mümkün olduğunca kısa sürede ihtiyacı var.

Ahlaksız olduğu gibi, Havva'ya yardım edebilir misiniz?

Örnek giriş ve çıkışlar:

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
Güzel ifadeler, çatlayacağım.
Mayıʇǝɥʇuʎs

Yığınlarınızın en üste hizalanması biraz kafa karıştırıcıdır. Ve yığının sırasını açıkça belirtmek de soruyu biraz açıklığa kavuşturmaya yardımcı olacaktır.
Martin Ender

Aynı şey güverte için de geçerli.
Martin Ender

Ayrıca: 5 uzunluğunda bir örnek alarak bizi kandırmaya mı çalışıyorsunuz? shuffle(shuffle(range(5))) == range(5)
Bozmak istemeden

@Synthetica Sanırım öyle oluyor ki Alice'in 5 kartlı bir destedeki karışıklığı bir girişimdir. Gönderirken gerçekten düşünmedim çünkü genel olarak tutmuyor.
algorithmmshark

Yanıtlar:


5

GolfScript, 15 14 13 bayt

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

Çevrimiçi deneyin.

Misal

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

Nasıl çalışır

])    # 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
{}/Bir karakter kaydetmek için harita operatörü yerine kullanabilirsiniz .
Howard

Teşekkürler! Bir dizi istedim, bu yüzden harita kullandım. Alışkanlık gücü ...
Dennis

1
](çünkü ilk iki karakter girişin altına boş bir dizi koyar ve sizi daha sonra kaydeder []\ .
Peter Taylor

Teşekkürler! Bunun neden çevrimiçi çevirmenle çalışmadığını anlamak çok uzun sürdü. Yığını temizlemeyi unuttum ...
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)

Döndürülen vektördeki son eleman destenin üst kısmıdır.


4

Mathematica, 92 77 46 bayt

Değişkendeki girdiyi bekler n:

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

Sadece bir kartın üzerinde hareket edip alt kartı üste koyarak karıştırmayı geriye doğru oynatıyor.

EDIT: çıkış yığını izlemeye gerek yok, sadece tamsayılar üzerinden tekrarlayın.


2

Python 2.7-57

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

Güzel ve basit, sadece karıştırmayı ters çevir. Golfscript bunu nasıl oldukça yakın.


1

J (13 karakter) ve K (9)

Anlaşıldığı gibi, karıştırmayı geri almak için basit bir süreç ve APL-like katlama zarfına sahip / bunu mümkün olduğunca kısa hale getirmelerine yardımcı sahiptir.

J ile 13 karakter (_1|.,)/@i.@-alırken, K için sadece 9 gerekir |(1!,)/!:. APL de benzer şekilde kısa olacaktır.

İşte J versiyonunun adım adım izlemesi.

(_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'de, önce tamsayı dizisini tersine çevirdiğimizi fark edebilirsiniz, ancak K'de bunu daha sonra yaparız: bunun nedeni, K katının J'lere foldlkıyasla daha çok a'ya benzer olmasıdır foldr.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.