Hacker de caça-níqueis


17

Problema: Hacker de caça-níqueis do Facebook Hacker Cup 2011 Round 1B

Objetivo: código mais curto no seu idioma favorito usando stdin / stdout. Você não pode assumir que getRandomNumberestá definido, ou seja, sua solução precisa incluir uma versão potencialmente disponível como uma função ou de alguma outra maneira.

Solução de referência: no SO [eu escolhi o meu, porque ele usa stdin / stdout e não tenho certeza sobre a solução do dave.]

O texto do problema segue:

Você recentemente fez amizade com um cara que escreve software para máquinas caça-níqueis. Depois de sair um pouco com ele, você percebe que ele tem uma propensão a mostrar seu conhecimento de como as máquinas caça-níqueis funcionam. Eventualmente, você o faz descrever detalhadamente o algoritmo usado em uma determinada marca de máquina. O algoritmo é o seguinte:

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

Esta função retorna um número inteiro em [0, 999]; cada dígito representa um dos dez símbolos que aparecem em uma roda durante um estado específico da máquina. O segredo é inicialmente definido como um valor não negativo desconhecido para você.

Observando a operação de uma máquina por tempo suficiente, você pode determinar o valor do segredo e, assim, prever resultados futuros. Conhecendo os resultados futuros, você poderá apostar de maneira inteligente e ganhar muito dinheiro.

Entrada

A primeira linha da entrada contém o número positivo T , o número de casos de teste. Isso é seguido pelos casos de teste T. Cada caso de teste consiste em um número inteiro positivo N , o número de observações que você faz. Os próximos N tokens são números inteiros de 0 a 999, descrevendo suas observações.

Resultado

Para cada caso de teste, imprima os próximos 10 valores que seriam exibidos pela máquina separados por espaços em branco. Se a sequência que você observou não puder ser produzida pela máquina que seu amigo lhe descreveu, imprima "Wrong machine". Se você não conseguir determinar exclusivamente os próximos 10 valores, imprima "Not enough observations".

Restrições

  • T = 20
  • 1 ≤ N ≤ 100
  • Os tokens na entrada não têm mais que 3 caracteres e contêm apenas dígitos de 0 a 9.

Exemplo de entrada

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 

Saída de exemplo

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

Respostas:


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"

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:]
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.