PNZ (Sırasıyla 3 benzersiz basamak tahmin edin)


15

Uzun zaman önce bir programlama kitabındaki bir meydan okumadan PNZ, kullanıcının üç benzersiz haneyi doğru sırada tahmin etmesi gereken bir oyundur.

Kurallar :

  1. Yinelenen basamaklar içermeyen rastgele 3 basamaklı bir sayı oluşturulur. (Kullanıcının tahmin etmeye çalıştığı şey budur)
  2. Kullanıcı, program tarafından değerlendirilecek 3 basamaklı bir tahmin girer.
  3. Doğru yerde her doğru basamak için bir "P" girin.
  4. Yanlış bir yerde her doğru basamak için bir "N" çıktısı alın.
  5. Yalnızca rakam doğru olmadığında bir "Z" çıktısı alın.
  6. Tüm basamaklar doğru olana ve doğru yere girene kadar girişleri kabul etmeye devam edin, ardından "PPP" çıktısını ve ardından yeni bir satırda aldığı tahmin sayısını izleyin.

Not :

  • "Doğru basamak", tahmindeki rakamlardan birinin rastgele 3 basamaklı sayıdaki rakamlardan biri olduğu anlamına gelir.

  • "Doğru yer", "Doğru basamak" olduğu anlamına gelir VE 3 basamaklı rasgele sayı ile aynı yerde bulunur.

  • Çıktı sırası ilk önce "P", sonra "N" veya sadece hiçbir şey doğru değilse "Z" olmalıdır.

  • Bir giriş tekrar basamak içeriyorsa, "P", "N" göre önceliğe sahiptir (örnek: Number: 123 Input: 111 Output: P)

  • (İSTEĞE BAĞLI) Tam olarak 3 basamaklı olmayan girdiler değerlendirilmemeli veya akan toplam tahmin sayılmamalıdır

Oluşturulan rakamlar 123 ise örnek

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

Oluşturulan basamaklar 047 ise örnek

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

Bu CodeGolf, bu yüzden en kısa program kazanıyor!


PPCG'ye Hoşgeldiniz! Bu büyük bir ilk zorluk, ama daha önce yaptığımızdan korkuyorum. Oyun Beyni olarak bilinir. İşte mevcut meydan okuma, ancak eskisini veya yenisini kapatmak için karar veremiyorum. Bunu kapatmaya hafifçe yaslanıyorum, ama topluluğun karar vermesine izin vereceğim.
Martin Ender

@ MartinBüttner Ah, bu benim kötüm. Oldukça benzer bir sorun gibi görünüyor. Seninle aynı fikirdeyim ve topluluğun karar vermesine izin vereceğim.
Bay Public

@ MartinBüttner Buradaki kriter nedir? Eskisi ne ölçüde önceliğe sahip olmalı?
Luis Mendo

2
@ MartinBüttner Bence basamakların benzersiz olmasını istemekle etkileşimli doğa arasında, bu meydan okuma değerli olmaya yetecek kadar farklı.
AdmBorkBork

@LuisMendo Sanırım resmi bir kriter yok, çünkü eski zorlukları kapatmak oldukça yeni bir şey. Kişisel kriterim "hangi meydan okuma daha iyi ve / veya daha fazla barebone".
Martin Ender

Yanıtlar:


5

JavaScript (ES6) 184 187 195

Düzenle Kaydedilmiş 8 bytes thx @Neil Düzenle Kaydedilmiş 3 bytes thx @ user81655

(yeni satırlar 1 bayt olarak sayılır)

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)

Ölçek

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)


Sanırım d.splice(v=Math.random()*-~l,1)5 veya belki 8 bayt tasarruf (bazı performans pahasına).
Neil

@Bir çözüm bulmaya başladığımda eki reddetmedim, uzun görünüyordu. Şimdi tekrar deneyeceğim
edc65

1
@ user81655 doğru, teşekkürler. Gerçekten garip bir oyuncu
edc65

3

PowerShell v2 +, 177 231 168 bayt

$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

Tuhaf bir şekilde, sabit sürümü, düzeltilmemiş sürümden daha kısa bir uzunlukta golf yapabildim ... oO

@ Edc65'e yardımları ve ilhamları için çok teşekkürler !

Açıklama:

$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

Örnek çalışma:

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

Basamakların tekrarlanmadığını nasıl kontrol edersiniz?
edc65

@ edc65 Düzeltilmiş çıktı. Bu pahalıydı. Hala golf daha fazla çalışıyor, ama umutlu değilim ...
AdmBorkBork

Eminim daha iyisini yapabilirsin. Tahminin tekrarlanabileceği gerçeğinden yararlanın, ancak tahmin edilecek sayı yok. Örneğin,
cevabımda

@ edc65 İlham ve yardım için teşekkürler - sabit sürümün sabit olmayan sürümden daha kısa olması için golf! : D
AdmBorkBork

Şimdi oyuna bağlıyım
edc65

0

R , 178166 bayt

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

Çevrimiçi deneyin!

TIO bağlantısı sadece bayt sayımı içindir - bunu R konsolunuzda deneyin! (veya alternatif bir seçenek olup olmadığını bana bildirin).

Daha az golf oynayan, daha okunabilir sürüm için geçmişe bakın.

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.