PNZ (Zgadnij 3 unikalne cyfry w kolejności)

15

Z wyzwania w książce programowej dawno temu, PNZ to gra, w której użytkownik musi odgadnąć trzy unikalne cyfry we właściwej kolejności.

Zasady :

  1. Generowany jest losowy 3-cyfrowy numer bez powtarzających się cyfr. (Właśnie to użytkownik próbuje odgadnąć)
  2. Użytkownik wprowadza 3 cyfry, które program ma ocenić.
  3. Wypisz „P” dla każdej poprawnej cyfry we właściwym miejscu.
  4. Podaj „N” dla każdej poprawnej cyfry w niewłaściwym miejscu.
  5. Wypisz „Z” tylko wtedy, gdy cyfry nie są poprawne.
  6. Kontynuuj przyjmowanie danych wejściowych, dopóki wszystkie cyfry nie będą poprawne i we właściwym miejscu, a następnie wyślij „PPP”, a następnie liczbę zgadnięć, które zajęło w nowym wierszu.

Uwaga :

  • „Prawidłowa cyfra” oznacza, że ​​jedna z cyfr w domysłach jest również jedną z cyfr w losowej 3-cyfrowej liczbie.

  • „Prawidłowe miejsce” oznacza, że ​​jest to „Prawidłowa cyfra” ORAZ znajduje się w tym samym miejscu, co 3-cyfrowa liczba losowa.

  • Kolejność wypisywania powinna być pierwsza „P”, następnie „N” lub tylko „Z”, jeśli nic nie jest poprawne.

  • Jeżeli sygnał wejściowy zawiera powtarzające się cyfry „P” ma wyższy priorytet niż „n” (na przykład: Number: 123 Input: 111 Output: P)

  • (OPCJONALNIE) Dane wejściowe, które nie mają dokładnie 3 cyfr długości, nie powinny być oceniane, ani liczyć się do bieżącej sumy domysłów

Przykład, jeśli wygenerowane cyfry miały wartość 123

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

Przykład, jeśli wygenerowane cyfry miały wartość 047

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

To jest CodeGolf, więc wygrywa najkrótszy program!

Mr Public
źródło
Witamy w PPCG! To świetne pierwsze wyzwanie, ale obawiam się, że już to zrobiliśmy. Ta gra nazywa się Mastermind. Oto istniejące wyzwanie, ale nie mogę się zdecydować, czy zamknąć stary, czy nowy. Nieznacznie skłaniam się ku temu, ale pozwolę społeczności zdecydować.
Martin Ender,
@ MartinBüttner Ah, to moje złe. Wygląda na dość podobny problem. Zgodzę się z tobą i pozwolę społeczności decydować.
Pan Publiczny
@ MartinBüttner Jakie jest tutaj kryterium? Do jakiego stopnia stary powinien mieć pierwszeństwo?
Luis Mendo,
2
@ MartinBüttner Myślę, że między wymaganiem unikatowości cyfr a interaktywnym charakterem to wyzwanie jest wystarczająco wyraźne, aby było opłacalne.
AdmBorkBork
@LuisMendo Myślę, że nie ma oficjalnego kryterium, ponieważ zamykanie starych wyzwań jest dość nową rzeczą. Moje osobiste kryterium brzmi: „które wyzwanie jest lepsze i / lub więcej gorzej”.
Martin Ender

Odpowiedzi:

5

JavaScript (ES6) 184 187 195

Edytuj zapisane 8 bajtów dzięki @Neil Edytuj zapisane 3 bajty dzięki @ użytkownik 81655

(nowe linie liczone jako 1 bajt)

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)

Test

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
źródło
Myślę, że d.splice(v=Math.random()*-~l,1)oszczędza ci 5, a może nawet 8 bajtów (kosztem pewnej wydajności).
Neil,
@ Nee Odrzuciłem splot, kiedy zacząłem znaleźć rozwiązanie, wydawało się to długie. Teraz spróbuję ponownie
edc65,
1
@ user81655 dobrze, dziękuję. Naprawdę dziwna obsada
edc65
3

PowerShell v2 +, 177 231 168 bajtów

$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

Co dziwne, byłem w stanie grać w golfa w wersji stałej, aby była krótsza niż wersja nie naprawiona ... oO

Ogromne podziękowania dla @ edc65 za pomoc i inspirację!

Wyjaśnienie:

$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

Przykładowy przebieg:

PS C:\Tools\Scripts\golfing> .\pnz.ps1
123
N
111
Z
222
P
452
PN
562
NN
275
PN
258
PPP
7
AdmBorkBork
źródło
Jak sprawdzić, czy cyfry się nie powtarzają?
edc65
@ edc65 Poprawione dane wyjściowe. To było drogie. Nadal pracuję nad golfem, ale nie mam nadziei ...
AdmBorkBork
Jestem pewien, że możesz zrobić lepiej. Wykorzystaj fakt, że zgadywanie może mieć powtórzenia, ale liczba zgadywania nie ma. Na przykład w mojej odpowiedzi zaczynam od odgadnięcia każdej cyfry i sprawdzam wprowadzone dane, przeciwnie nie zadziałałoby
edc65
@ edc65 Dzięki za inspirację i pomoc - grałeś w golfa w ustaloną wersję, która jest krótsza niż w wersji nie ustalonej! : D
AdmBorkBork
Teraz muszę głosować pozytywnie
edc65
0

R , 178 166 bajtów

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

Wypróbuj online!

Łącze TIO służy tylko do liczenia bajtów - wypróbuj to na konsoli R. (lub daj mi znać, jeśli istnieje opcja alternatywna).

Zobacz historię dla mniej golfowej, bardziej czytelnej wersji.

JayCe
źródło