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 А, это плохо. Это похоже на довольно похожую проблему. Я согласен с вами, и пусть сообщество решит.
Мистер Public

@ 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 верно, спасибо. Действительно странный актерский состав
edc65

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

@ 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.