태그 보관물: code-golf

code-golf

PNZ (3 개의 고유 숫자를 순서대로 추측) 입력을 계속 수락 한 다음 “PPP”를

PNZ는 오래 전에 프로그래밍 책의 도전에서 사용자가 올바른 순서로 3 개의 고유 숫자를 추측해야하는 게임입니다.

규칙 :

  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)

  • (선택 사항) 길이가 정확히 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 콘솔에서 시도하십시오! (또는 대체 옵션이 있는지 알려주십시오).

덜 골프 고 읽기 쉬운 버전에 대한 기록을 참조하십시오.


답변