Slot Machine Hacker

17

Problem: Slot Machine Hacker vom Facebook Hacker Cup 2011 Runde 1B

Ziel: Kürzester Code in Ihrer Lieblingssprache mit stdin / stdout. Sie können nicht davon ausgehen, dass dies getRandomNumberdefiniert ist, dh Ihre Lösung muss eine potenziell Golf-Version als Funktion oder auf andere Weise enthalten.

Referenzlösung: auf SO [Ich habe meine gewählt, weil sie stdin / stdout verwendet und ich mir nicht sicher bin, was die Lösung von Dave betrifft.]

Problemtext folgt:

Sie haben sich kürzlich mit einem Mann angefreundet, der Software für Spielautomaten schreibt. Nachdem Sie ein bisschen mit ihm rumgehangen haben, bemerken Sie, dass er ein Faible dafür hat, sein Wissen über die Funktionsweise der Spielautomaten zu demonstrieren. Schließlich lässt er sich den Algorithmus einer bestimmten Maschinenmarke genau beschreiben. Der Algorithmus lautet wie folgt:

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

Diese Funktion gibt eine Ganzzahl in [0, 999] zurück. Jede Ziffer steht für eines von zehn Symbolen, die während eines bestimmten Maschinenzustands auf einem Rad erscheinen. secret ist anfangs auf einen nicht negativen Wert gesetzt, den Sie nicht kennen.

Indem Sie den Betrieb einer Maschine lange genug beobachten, können Sie den Wert des Geheimnisses bestimmen und so zukünftige Ergebnisse vorhersagen. Wenn Sie die zukünftigen Ergebnisse kennen, können Sie intelligent wetten und viel Geld gewinnen.

Eingang

Die erste Zeile der Eingabe enthält die positive Zahl T , die Anzahl der Testfälle. Daran schließen sich T -Testfälle an. Jeder Testfall besteht aus einer positiven ganzen Zahl N , der Anzahl Ihrer Beobachtungen. Die nächsten N Token sind ganze Zahlen von 0 bis 999, die Ihre Beobachtungen beschreiben.

Ausgabe

Geben Sie für jeden Testfall die nächsten 10 Werte aus, die vom Gerät angezeigt würden, getrennt durch Leerzeichen. Wenn die von Ihnen beobachtete Sequenz nicht von dem von Ihrem Freund beschriebenen Gerät erstellt werden kann, drucken Sie "Wrong machine"stattdessen. Wenn Sie die nächsten 10 Werte nicht eindeutig bestimmen können, drucken Sie "Not enough observations"stattdessen.

Einschränkungen

  • T = 20
  • 1 ≤ N ≤ 100
  • Token in der Eingabe sind nicht länger als 3 Zeichen und enthalten nur Ziffern von 0 bis 9.

Beispiel Eingabe

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 

Beispielausgabe

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
quelle

Antworten:

3

Python, 293 Zeichen

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"
Knabberzeug
quelle
2

Python, 316 Zeichen

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:]
Keith Randall
quelle