Игровой автомат хакер

17

Задача: игровой автомат Hacker от Facebook Hacker Cup 2011, раунд 1B

Цель: самый короткий код на вашем любимом языке, используя stdin / stdout. Вы не можете предполагать, что getRandomNumberоно определено, т. Е. Ваше решение должно включать потенциально игровую версию в качестве функции или каким-либо другим способом.

Эталонное решение: на SO [Я выбрал свой, потому что он использует stdin / stdout, и я не уверен насчет решения Дейва.]

Текст задачи следующим образом:

Вы недавно подружились с парнем, который пишет программное обеспечение для игровых автоматов. Немного пообщавшись с ним, вы замечаете, что у него есть склонность демонстрировать свои знания о работе игровых автоматов. В конце концов вы получаете его, чтобы он подробно описал вам алгоритм, используемый на конкретной машине. Алгоритм выглядит следующим образом:

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

Эта функция возвращает целое число в [0, 999]; каждая цифра представляет один из десяти символов, которые появляются на колесе во время определенного состояния машины. Первоначально для secret задано какое-то неотрицательное значение, неизвестное вам.

Наблюдая за работой машины достаточно долго, вы можете определить значение секрета и, таким образом, предсказать будущие результаты. Зная будущие результаты, вы сможете делать умные ставки и выиграть много денег.

вход

Первая строка ввода содержит положительное число T - количество тестов. Затем следуют Т- тесты. Каждый тестовый пример состоит из положительного целого числа N , которое вы делаете. Следующие N токенов - это целые числа от 0 до 999, описывающие ваши наблюдения.

Выход

Для каждого теста выведите следующие 10 значений, которые будут отображаться машиной, разделенными пробелами. Если последовательность, которую вы наблюдали, не может быть воспроизведена машиной, которую вам описал ваш друг, напечатайте "Wrong machine"вместо этого. Если вы не можете однозначно определить следующие 10 значений, напечатайте "Not enough observations"вместо этого.

Ограничения

  • Т = 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
marcog
источник

Ответы:

3

Питон, 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"
gnibbler
источник
2

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:]
Кит Рэндалл
источник