PNZ(按顺序猜测3个唯一数字)


15

从很久以前的编程书籍中的挑战来看,PNZ是一款游戏,用户必须以正确的顺序猜测三个唯一的数字。

规则

  1. 生成一个无重复数字的随机3位数字。(这是用户试图猜测的)
  2. 用户输入3位数字的猜测值,该猜测值将由程序进行评估。
  3. 在正确的位置为每个正确的数字输出“ P”。
  4. 在错误的位置为每个正确的数字输出“ N”。
  5. 仅当没有正确的数字时才输出“ Z”。
  6. 继续接受输入,直到所有数字正确并且在正确的位置,然后输出“ PPP”,后跟在新行上进行的猜测数目。

注意事项

  • “正确的数字”是指猜测中的一位数字也是随机的3位数字中的一位数字。

  • “正确的位置”表示它是“正确的数字”,并且与3位随机数位于同一位置。

  • 输出的顺序应该是所有“ P”的开头,然后是“ N”,或者如果没有正确的地方,则只有“ Z”。

  • 如果一个输入中含有重复的数字,“P”的优先级高于“N”(例如:Number: 123 Input: 111 Output: P

  • (可选)输入的长度不完全是三位数的字符不应该被评估,也不应该计入连续的猜测总数中

如果生成的数字是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。这是现有的挑战,但我无法下定决心要关闭旧的还是新的。我稍微倾向于解决这个问题,但是我会让社区决定。
Martin Ender

@MartinBüttner啊,那是我的坏事。看起来确实是一个非常相似的问题。我会同意您的意见,并让社区做出决定。
公众先生

@MartinBüttner这里的标准是什么?旧的优先权应该扩展到什么程度?
Luis Mendo

2
@MartinBüttner我认为在要求数字唯一和交互性质之间,这一挑战非常明显,值得考虑。
AdmBorkBork '16

@LuisMendo我认为没有正式标准,因为解决旧挑战是最近才发生的事情。我个人的标准是“哪个挑战更好和/或更多准系统”。
Martin Ender

Answers:


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 '16

1
@ user81655对,谢谢。真的很奇怪
edc65 '16

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

奇怪的是,我能够打高尔夫球的固定长度比未固定的长度短。

非常感谢@ 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 '16

@ edc65更正的输出。那太贵了。仍在努力打高尔夫,但我不

我相信你可以做得更好。利用猜测可以重复的事实,但是要猜测的数字没有重复的事实。例如,在我的答案中,我从要猜测的每个数字开始并检查输入,相反将不起作用
edc65 2016年

@ edc65感谢您的启发和帮助-将固定版本打的比非固定版本短!:D
AdmBorkBork '16

现在我注定要
投票

0

R178166字节

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控制台中尝试此操作!(或者让我知道是否还有其他选择)。

请查看历史记录,以获取更多信息,更易读的版本。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.