PNZ (3 개의 고유 숫자를 순서대로 추측)


15

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이므로 가장 짧은 프로그램이 승리합니다!


PPCG에 오신 것을 환영합니다! 이것은 첫 번째 큰 도전이지만, 우리가 전에 이것을 한 것을 두려워합니다. 이 게임은 Mastermind라고도합니다. 여기에 기존 도전이 있지만 이전 질문을 닫을 것인지 새 것을 닫을 것인지 생각할 수 없습니다. 나는 이것을 마무리하는 데 약간 기울고 있지만 커뮤니티가 결정하도록 할 것입니다.
Martin Ender 2016 년

@ MartinBüttner 아, 그건 나쁘다. 꽤 비슷한 문제처럼 보입니다. 동의하고 커뮤니티가 결정하도록하겠습니다.
Mr Public

@ MartinBüttner 여기서 기준은 무엇입니까? 오래된 것의 우선 순위는 어느 정도입니까?
Luis Mendo

2
@ MartinBüttner 숫자가 고유해야한다는 것과 대화 형이 요구되는 것 사이에서이 도전은 가치가있을만큼 뚜렷합니다.
AdmBorkBork

@LuisMendo 오래된 도전을 끝내는 것이 상당히 최근의 일이기 때문에 내가 생각하는 공식적인 기준은 없습니다. 나의 개인적인 기준은 "어느 도전이 더 좋거나 더 많은 뼈다귀"입니다.
Martin Ender

답변:


5

자바 스크립트 (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)


나는 d.splice(v=Math.random()*-~l,1)5 또는 8 바이트를 절약 할 수 있다고 생각 합니다 (일부 성능 저하).
Neil

@Neil 솔루션을 찾기 시작했을 때 스플 라이스를 거부했는데 시간이 오래 걸렸습니다. 이제 다시 시도하겠습니다
edc65

1
감사합니다. 정말 이상한 캐스트
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

지금 나는
공감대에 갇혀있다

0

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 콘솔에서 시도하십시오! (또는 대체 옵션이 있는지 알려주십시오).

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.