슬롯 머신 해커 % 10000001; return secret % 1000; } 이

문제 : Facebook Hacker Cup 2011 슬롯 1B의 슬롯 머신 해커

목표 : stdin / stdout을 사용하여 원하는 언어로 가장 짧은 코드. getRandomNumber정의 된 것으로 가정 할 수 없습니다 . 즉, 솔루션에 잠재적으로 골프 용 버전을 함수 또는 다른 방식으로 포함해야합니다.

참조 솔루션 : on SO [stdin / stdout을 사용하고 데이브의 솔루션에 대해 확신이 없기 때문에 내 것을 선택했습니다.]

문제 텍스트는 다음과 같습니다.

당신은 최근에 슬롯 머신 용 소프트웨어를 쓰는 사람과 친구가되었습니다. 그와 조금 어울리면 슬롯 머신의 작동 방식에 대한 지식을 과시하는 데 어려움을 겪고 있음을 알 수 있습니다. 결국 특정 브랜드의 기계에 사용 된 알고리즘을 자세하게 설명 할 수 있습니다. 알고리즘은 다음과 같습니다.

int getRandomNumber() {
  secret = (secret * 5402147 + 54321) % 10000001;
  return secret % 1000;
}

이 함수는 [0, 999]의 정수를 반환합니다. 각 숫자는 특정 기계 상태에서 휠에 나타나는 10 가지 기호 중 하나를 나타냅니다. secret 은 처음에는 알려지지 않은 음수가 아닌 값으로 설정됩니다.

기계의 작동 시간을 충분히 관찰하면 비밀의 가치를 결정 하여 향후 결과를 예측할 수 있습니다. 미래의 결과를 알면 현명한 방법으로 베팅하고 많은 돈을 벌 수 있습니다.

입력

입력의 첫 번째 행에는 테스트 케이스 수인 양수 T 가 포함 됩니다. 그런 다음 T 테스트 사례 가 이어집니다 . 각 테스트 사례는 관찰 한 횟수 인 양의 정수 N으로 구성됩니다 . 다음 N 토큰은 관측치를 설명하는 0에서 999 사이의 정수입니다.

산출

각 테스트 사례에 대해 공백으로 구분 된 기계에 의해 표시 될 다음 10 개의 값을 출력하십시오. 친구가 설명한 기계로 관찰 한 순서를 만들 수 없으면 "Wrong machine"대신 인쇄하십시오 . 다음 10 개의 값을 고유하게 결정할 수 없으면 "Not enough observations"대신 인쇄하십시오 .

제약

  • T = 20
  • 1 ≤ N ≤ 100
  • 입력의 토큰은 3자를 넘지 않으며 숫자 0-9 만 포함합니다.

입력 예

5
1 968
3 767 308 284
5 78 880 53 698 235
7 23 786 292 615 259 635 540
9 862 452 303 558 767 105 911 846 462

출력 예

Not enough observations
577 428 402 291 252 544 735 545 771 34
762 18 98 703 456 676 621 291 488 332
38 802 434 531 725 594 86 921 607 35
Wrong machine


답변

파이썬, 293 자

import sys
n=1e7+1
for s in[map(int,x.split())for x in sys.stdin][1:]:
 Q=[]
 for i in range(s[1],n,1e3):A=[i];R=[A.append((A[-1]*5402147+54321)%n)or A[-1]%1e3for x in[0]*8+s];Q+=[R[-10:]]*(R[:-10]==s[2:])
 print Q and["%d "*10%tuple(Q[0]),"Not enough observations"][len(Q)>1]or"Wrong Machine"

답변

Python, 316 자

C=10**7+1
G=lambda:(s*5402147+54321)%C
import sys
I=map(int,sys.stdin.read().split())[1:]
while I:
 n=I[0]+1;S=range(C)
 for x in I[1:n]:S=[G()for s in S if s%1000==x]
 if len(S)-1:V="Not enough observations"if S else"Wrong machine"
 else:
  s=S[0];V=""
  for i in range(10):V+="%d "%(s%1000);s=G()
 print V;I=I[n:]