PNZ (Tebak 3 digit unik secara berurutan)


15

Dari tantangan dalam buku pemrograman sejak dulu, PNZ adalah permainan di mana pengguna harus menebak tiga angka unik dalam urutan yang benar.

Aturan :

  1. Angka 3 digit acak tanpa digit berulang dihasilkan. (Inilah yang coba ditebak pengguna)
  2. Pengguna memasukkan perkiraan 3 digit, yang akan dievaluasi oleh program.
  3. Keluarkan "P" untuk setiap digit yang benar di tempat yang benar.
  4. Keluarkan "N" untuk setiap digit yang benar di tempat yang salah.
  5. Keluarkan "Z" hanya jika tidak ada angka yang benar.
  6. Lanjutkan menerima input hingga semua digit benar dan berada di tempat yang benar, lalu output "PPP" diikuti dengan jumlah tebakan yang diambil pada baris baru.

Catatan :

  • "Digit yang benar" berarti bahwa salah satu digit dalam tebakan juga merupakan salah satu digit dalam angka acak 3 digit.

  • "Tempat yang benar" berarti itu adalah "Angka yang benar" DAN berada di tempat yang sama dengan angka acak 3 digit.

  • Urutan keluaran harus semua "P" pertama, kemudian "N", atau hanya "Z" jika tidak ada yang benar.

  • Jika masukan berisi mengulangi digit, "P" mengambil prioritas di atas "N" (Contoh: Number: 123 Input: 111 Output: P)

  • (OPTIONAL) Input yang panjangnya tidak tepat 3 digit tidak boleh dievaluasi, atau dihitung terhadap total tebakan

Contoh jika angka yang dihasilkan adalah 123

> 147
P
> 152
PN
> 126
PP
> 123
PPP
4

Contoh jika angka yang dihasilkan adalah 047

> 123
Z
> 456
N
> 478
NN
> 947
PP
> 047
PPP
5

Ini CodeGolf, jadi program terpendek menang!


Selamat datang di PPCG! Ini adalah tantangan pertama yang hebat, tetapi saya khawatir kita pernah melakukan ini sebelumnya. Gim ini dikenal sebagai Mastermind. Inilah tantangan yang ada, tetapi saya tidak bisa memutuskan apakah akan menutup yang lama atau yang baru. Saya sedikit condong ke arah penutupan ini, tapi saya akan membiarkan masyarakat memutuskan.
Martin Ender

@ MartinBüttner Ah, itu salahku. Sepertinya masalah yang sangat mirip. Saya akan setuju dengan Anda dan membiarkan komunitas memutuskan.
Tuan Umum

@ MartinBüttner Apa kriteria di sini? Sampai sejauh mana yang lama harus diutamakan?
Luis Mendo

2
@ MartinBüttner Saya pikir antara mengharuskan angka untuk menjadi unik dan sifat interaktif, tantangan ini cukup berbeda untuk menjadi berharga.
AdmBorkBork

@LuisMendo Saya kira tidak ada kriteria resmi, karena menutup tantangan lama adalah hal yang cukup baru. Kriteria pribadi saya adalah "tantangan mana yang lebih baik dan / atau lebih banyak tulang punggung".
Martin Ender

Jawaban:


5

JavaScript (ES6) 184 187 195

Edit Disimpan 8 byte thx @Neil Edit Disimpan 3 byte thx @ user81655

(baris baru dihitung sebagai 1 byte)

d=[...'0123456789']
x=[10,9,8].map(l=>d.splice(Math.random()*l,1))
for(c=p=a='';!p[2];++c)g=prompt(a),n=p='',x.map((d,i)=>d-g[i]?~g.search(d)?n+='N':0:p+='P'),a=p+n||'Z'
alert(a+' '+c)

Uji

