Aşırı el karmalarını analiz edin


13

Rod iki oyuncu arasında bir kart oyunu yönetiyor: George ve Tim. Şu anda Tim kartları karıştırıyor. Rod, Tim'in hile yapmaya çalıştığından şüphelenir, bu nedenle shuffle'ın adil olup olmadığını kontrol etmek için yardımınıza ihtiyacı vardır.

Tim aşırıya kaçan shuffle'ı yapıyor: destenin altından bir yığın kart kesiyor, daha sonra destenin üstünden destenin üstüne çeşitli parçaları kesiyor ve işlemi birkaç kez tekrarlıyor.

Çubuk kartal gözlü ve Tim'in her seferinde kaç tane kart kesdiğini görebiliyor, ancak Tim'in karıştırdığı kadar hızlı kartları hesaplayamıyor ve takip edemiyor. Geldiğiniz yer budur: Çubuk, ayrıntılı karıştırma bilgilerini alan ve karıştırmanın adil, zayıf veya hile olup olmadığını belirleyen bir program veya işlev yazmanızı ister.

  • Karıştırmadan sonra, 25 çiftten az bitişik kart (aynı sırada) bitişik kalırsa, karışıklık adil olur ve oyun devam edebilir.
  • En az 25 (hepsi değil) bitişik kart çifti bitişik kalırsa, karışıklık zayıftır ve Rod, Tim'i başının üzerine sokar ve ondan biraz daha karıştırmasını ister.
  • Tüm kartlar sonunda aynı pozisyonda kalırsa, Tim açıkça aldatır ve Rod onu büyük bir alabalıkla vurur.

Bu kod golf, bu yüzden en kısa kod kazanır.

Giriş:

Birkaç satırda, boşlukla ayrılmış 0 ile 52 (her ikisi de ayrıcalıklı) arasında bir dizi sayı elde edersiniz, burada her satır bir araya toplanan tüm kartlarla başlayan ve biten bir karıştırma turunu temsil eder.

Her satırda, ilk sayı Tim'in destenin altından kesdiği kart sayısıdır ve sonraki her sayı elinden destenin üstüne bıraktığı kart sayısıdır. Bir satırdaki son sayıdan sonra kart kalırsa, Tim'in destenin üstüne koyduğunu varsaymalısınız.

Girişin geçerli olduğu garanti edilmektedir. En az bir sayı satırı vardır ve her satır en az 2 sayı içerir. Her satırdaki ilk sayı, aynı satırdaki diğer tüm sayıların toplamından küçük değildir. Sondaki bir satırsonu isteğe bağlıdır, girdinin bir tane olduğunu veya bir tane olmadığını varsayabilirsiniz.

Çıktı:

Programınız shuffle adil ise "fair", shuffle zayıf ise "zayıf" ve Tim tüm kartları aynı sırada tutuyorsa "trick" yazmalı / döndürmelidir. Sondaki bir satırsonu isteğe bağlıdır.

Misal:

Destenin 52 kart olduğu varsayılır, ancak gösterim amacıyla 10 karttan daha küçük bir desteyi kullanacağım.

Giriş:

5 3 1
4 2 2

İlk güverte, üstten bakıldığında: 0 1 2 3 4 5 6 7 8 9
50 1 2 3 4( 5 6 7 8 9elde)
35 6 7 0 1 2 3 4( 8 9elde)
18 5 6 7 0 1 2 3 4( 9elde)
satır sonu ➜ 9 8 5 6 7 0 1 2 3 4
49 8 5 6 7 0( 1 2 3 4elde)
21 2 9 8 5 6 7 0( 3 4elde)
23 4 1 2 9 8 5 6 7 0
4 çift bitişik kalır:(3 4) (1 2) (5 6) (6 7)

Test senaryoları:

43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5

Çıktı: fair


43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5

Çıktı: weak


29 24
19 18
38 2 1 8 13 6 4
47 15 16 5 2 1 7
34 22 9 3
44 9 10 11 3 1 7
33 18 4 2 3 3

Çıktı: fair


24 6 12 4
25 3 19
36 4 25 2
19 11 1 3
15 9 3
37 5 27

Çıktı: weak


26 13
26 13
26 13
26 13

Çıktı: trick


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Çıktı: weak


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Çıktı: trick


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
49 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Çıktı: fair

Gereksinimler:

  • Bir işlev yazarsanız, standart girişten okuyabilir veya girişi tek bir dize parametresi olarak alabilir. Ayrıca, işlev çıktıyı yazdırabilir veya döndürebilir.
  • Program, Linux'ta serbestçe kullanılabilen yazılım kullanılarak çalıştırılabilir olmalıdır.
  • Kaynak kod yalnızca ASCII karakterleri kullanmalıdır.
  • Standart boşluklar yok.

2
Neden ASCII kısıtlaması? Birçok dil (APL, makine kodu, TI-BASIC) ASCII kullanmaz, bu nedenle bunları dolaylı olarak reddedersiniz.
lirtosiast

@ThomasKwa Çünkü ASCII olmayan karakterleri görüntüleme ve saymayla ilgili sorunları sevmiyorum. Bu dillerden bazılarının ASCII temsilleri veya alternatifleri vardır. Bence bu çok sert bir kısıtlama değil ve oyun alanını biraz düzeltiyor.
aditsu bıraktı çünkü SE EVIL

Bence yazdırılabilir ASCII gönderimlerini oldukça teşvik etmek istiyorsanız "Yalnızca yazdırılabilir ASCII karakterleri kullanan girişlerin bayt sayısı log (95) / log (256) ile çarpılacaktır" gibi bir puanlama sisteminin daha iyi bir seçenek olacağını düşünüyorum. Akıl yürütme, aynı puana sahip girişlerin bilgi içeriğinin eşit olacağıdır. Şahsen yine de bayt cinsinden sade bir skorlamayı tercih ederim.
lirtosiast

@ThomasKwa Tamam, buna ne dersin? Sadece yazdırılabilir Unicode karakterleri, sayma UTF-8 kodlamasında bayt
aditsu çıkın SE KÖTÜ çünkü

Yanıtlar:




2

JavaScript, 292 289 bayt

Bu muhtemelen ondan daha fazla bayt sıkıştırabilir, ancak şimdilik hızlı bir ilk geçiş:

d=[];for(i=0;i<52;i+=1)d[i]=i
s=prompt().split('\n')
s.forEach(function(e,i){s[i]=e.split(' ')
h=d.splice(-s[i][0],99)
for(j=1;j<s[i].length;j+=1)d.unshift.apply(d,h.splice(0,s[i][j]))
d.unshift.apply(d,h)})
for(c=0;i>1;i-=1)if(d[i-2]==d[i-1]-1)c+=1
alert(c<25?"fair":c<51?"weak":"trick")

DÜZENLEME: iBitişik kartların sayısını sayarken deste oluşturma döngüsünün değerini yeniden kullanarak 3 bayt kaydedildi .

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.