Menganalisis shuffle overhanded

13

Rod memoderasi permainan kartu antara dua pemain: George dan Tim. Saat ini, Tim sedang mengocok kartunya. Rod mencurigai Tim sedang mencoba menipu, jadi dia membutuhkan bantuanmu untuk memeriksa apakah shuffle itu adil.

Tim melakukan shuffle overhanded: ia memotong tumpukan kartu dari bagian bawah geladak, kemudian memotong berbagai bagian dari bagian atas tumpukan ke atas geladak, dan mengulangi prosesnya beberapa kali.

Rod bermata elang dan dapat melihat dengan tepat berapa banyak kartu yang dipotong Tim setiap kali, namun ia tidak dapat menghitung dan melacak kartu secepat Tim mengocok. Di sinilah Anda masuk: Rod ingin Anda menulis sebuah program atau fungsi yang mendapatkan informasi pengocokan yang terperinci dan menentukan apakah pengocokan tersebut adil, lemah atau tipuan.

  • Jika setelah mengocok, kurang dari 25 pasang kartu yang berdekatan tetap bersebelahan (dalam urutan yang sama), maka pengocokan tersebut adil dan permainan dapat berlanjut.
  • Jika setidaknya 25 (tetapi tidak semua) pasangan kartu yang berdekatan tetap berdekatan, maka shuffle tersebut lemah dan Rod akan menindik Tim di atas kepala dan memintanya untuk mengocok lagi.
  • Jika semua kartu tetap pada posisi yang sama di akhir, maka Tim jelas curang dan Rod akan memukulnya dengan trout besar.

Ini kode golf, jadi kode terpendek menang.

Memasukkan:

Anda akan mendapatkan serangkaian angka antara 0 dan 52 (keduanya eksklusif) yang dipisahkan oleh spasi, pada beberapa baris, di mana setiap baris mewakili putaran pengocokan yang dimulai dan diakhiri dengan semua kartu bertumpuk menjadi satu.

Pada setiap baris, angka pertama adalah jumlah kartu yang dipotong Tim dari bagian bawah geladak, dan setiap nomor berikutnya adalah sejumlah kartu yang dijatuhkannya dari tangannya ke atas geladak. Jika ada kartu yang tersisa setelah nomor terakhir pada satu baris, Anda harus mengasumsikan bahwa Tim meletakkannya di atas tumpukan kartu.

Masukan dijamin valid. Setidaknya ada satu baris angka, dan setiap baris mengandung setidaknya 2 angka. Angka pertama pada setiap baris tidak lebih kecil dari jumlah semua angka lainnya pada baris yang sama. Sebuah trailing newline adalah opsional, Anda dapat mengasumsikan bahwa input tersebut memiliki atau tidak memilikinya.

Keluaran:

Program Anda harus mencetak / mengembalikan "fair" jika shuffle itu adil, "lemah" jika shuffle lemah dan "trick" jika Tim menyimpan semua kartu dalam urutan yang sama. Baris baru tambahan adalah opsional.

Contoh:

Dek diasumsikan memiliki 52 kartu, tetapi untuk tujuan demonstrasi, saya akan menggunakan setumpuk yang lebih kecil dari 10 kartu.

Memasukkan:

5 3 1
4 2 2

Dek awal, dilihat dari atas: 0 1 2 3 4 5 6 7 8 9
50 1 2 3 4( 5 6 7 8 9di tangan)
35 6 7 0 1 2 3 4( 8 9di tangan)
18 5 6 7 0 1 2 3 4( 9di tangan)
ujung garis ➜ 9 8 5 6 7 0 1 2 3 4
49 8 5 6 7 0( 1 2 3 4di tangan)
21 2 9 8 5 6 7 0( 3 4di tangan)
23 4 1 2 9 8 5 6 7 0
4 pasang tetap berdekatan:(3 4) (1 2) (5 6) (6 7)

Kasus uji:

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

Keluaran: 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

Keluaran: 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

Keluaran: fair


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

Keluaran: weak


26 13
26 13
26 13
26 13

Keluaran: 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

Keluaran: 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

Keluaran: 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

Keluaran: fair

Persyaratan:

  • Jika Anda menulis suatu fungsi, ia dapat membaca dari input standar atau menerima input sebagai parameter string tunggal. Juga, fungsi dapat mencetak output atau mengembalikannya.
  • Program harus dapat dijalankan di Linux menggunakan perangkat lunak yang tersedia secara bebas.
  • Kode sumber harus menggunakan hanya karakter ASCII.
  • Tidak ada celah standar.
aditsu berhenti karena SE adalah JAHAT
sumber
2
Mengapa pembatasan untuk ASCII? Banyak bahasa (APL, kode mesin, TI-BASIC) sama sekali tidak menggunakan ASCII, jadi Anda secara implisit melarangnya.
lirtosiast
@ThomasKwa Karena saya tidak suka masalah yang terkait dengan menampilkan dan menghitung karakter non-ASCII. Beberapa bahasa tersebut memiliki representasi atau alternatif ASCII. Saya pikir itu bukan pembatasan yang sangat keras, dan sedikit meratakan lapangan bermain.
Aditsu berhenti karena SE adalah JAHAT
Saya pikir sistem penilaian seperti "Entri yang hanya menggunakan karakter ASCII yang dapat dicetak akan memiliki jumlah byte dikalikan dengan log (95) / log (256)" akan menjadi pilihan yang lebih baik jika Anda ingin memberikan insentif yang cukup untuk pengiriman ASCII yang dapat dicetak. Alasannya adalah bahwa isi informasi dari entri dengan skor yang sama akan sama. Secara pribadi, saya masih lebih suka skor polos dengan byte.
lirtosiast
@ ThomasKwa Oke, bagaimana dengan ini? Hanya karakter unicode yang dapat dicetak, yang menghitung byte dalam pengkodean UTF-8
aditsu berhenti karena SE adalah JAHAT

Jawaban:

3

Pyth, 62 byte

@c"weak trick fair"d-!JlfhT-M.:us_cG.u+NYtKrH7-52hK.zU52 2>J26

Demonstrasi.

isaacg
sumber
4

CJam, 76 75 byte

52,qN/{[~](52\-@/(\e_@{/(@+\e_}/\+}/2ew::m2f/0-,_!\26>-"weak trick fair"S/=

Cobalah online di penerjemah CJam .

Dennis
sumber
5
LOL, "trout" :)
aditsu berhenti karena SE adalah JAHAT
2

JavaScript, 292 289 byte

Ini mungkin bisa mendapatkan lebih banyak byte dari itu, tetapi ini adalah lulus pertama yang cepat untuk saat ini:

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")

EDIT: Disimpan 3 byte dengan menggunakan kembali nilai dari iloop deck ketika menghitung jumlah kartu yang berdekatan.

Sean Latham
sumber