PNZ (Errate 3 eindeutige Ziffern in Reihenfolge)

15

Nach einer Herausforderung in einem Programmierbuch ist PNZ ein Spiel, bei dem der Benutzer drei eindeutige Ziffern in der richtigen Reihenfolge erraten muss.

Regeln :

  1. Eine zufällige dreistellige Zahl ohne wiederholte Ziffern wird generiert. (Dies ist, was der Benutzer zu erraten versucht)
  2. Der Benutzer gibt eine dreistellige Schätzung ein, die vom Programm ausgewertet werden soll.
  3. Geben Sie für jede richtige Ziffer an der richtigen Stelle ein "P" aus.
  4. Geben Sie für jede richtige Ziffer an einer falschen Stelle ein "N" aus.
  5. Geben Sie ein "Z" nur aus, wenn keine Ziffern korrekt sind.
  6. Akzeptieren Sie weiterhin Eingaben, bis alle Ziffern korrekt und an der richtigen Stelle sind, und geben Sie dann "PPP" gefolgt von der Anzahl der Raten in einer neuen Zeile aus.

Hinweis :

  • Eine "richtige Ziffer" bedeutet, dass eine der Ziffern in der Vermutung auch eine der Ziffern in der dreistelligen Zufallszahl ist.

  • Eine "richtige Stelle" bedeutet, dass es sich um eine "richtige Stelle" handelt UND sich an derselben Stelle wie die dreistellige Zufallszahl befindet.

  • Die Ausgabereihenfolge sollte alle "P" zuerst sein, dann "N" oder nur "Z", wenn nichts korrekt ist.

  • Wenn ein Eingang wiederholende Ziffern enthält, „P“ Vorrang vor „N“ (Beispiel: Number: 123 Input: 111 Output: P)

  • (OPTIONAL) Eingaben, die nicht genau dreistellig sind, sollten weder ausgewertet noch für die laufende Summe der Vermutungen berücksichtigt werden

Beispiel, wenn die generierten Ziffern 123 waren

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

Beispiel, wenn die generierten Ziffern 047 waren

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

Das ist CodeGolf, also gewinnt das kürzeste Programm!

Herr Public
quelle
Willkommen bei PPCG! Dies ist eine großartige erste Herausforderung, aber ich fürchte, wir haben das schon einmal gemacht. Das Spiel ist auch als Mastermind bekannt. Hier ist die bestehende Herausforderung, aber ich kann mich nicht entscheiden, ob ich die alte oder die neue schließen soll. Ich bin etwas geneigt, dies zu schließen, aber ich werde die Community entscheiden lassen.
Martin Ender
@ MartinBüttner Ah, das ist mein schlechtes. Es scheint ein ziemlich ähnliches Problem zu sein. Ich stimme dir zu und lasse die Community entscheiden.
Mr Public
@ MartinBüttner Was ist hier das Kriterium? Inwieweit sollte der alte Vorrang haben?
Luis Mendo
2
@ MartinBüttner Ich denke, zwischen dem Erfordernis, dass die Ziffern eindeutig sind und dem interaktiven Charakter, ist diese Herausforderung deutlich genug, um sich zu lohnen.
AdmBorkBork
@LuisMendo Ich glaube, es gibt kein offizielles Kriterium, da das Schließen alter Herausforderungen eine relativ neue Sache ist. Mein persönliches Kriterium ist "welche Herausforderung ist besser und / oder mehr Barebones".
Martin Ender

Antworten:

5

JavaScript (ES6) 184 187 195

Bearbeiten Gespeichert 8 Bytes thx @Neil Bearbeiten Gespeichert 3 Bytes thx @ user81655

(Zeilenumbrüche werden als 1 Byte gezählt)

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)

Prüfung

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)

edc65
quelle
Ich denke, d.splice(v=Math.random()*-~l,1)spart Ihnen 5 oder vielleicht sogar 8 Bytes (auf Kosten einiger Leistung).
Neil
@Neil Ich habe Splice abgelehnt, als ich anfing, eine Lösung zu finden, es schien langwierig. Jetzt werde ich es erneut versuchen
edc65 20.01.16
1
@ user81655 richtig, danke. Wirklich eine seltsame Besetzung
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

Seltsamerweise konnte ich die fixe Version kürzer als die unfixierte Version spielen ... oO

Vielen Dank an @ edc65 für seine Unterstützung und Inspiration!

Erläuterung:

$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

Beispiellauf:

PS C:\Tools\Scripts\golfing> .\pnz.ps1
123
N
111
Z
222
P
452
PN
562
NN
275
PN
258
PPP
7
AdmBorkBork
quelle
Wie überprüfen Sie, dass die Ziffern nicht wiederholt werden?
Edc65
@ edc65 Ausgabe korrigiert. Das war teuer Ich arbeite immer noch daran, weiter Golf zu spielen, aber ich bin nicht
zuversichtlich
Ich bin sicher, Sie können es besser machen. Nutzen Sie die Tatsache, dass die Vermutung Wiederholungen aufweisen kann, die zu erratende Zahl jedoch nicht. Zum Beispiel, in meiner Antwort beginne ich mit jeder zu erratenden Ziffer und überprüfe die Eingabe, das Gegenteil würde nicht funktionieren
edc65
@ edc65 Vielen Dank für die Inspiration und Unterstützung - Golfen die feste Version kürzer als die nicht feste Version! : D
AdmBorkBork
Jetzt muss ich upvote
edc65
0

R , 178 166 Bytes

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

Probieren Sie es online!

TIO Link ist nur für die Anzahl der Bytes - versuchen Sie dies in Ihrer R-Konsole! (oder lassen Sie es mich wissen, wenn es eine alternative Option gibt).

In der Historie finden Sie weniger Golf spielende, besser lesbare Versionen.

JayCe
quelle