PNZ (Угадайте 3 унікальних цифри на замовлення)


15

З даного виклику в книзі програмування, PNZ - це гра, де користувач повинен відгадати три унікальні цифри у правильному порядку.

Правила :

  1. Створюється випадкове трицифрове число без повторюваних цифр. (Це те, що користувач намагається здогадатися)
  2. Користувач вводить здогадку з 3 цифр, яку слід оцінити програмою.
  3. Виведіть "P" для кожної правильної цифри в правильному місці.
  4. Виведіть "N" для кожної правильної цифри в неправильному місці.
  5. Виведіть "Z", лише якщо цифри не відповідають правильності.
  6. Продовжуйте приймати введення, доки всі цифри не будуть правильними і не знаходяться у правильному місці, а потім виведіть "PPP" з подальшим числом здогадів, які він взяв у новому рядку.

Примітка :

  • "Правильна цифра" означає, що одна з цифр у здогаді також є однією з цифр у випадковому трицифровому номері.

  • "Правильне місце" означає, що це "Правильна цифра" І знаходиться в тому ж самому місці, що і трицифрове випадкове число.

  • Порядок виведення повинен бути спочатку "P", потім "N", або лише "Z", якщо нічого невірно.

  • Якщо вхід містить повторювані цифри, «Р» має пріоритет над «N» (приклад: Number: 123 Input: 111 Output: P)

  • (ДОДАТКОВО) Вводи, що не мають точно 3-х цифр, не повинні оцінюватися, а також не рахуватися із загальною кількістю здогадів.

Приклад, якщо згенерованих цифр було 123

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

Приклад, якщо згенеровані цифри становили 047

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

Це CodeGolf, тому найкоротша програма виграє!


Ласкаво просимо до PPCG! Це чудовий перший виклик, але я боюся, що ми це робили раніше. Гра інакше відома як Mastermind. Ось існуючий виклик, але я не можу вирішити, закривати старий чи новий. Я трохи схиляюся до закриття цього, але я дозволю громаді вирішити.
Мартін Ендер

@ MartinBüttner Ах, це моє погано. Це здається досить схожою проблемою. Я погоджуся з вами і нехай громада вирішить.
Пан Громадський

@ MartinBüttner Який критерій тут? У якому відношенні старий повинен мати перевагу?
Луїс Мендо

2
@ MartinBüttner Я думаю, що між необхідністю, щоб цифри були унікальними, та інтерактивним характером, цей виклик є досить чітким, щоб бути вартим.
AdmBorkBork

@LuisMendo Я не думаю, що офіційного критерію я вважаю, адже закриття старих викликів - це досить недавня річ. Мій особистий критерій: «який виклик кращий та / або більше безбожних».
Мартін Ендер

Відповіді:


5

JavaScript (ES6) 184 187 195

Редагувати збережені 8 байт thx @Neil Змінити збережені 3 байти thx @ user81655

(нові рядки рахуються як 1 байт)

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)

Тест

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)


Я думаю, що d.splice(v=Math.random()*-~l,1)ви заощадите 5, а може, навіть 8 байт (ціною якоїсь вистави).
Ніл

@Neil Я відхилив сплайс, коли почав знаходити рішення, він здався тривалим. Зараз я спробую ще раз
edc65

1
@ user81655 вірно, дякую. Дійсно дивний акторський
склад

3

PowerShell v2 +, 177 231 168 байт

$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

Як не дивно, я зміг би гольф фіксованої версії бути коротшою довжини, ніж нефіксований варіант ... oO

Велике спасибі @ edc65 за допомогу та натхнення!

Пояснення:

$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

Приклад виконання:

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

Як перевірити, чи не повторюються цифри?
edc65

@ edc65 Виправлено вихід. Це було дорого. Ще працюю в гольф далі, але я не сподіваюся ...
AdmBorkBork

Я впевнений, що ти можеш зробити краще. Використовуйте той факт, що здогадка може мати повторення, але кількість, яку відгадати, не має. Наприклад, у своїй відповіді я починаю з кожної цифри
відгадувати

@ edc65 Дякую за натхнення та допомогу - гольф фіксованої версії повинен бути коротшим, ніж нефіксований варіант! : D
AdmBorkBork

Тепер я зобов'язаний подати заявку
edc65

0

R , 178 166 байт

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

Спробуйте в Інтернеті!

Посилання TIO призначене лише для кількості байтів - спробуйте це на своїй консолі R! (або дайте мені знати, чи є альтернативний варіант).

Дивіться історію для менш гольф, більш читабельної версії.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.