Hacker de máquinas tragamonedas

17

Problema: Slot Machine Hacker de Facebook Hacker Cup 2011 Ronda 1B

Objetivo: el código más corto en su idioma favorito usando stdin / stdout. No puede asumir que getRandomNumberestá definido, es decir, su solución tiene que incluir una versión potencialmente desarrollada como función o de alguna otra manera.

Solución de referencia: en SO [Elegí la mía, porque usa stdin / stdout y no estoy seguro acerca de la solución de Dave.]

El texto del problema sigue:

Recientemente se hizo amigo de un tipo que escribe software para máquinas tragamonedas. Después de pasar un rato con él, te das cuenta de que tiene una inclinación por mostrar su conocimiento de cómo funcionan las máquinas tragamonedas. Eventualmente, usted logra que él le describa con detalles precisos el algoritmo utilizado en una marca particular de máquina. El algoritmo es como sigue:

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

Esta función devuelve un número entero en [0, 999]; cada dígito representa uno de los diez símbolos que aparecen en una rueda durante un estado particular de la máquina. El secreto se establece inicialmente en algún valor no negativo desconocido para usted.

Al observar el funcionamiento de una máquina el tiempo suficiente, puede determinar el valor del secreto y así predecir los resultados futuros. Conociendo los resultados futuros, podría apostar de manera inteligente y ganar mucho dinero.

Entrada

La primera línea de la entrada contiene el número positivo T , el número de casos de prueba. Esto es seguido por los casos de prueba T. Cada caso de prueba consta de un número entero positivo N , el número de observaciones que realiza. Los siguientes N tokens son enteros del 0 al 999 que describen sus observaciones.

Salida

Para cada caso de prueba, muestre los siguientes 10 valores que se mostrarían en la máquina separados por espacios en blanco. Si la secuencia que observó no puede ser producida por la máquina que le describió su amigo, imprima en su "Wrong machine"lugar. Si no puede determinar de forma exclusiva los siguientes 10 valores, imprima en su "Not enough observations"lugar.

Restricciones

  • T = 20
  • 1 ≤ N ≤ 100
  • Los tokens en la entrada no tienen más de 3 caracteres y solo contienen dígitos 0-9.

Entrada de ejemplo

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 

Salida de ejemplo

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
fuente

Respuestas:

3

Python, 293 caracteres

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
fuente
2

Python, 316 caracteres

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
fuente