Dada uma lista de números inteiros separados por espaço, sua tarefa é encontrar o próximo número inteiro na sequência. Cada número inteiro na sequência é o resultado da aplicação de uma única operação matemática ( +
, -
, *
ou /
) para o número inteiro anterior, e cada sequência é composta por um número variável de tais operações (mas não mais do que 10). Nenhuma sequência terá mais que a metade do comprimento da sequência de números inteiros; portanto, cada sequência de operações será exibida pelo menos duas vezes para confirmação.
A entrada será via stdin (ou prompt
para soluções JavaScript).
Aqui estão alguns exemplos explicativos.
Entrada:
1 3 5 7 9 11
Resultado:
13
Bastante fácil, este. Todos os valores são anteriores +2
.
Entrada:
1 3 2 4 3 5 4 6 5 7 6
Ouput:
8
Duas etapas nesta sequência, +2
então -1
.
Entrada:
2 6 7 3 9 10 6 18 19 15 45 46
Resultado:
42
Três passos - *3
, +1
, -4
.
Casos de teste
Aqui estão mais alguns casos de teste:
Entrada:
1024 512 256 128 64 32 16
Resultado:
8
Entrada:
1 3 9 8 24 72 71 213 639
Resultado:
638
Entrada:
1 2 3 4 5 2 3 4 5 6 3 4 5 6 7
Resultado:
4
Entrada:
1 2 4 1 3 9 5 8 32 27 28 56 53 55 165 161 164 656 651 652 1304
Resultado:
1301
Eu tenho uma solução Scala não gasta (42 linhas) que postarei em alguns dias.
Este é o código-golfe - a resposta mais curta vence.
Respostas:
Golfscript,
203138 caracteresIsso usa muito mais
if
s do que um programa Golfscript padrão, e sua operação é bastante enigmática, então aqui está uma versão comentada (mas não destruída, exceto pela adição de espaço em branco e comentários):Minha submissão original foi a seguinte, com 88 caracteres:
No entanto, isso tenta calcular as operações a partir da primeira ocorrência de cada uma; portanto, se a operação for multiplicação ou divisão e o argumento na primeira vez que for 0, ele será quebrado.
fonte
Haskell,
276261259257243 caracteresAqui está a minha solução ineficiente. Funciona em números inteiros ilimitados (e delimitados). Esta solução funciona corretamente com a divisão não exata (por exemplo
5 / 2 = 2
:).Como funciona: eu crio todas as sequências possíveis de (possíveis) operações. Depois, testo a sequência de números de entrada para ver se a sequência gerada criará a entrada. Se isso acontecer, retorne o próximo número na sequência. O código sempre retornará uma resposta derivada de uma menor seqüência de operações. Isso acontece porque a lista de sequências de operações é gerada nessa ordem. É arbitrário (mas consistente) decidir entre os laços. Por exemplo, o código retorna
6
ou8
para a sequência2 4
.Ungolfed:
fonte
Control.Monad -> Monad
possível? E como sobreinteract$show.n.q read.words
Python,
333366...315303278269261246 caracteresCria operação com o primeiro par de números e verifica em outros pares. Armazena todas as operações e, se todas tiverem êxito, aplica a operação apropriada no último elemento da lista.
Editado: passa no teste do mal :-) Agora procure por operação em todas as posições.
fonte
0 0 1 2 3 6 7 14
0 0 0 0 1 0 0 0 0 1
não sai0
.lambda x:x+b-a
->(b-a).__add__
. Pena que é apenas um personagem, estou aprendendo muito sobre python fazendo isso.l
implicitamente global economiza muito: pastie.org/2416407Pitão,
309305295279 caracteresLida com todos os casos de teste originais, bem como com o de Peter Taylor
0 0 1 2 3 6 7 14
:Ungolfed, com saída de depuração (muito útil para verificar a correção):
Uso:
fonte
v<1
funciona como um guarda.Ruby 1.9
(437)(521)(447)(477)Funciona para todos os casos de teste, incluindo o "mal". Vou jogar mais tarde.
Edição: Percebi que há outro caso que eu não estava lidando corretamente - quando a continuação precisa usar a operação "mistério". A sequência
2 0 0 -2 -4 -6
estava retornando inicialmente 0 em vez de -12. Eu já consertei isso.EDIT: Corrigimos mais alguns casos extremos e reduzimos o código para 447.
EDIT: Ugh. Tinha que adicionar algum código para lidar com outras seqüências "más", como
0 0 0 6 18 6 12
fonte
Scala
Esta é a solução que eu vim com:
Ungolfed:
fonte
echo "0 0 1 2 3 6 7 14" | scala Sequence
mantém a tela preta.scala Sequence
e, em seguida, insira a sequência e pressione enter.Scala 936
ungolfed:
Falha miseravelmente no de Peter Taylor
h
, mas não vejo a possibilidade de curar o programa em um período de tempo razoável.fonte
-
como um caso especial+
e/
como um caso especial*
? Minha maneira de passar a entrada de Peter Taylor (e similar) era cortar o primeiro número da sequência e tentar novamente. Ainda não tive tempo de ver como o seu programa funciona para saber se isso ajudaria no seu.-1, 0, 0, 1, 2, 3, 6, 7, 14
precisará de uma cura diferente.