Хакер для ігрових автоматів


17

Проблема: Хакер ігрових автоматів від Facebook Hacker Cup 2011, раунд 1Б

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

Довідкове рішення: на SO [Я вибрав моє, тому що воно використовує stdin / stdout, і я не впевнений у рішенні Дейва.]

Текст проблеми наступний:

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

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

Ця функція повертає ціле число в [0, 999]; кожна цифра представляє один з десяти символів, які з’являються на колесі під час певного стану машини. секрет спочатку встановлюється на якесь невідоме вам значення.

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

Вхідні дані

Перший рядок введення містить додатне число 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

Відповіді:


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"

2

Пітон, 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:]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.