visão global
Alguns de vocês podem conhecer a Sequência Kolakoski ( A000002 ), uma sequência autorreferencial bem conhecida que possui a seguinte propriedade:
É uma sequência que contém apenas 1 e 2 e, para cada grupo de 1 e dois, se você somar o comprimento das execuções, ele será igual a apenas metade do comprimento. Em outras palavras, a sequência de Kolakoski descreve a duração das execuções na própria sequência. É a única sequência que faz isso, exceto a mesma sequência com o 1 inicial excluído. (Isso só é verdade se você se limitar a sequências compostas de 1s e 2s - Martin Ender)
O desafio
O desafio é, dada uma lista de números inteiros:
- Saída
-1
se a lista NÃO for um prefixo funcional da sequência Kolakoski. - Envie o número de iterações antes que a sequência se torne
[2]
.
O exemplo elaborado
Usando a imagem fornecida como exemplo:
[1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1] # Iteration 0 (the input).
[1,2,2,1,1,2,1,2,2,1,2] # Iteration 1.
[1,2,2,1,1,2,1,1] # Iteration 2.
[1,2,2,1,2] # Iteration 3.
[1,2,1,1] # Iteration 4.
[1,1,2] # Iteration 5.
[2,1] # Iteration 6.
[1,1] # Iteration 7.
[2] # Iteration 8.
Portanto, o número resultante é 8
para uma entrada de [1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1]
.
9
também é bom se você estiver indexando 1.
O Conjunto de Testes (Você também pode testar com sub-iterações)
------------------------------------------+---------
Truthy Scenarios | Output
------------------------------------------+---------
[1,1] | 1 or 2
[1,2,2,1,1,2,1,2,2,1] | 6 or 7
[1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1] | 8 or 9
[1,2] | 2 or 3
------------------------------------------+---------
Falsy Scenarios | Output
------------------------------------------+---------
[4,2,-2,1,0,3928,102904] | -1 or a unique falsy output.
[1,1,1] | -1
[2,2,1,1,2,1,2] (Results in [2,3] @ i3) | -1 (Trickiest example)
[] | -1
[1] | -1
Se você está confuso:
Truthy: Chegará a dois sem que nenhum passo intermediário possua outros elementos além de 1
e 2
. -Einkorn Enchanter 20 hours ago
Falsy: O valor final não é [2]
. Os termos intermediários contêm algo diferente do conjunto [1,2]
. Algumas outras coisas, veja exemplos.
Este é o código-golfe , o menor número de bytes será o vencedor.
-1
?[2]
até que eu vi o[2,2,1,1,2,1,2]
caso de teste.1
e2
.[1]
como caso de teste.Respostas:
Haskell ,
12687797675 bytes39 bytes salvos graças a Ørjan Johansen
Experimente online!
Este erros na entrada incorreta.
fonte
f
(e consequentemente!
) pode ser muito reduzido usando produção lenta +span
/ emlength
vez de acumuladores. Experimente online![1]
import Data.List;f l=length<$>group l
. (<$>
é um sinônimo paramap
aqui.) Além disso, em vez de ter dois-1
casos diferentes , é mais curto usar um@(_:_:_)
padrão para forçar o caso principal a corresponder apenas a comprimento> = 2 listas. Experimente online!05AB1E , 22 bytes
Experimente online!
Explicação
fonte
[1,1,2,2,1,2,1,1,2,2,1,2,2,1,1,2,1,1]
SCALA, 290 (282?) Caracteres, 290 (282?) Bytes
Levei muito tempo ... Mas finalmente terminei!
com este código:
Não sei se devo contar os
var u=t
bytes, considerando que não usot
durante o algoritmo (a cópia é apenas para obter um modificável, emvar
vez do parâmetrot
considerado comoval
- obrigado ScaLa ). Por favor, diga-me se devo contar.Difícil o suficiente. Experimente online!
PS: Eu estava pensando em fazê-lo recursivamente, mas terei que passar um contador como parâmetro da verdadeira "subfunção" recursiva; esse fato me faz declarar duas funções, e esses caracteres / bytes nada mais são do que perdidos.
EDIT: Eu tive que mudar (?) Porque não temos certeza se devemos levar em conta
[1]
. Então, aqui está o código modificado:Não é otimizado (eu tenho um duplicado "out" para as mesmas condições: quando chego
[2]
e quando param[2]
é tratado separadamente).NOVO CUSTO = 342 (não modifiquei o título de propósito)
fonte
[1]
[2]
"[1]
nunca alcança[2]
e deve retornar -1 .JavaScript,
146142 bytesPrimeira tentativa no código de golfe, parece que o "retorno" na função maior é bastante tedioso ...
Além disso, a verificação de b = 1 eb = 2 ocupa alguns bytes ...
Aqui está o código:
Explicação
Dados de teste (usando os dados de teste fornecidos)
Edit 1: 146 -> 142: Revogando minha edição na redução de bytes, porque isso afeta a saída; e algumas edições na última declaração
fonte
f=a=>{for(i=t=!a[0];a[1];)r=[],c=j=0,a.map(a=>{t|=a-1&&a-2;a-c&&(0<j&&r.push(j),c=a,j=0);j++}),(a=r).push(j),i++;return t||a[0]-2?-1:0^i}
salva 5 bytes (para loop em vez de while; vírgulas vs chaves; && vs if). Você pode usar o compilador fechamento do google ( closure-compiler.appspot.com ) para obter estas otimizações feitas para vocêGelatina ,
2625222120 bytesExperimente online!
Na verdade, esse código não estava funcionando corretamente até 20 bytes e eu nem percebi; estava falhando no
[2,2]
caso de teste. Deve funcionar perfeitamente agora.fonte
JavaScript (ES6),
1271269580 bytesIndexado a 0. Joga
"ReferenceError: X is not defined"
e"InternalError: too much recursion"
com entrada ruim.Casos de teste
Mostrar snippet de código
fonte
Clojure, 110 bytes
Um básico
loop
com uma pré-verificação em casos extremos. Retornanil
para entradas inválidas. Eu não sabia(= [2] '(2))
étrue
: ofonte
Python 2, 146 bytes (somente função)
Retorna 0 na entrada falsa (ok, pois é indexada em 1). Simplesmente use-o assim:
fonte
Mathematica, 82 bytes
Function
que substitui repetidamente{2}
pelo símbolo indefinidoT
, uma lista de (um ou mais)1
s e2
a próxima iteração e qualquer outra coisa0
até que um ponto fixo seja alcançado, em seguida, retornaFirstPosition
o símboloT
noFixedPointList
menos resultante1
. A saída é{n}
onden
está o1
número ( indexado) de iterações necessárias para alcançar{2}
o caso-1+Missing["NotFound"]
de verdade e o caso de falsidade.Se a saída tiver que ser em
n
vez de{n}
, custa mais três bytes:fonte
Python 2 ,
184 163156 bytesPython 2 , 156 bytes
Experimente online!
Explicação:
fonte
Geléia , 17 bytes
Experimente online!
fonte
Python 2 , 122 bytes
Experimente online!
Python 3 , 120 bytes
Experimente online!
Explicação
Uma nova sequência (w) é inicializada para armazenar a próxima iteração da redução. Um contador (c) é inicializado para acompanhar o número de iterações.
Cada item nas seqüências originais é comparado ao valor anterior. Se forem iguais, o valor do último item de (w) será aumentado com 1. Se forem diferentes, a sequência (w) será estendida com [1].
Se w == [2], o contador (c) é retornado. Senão, se a (s) sequência (s) original (ais) contiverem outros itens além de 1 e 2, um valor -1 será retornado. Caso contrário, a função é chamada recursivamente com a nova sequência (w) como (s) e o contador (c) aumentado em 1.
fonte
def f(s,c=2,j=0,w=[1]):
, mas isso gera um resultado diferente. Alguém poderia explicar por que isso é?R, 122 bytes
Passa em todos os casos de teste. Lança um ou mais erros caso contrário. Eu odeio verificações de validade; esse código poderia ter sido tão útil se as entradas fossem boas; seria mais curto, mesmo que a entrada fosse uma sequência de 1 e 2, não necessariamente um prefixo da sequência de Kolakoski. Aqui, temos que verificar o vetor inicial (caso contrário, o caso de teste
[-2,1]
) teria passado) e o vetor resultante (caso contrário[1,1,1]
, teria passado).fonte
Ruby ,
8177 bytesExperimente online!
Editar: salvou 4 bytes convertendo para lambda recursiva.
Retorna o número indexado de 1 de iterações ou 0 como falsey.
Utiliza o método chunk do enumerável Ruby, que faz exatamente o que precisamos: agrupando execuções consecutivas de números idênticos. Os comprimentos das execuções constituem a matriz para a próxima iteração. Mantém a iteração enquanto a matriz tem mais de 1 elemento e nenhum número diferente de 1 e 2 foi encontrado.
fonte
Pitão , 45 bytes
Experimente online!
Provavelmente ainda é possível jogar golfe. É definitivamente jogável se
.?
funcionou da maneira que eu esperava que fosse (sendo umaelse
para a estrutura mais interna, em vez da mais externa)fonte
Perl 5
-p
, 71 bytesExperimente online!
1
-indexed. Saídas0
por falsidade.fonte