d=[...'0123456789']
x=[10,9,8].map(l=>d.splice(Math.random()*l,1))
for(c=p=a='';!p[2];++c)
  g=prompt(a),
  n=p='',
  x.map((d,i)=>
        d-g[i]?~g.search(d)?n+='N':0:p+='P'
       ),
  a=p+n||'Z'
alert(a+' '+c)


Saya pikir d.splice(v=Math.random()*-~l,1)menghemat 5 atau bahkan 8 byte (dengan mengorbankan beberapa kinerja).
Neil

@Neil Saya menolak sambungan ketika saya mulai menemukan solusi, sepertinya panjang. Sekarang saya akan coba lagi
edc65

1
@ user81655 benar, terima kasih. Sungguh pemain yang aneh
edc65

3

PowerShell v2 +, 177 231 168 byte

$g=-join(0..9|Random -c 3);for($c=0;$o-ne"PPP";$c++){$n=$p='';$i=read-host;$o=-join(0..2|%{((("","N")[$i.IndexOf($g[$_])-ge0]),"P")[$g[$_]-eq$i[$_]]}|sort -des);($o,"Z")[!$o]}$c

Anehnya, saya bisa membuat versi golf lebih pendek daripada versi tidak tetap ... oO

Terima kasih banyak kepada @ edc65 atas bantuan dan inspirasinya!

Penjelasan:

$g=-join(0..9|Random -c 3)   # Create an array @(0,1,2,...9) and choose 3 distinct elements
for($c=0;$o-ne"PPP";$c++){   # Loop until output = "PPP", incrementing $count each time
  $i=read-host               # Read input from the user

  $o=-join(0..2|%{((("","N")[$i.IndexOf($g[$_])-ge0]),"P")[$g[$_]-eq$i[$_]]}|sort -des)
       # OK, this is the convoluted part. We're constructing an array of "N", "P", or "",
       # sorting them by descending order (so the P's are first), and then joining them
       # together into a string. The array is constructed by essentially an if/elseif/else
       # statement that is evaluated three times thanks to the 0..2|%{} loop.
       # Starting from the innermost, we choose between "" and "N" based on whether the
       # input number has the current-digit of the secret number somewhere within it. We
       # then choose between that or "P" based on whether it's the _current_ digit of the
       # user input number.

  ($o,"Z")[!$o]
       # Here we output either $o from above or "Z" based on whether $o is empty
}
$c                           # The loop finished (meaning the user guessed), output $count

Contoh dijalankan:

PS C:\Tools\Scripts\golfing> .\pnz.ps1
123
N
111
Z
222
P
452
PN
562
NN
275
PN
258
PPP
7

Bagaimana Anda memeriksa bahwa angka tidak diulang?
edc65

@ edc65 Output terkoreksi. Itu mahal. Masih bekerja untuk bermain golf lebih jauh, tapi saya tidak berharap ...
AdmBorkBork

Saya yakin Anda bisa melakukan yang lebih baik. Manfaatkan fakta bahwa tebakan itu bisa memiliki pengulangan, tetapi jumlah tebakannya belum. Misalnya, dalam jawaban saya, saya mulai dari masing-masing angka untuk ditebak dan memeriksa input, sebaliknya tidak akan berfungsi
edc65

@ edc65 Terima kasih atas inspirasi dan bantuannya - versi golf yang diperbaiki lebih pendek dari versi yang tidak diperbaiki! : D
AdmBorkBork

Sekarang saya terikat untuk memilih
edc65

0

R , 178 166 byte

y=!(s<-sample(48:57,3))
while(any(y!=s)){F=F+1
y<-utf8ToInt(readline())
cat(rep("P",p<-sum(y==s)),rep("N",n<-sum(y%in%s)-p
),if(!(n+p))"Z","
",if(all(y==s))F,sep="")}

Cobalah online!

TIO link hanya untuk jumlah byte - coba ini di konsol R Anda! (atau beri tahu saya jika ada opsi alternatif).

Lihat riwayat untuk versi yang kurang golf, lebih mudah dibaca.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.