PNZ는 오래 전에 프로그래밍 책의 도전에서 사용자가 올바른 순서로 3 개의 고유 숫자를 추측해야하는 게임입니다.
규칙 :
- 반복 숫자가없는 임의의 3 자리 숫자가 생성됩니다. (이것은 사용자가 추측하려고하는 것입니다)
- 사용자는 프로그램에 의해 평가 될 3 자리의 추측 값을 입력합니다.
- 올바른 자리에서 모든 올바른 자리수에 대해 “P”를 출력하십시오.
- 모든 올바른 자릿수에 대해 “N”을 잘못된 위치에 출력하십시오.
- 숫자가 정확하지 않은 경우에만 “Z”를 출력하십시오.
- 모든 숫자가 정확하고 올바른 위치에 올 때까지 입력을 계속 수락 한 다음 “PPP”를 출력 한 다음 새 줄에 걸린 추측 수를 출력하십시오.
참고 :
-
“올바른 숫자”는 추측의 숫자 중 하나가 임의의 3 자리 숫자의 숫자 중 하나임을 의미합니다.
-
“올바른 장소”는 “올바른 자리”이고 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이므로 가장 짧은 프로그램이 승리합니다!
답변
자바 스크립트 (ES6) 184 187 195
편집 저장된 8 바이트 thx @Nail
편집 저장된 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)
답변
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
답변
R , 178166 바이트
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 콘솔에서 시도하십시오! (또는 대체 옵션이 있는지 알려주십시오).
덜 골프 고 읽기 쉬운 버전에 대한 기록을 참조하십시오.