PNZ(3つの固有の数字を順番に推測)


15

ずっと前のプログラミング本の課題から、PNZはユーザーが正しい順序で3つの固有の数字を推測する必要があるゲームです。

ルール

  1. 繰り返し数字のないランダムな3桁の数字が生成されます。(これはユーザーが推測しようとしているものです)
  2. ユーザーは3桁の推測値を入力します。これはプログラムによって評価されます。
  3. 正しい場所にある正しい数字ごとに「P」を出力します。
  4. 間違った場所で正しい数字ごとに「N」を出力します。
  5. 数字が正しくない場合にのみ「Z」を出力します。
  6. すべての数字が正しい場所に正しく入力されるまで入力を受け入れ、「PPP」とそれに続く新しい行での推測の数を出力します。

  • 「正しい数字」とは、推測の数字の1つがランダムな3桁の数字の数字の1つでもあることを意味します。

  • 「正しい場所」とは、「正しい数字」であり、3桁の乱数と同じ場所にあることを意味します。

  • 出力の順序は、最初にすべて「P」、次に「N」、または何も正しくない場合は「Z」のみである必要があります。

  • 入力は、繰り返しの数字が含まれる場合は、「P」は「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へようこそ!これは素晴らしい最初の挑戦ですが、私たちは以前これをやったことがないのではないかと思います。ゲームは別の方法で首謀者として知られています。ここに既存の課題がありますが、古いものを閉じるか新しいものを閉じるかを決めることはできません。私はこれをやめることに少し傾いていますが、コミュニティに決めさせます。
マーティンエンダー

@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そう、ありがとう。本当に奇妙なキャスト
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

今、私はupvote
edc65

0

R178 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コンソールでこれを試してください!(または、代替オプションがあるかどうかを教えてください)。

ゴルフの少ない、読みやすいバージョンの履歴を参照してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.