Escreva um programa para determinar se uma sequência periódica de números inteiros positivos tem a propriedade de que, para cada número inteiro que n
ocorre na sequência, nunca há mais do quen
outros números inteiros entre duas ocorrências consecutivas de n
.
Por exemplo, 2, 3, 5, 2, 3, 6, 2, 3, 5, 2, 3, 6, ...
possui esta propriedade: todo par de ocorrências consecutivas de 2
no máximo dois números inteiros entre eles (como 2, 3, 5, 2
e 2, 3, 6, 2
; todo par de ocorrências consecutivas de 3
no máximo três números inteiros entre eles; e o mesmo para5
e 6
.
No entanto, 2, 3, 5, 2, 3, 4, 2, 3, 5, 2, 3, 4, ...
não possui essa propriedade: duas ocorrências consecutivas de 4
, a saber4, 2, 3, 5, 2, 3, 4
, possuem mais de quatro números inteiros entre elas.
Entrada : uma representação razoável de uma sequência periódica de números inteiros positivos. Por exemplo, uma lista finita como {2, 3, 5, 2, 3, 6}
pode representar a primeira sequência infinita2, 3, 5, 2, 3, 6, 2, 3, 5, 2, 3, 6, ...
acima. (Nesse caso, o problema pode ser indicado para listas finitas que são agrupadas em vez de para listas periódicas infinitas.)
Saída : um valor de verdade / falsidade.
Exemplos de verdade:
{1}
{8, 9}
{2, 3, 4}
{5, 5, 3, 3, 6}
{2, 3, 5, 2, 3, 6}
{6, 7, 3, 5, 3, 7}
{9, 4, 6, 7, 4, 5}
{1, 1, 1, 1, 1, 100, 1}
{1, 9, 1, 8, 1, 7, 1, 11}
Exemplos de falsidade:
{1, 2, 3}
{2, 3, 9, 5}
{3, 5, 4, 4, 6}
{2, 3, 5, 2, 3, 4}
{3, 5, 7, 5, 9, 3, 7}
{5, 6, 7, 8, 9, 10, 11}
{1, 9, 1, 8, 1, 6, 1, 11}
Isso é codegolf , então o código mais curto vence. Respostas em todas as línguas são encorajadas.
fonte
Respostas:
Haskell,
605756.55 bytesSupõe que a lista de entrada contenha pelo menos um elemento.
Exemplo de uso:
g [1]
->True
. Experimente online!Seja
a
o chefe da lista eb
a cauda. O resultado éTrue
seb
está vazio ou o número de elementos no iníciob
que não são iguais aa
não é maior quea
e a chamada recursiva def b
também éTrue
, caso contrárioFalse
. Comece com o dobro da lista de entrada.Edit: @Leo salvou 3 bytes. Obrigado!
Editar 2: @Laikoni salvou 1 byte. Obrigado!
fonte
span
é mais curto que usartakeWhile
, então eu não olhei para isso.takeWhile
sempre pode ser reduzido parafst$span
oufst.span
, o que economiza outro byte.Python ,
5756 bytes-1 byte graças a Dennis (substitua
i+1:i+v+2
comi:i-~v
com umi
deslocamento de 1 a partir deenumerate
)Experimente online!
Sem nome função tendo uma lista,
a
e testando a condição de que cada valor,v
, aparecein
a fatia relevantes para o seu direito em uma concatenação dea
com ele próprio,(a+a)[i:i-~v]
, onde o índice com base em um dev
ema
,i
, é fornecido peloenumerate(a,1)
.fonte
JavaScript (ES6),
67 65 55 54 5149 bytesSalvo 3B graças a @ETHproductions e 2B graças a @Arnauld
Explicação
Isso define uma função que recebe uma matriz
a
como entrada. Então o.some
método itera sobre essa matriz, executando outra função para cada elemento.Essa função interna recebe dois argumentos
b
ec
, o valor atual e seu índice. A função localiza o índice do valor atual, iniciando no índicec + 1
. Em seguida, verifica se esse índice é maior que o valor atual mais o índice atual (a diferença entre duas ocorrências do mesmo valor é maior queb
). Observe que isso retorna exatamente o oposto do que queremos.Se um desses valores de retorno for
true
, a.some
função retornarátrue
também. Se nenhuma das verificações retornartrue
, a.some
função retornaráfalse
. Mais uma vez, o oposto do valor que queremos retornar, portanto esse resultado é negado e depois retornado.Teste-o
Experimente todos os casos de teste aqui:
fonte
.shift()
para economizar na fatia:a=>!a.some(b=>z.indexOf(z.shift())>b,z=a.concat(a))
a=>!a.some((n,i)=>a.concat(a).indexOf(n,++i)>n+i)
?Gelatina , 11 bytes
Experimente online!
Como funciona
fonte
Gelatina , 8 bytes
Insipred pela resposta Python de @ JonathanAllan .
Experimente online!
Como funciona
fonte
SWI-Prolog, 83 bytes
A lista deve ser inserida duas vezes:
Se isso não for considerado aceitável, você pode adicionar o predicado
que adiciona 14 bytes extras.
Experimente online
Nota: você pode testar diferentes casos falsos ao mesmo tempo, separando suas consultas com ';' (ou) e teste para diferentes casos verdadeiros, separando com ',' (e)
ou seja, usando os exemplos de OP:
e
fonte
PHP, 52 bytes
toma sequência dos argumentos da linha de comando; sai com código
1
para falsidade,0
para verdade.Corra com
-nr
.$n
através argumentos:, não faça nada; saia com o código
1
$$n
( variáveis variáveis )0
(implícito)fonte
Retina , 50 bytes
Insira como uma lista de números unários separados por vírgula.
Experimente online!
Explicação
Duplique a entrada para que possamos verificar as etapas que envolvem o final.
Combine e retorne cada seção (mais curta) entre dois valores idênticos, por exemplo
11,111,1,11
.Remova repetidamente um dígito do primeiro número, juntamente com um número inteiro depois dele. Se a diferença for pequena o suficiente, isso removerá completamente o primeiro número. Caso contrário, pelo menos um dígito permanecerá.
Conte quantas vezes
1,
aparece em todas as linhas. Se aparecer em algum lugar, uma das etapas era muito ampla.Tente combinar um número começando com
0
(ou seja, apenas0
ele próprio). Esta é efetivamente uma negação lógica da saída.fonte
JavaScript (ES6), 47 bytes
Como funciona
Reutilizamos a matriz de entrada
a
para armazenar a posição da última ocorrência encontrada de cada número inteiro ema
. Usamos a tecla-n
para armazenar esta posição, para que não interfira nos índices originais dea
.Quando
a[-n]
existe, o teste real ocorre. Quandoa[-n]
não existe, a expressãoa[-n] - (a[-n] = i)
é igualundefined - i == NaN
e a comparação com~n
é sempre falsa, que é o resultado esperado.Casos de teste
Mostrar snippet de código
fonte
Retina ,
4139 bytes2 bytes de golfe graças a Martin Ender, que por sinal me apresentou a grupos de equilíbrio com seu fantástico guia sobre SO
Entrada é uma lista separada por vírgula de números unários. A saída é
0
para false e1
true.Experimente online!(Conjunto de testes que converte automaticamente de decimal)
Recentemente, aprendi sobre o equilíbrio de grupos, então queria experimentá-los. Eles não estão entre as ferramentas mais fáceis de usar, mas com certeza são poderosos.
Explicação
Como muitos outros envios, duplicamos a lista para lidar com o agrupamento. Também adicionamos uma vírgula no final, para que cada número seja seguido por uma vírgula (isso facilita as coisas um pouco mais tarde)
Aqui é onde as coisas ficam interessantes. Esta é uma etapa de substituição. Substituímos tudo o que corresponde à primeira linha pela segunda. Nesse caso, procuramos remover todos os números
n
não seguidos porn+1
outros números diferentes.Para fazer isso, primeiro correspondemos ao número, capturando cada
1
um em um grupo (capturando o número do grupo 2 nesse caso). Então, com uma aparência positiva, para ter uma afirmação de largura zero, tentamos repetidamente corresponder em um grupo de equilíbrio-2
, que terá sucesso não mais do que o número de capturas feitas pelo grupo2
, um número seguido por uma vírgula. Após essa sequência de números, ficaremos satisfeitos se alcançarmos o primeiro número novamente ou o final da linha.Nota: esta expressão pode corresponder apenas à parte final de um número, se não conseguir encontrar uma correspondência com o número completo. Isso não é um problema, porque a primeira parte do número permanecerá na sequência e saberemos que a substituição não foi completamente bem-sucedida.
Finalmente, o resultado deve ser verdadeiro se removermos completamente todos os números da lista. Tentamos combinar a sequência vazia e retornar o número de correspondências encontradas.
fonte
\b
. Removê-lo causará correspondências dispersas, mas elas não conseguirão remover o número inteiro, portanto, você não acabará com uma sequência vazia.Gelatina , 11 bytes
Experimente online!
fonte
Python 3 , 101 bytes
Experimente online!
fonte
Röda , 50 bytes
Experimente online!
Finalmente! Eu estava esperando por esse desafio ...
É uma função que retorna um valor verdadeiro ou falso. É preciso um argumento, a matriz.
Ele itera sobre um fluxo de índices e verifica para cada índice
_1
que a distância do índice atual e do próximo índicea[_1]
não é maior quea[_1]
.fonte
_1
funciona?_
, mas se refere ao primeiro valor obtido. Se eu tivesse usado vários_
s, cada um teria puxado um valor separado. Por exemplo,[1, 2, 3] | print(_, _, _)
imprime123
, mas[1,2,3] | print(_, _1, _1)
imprime111 222 333
(em linhas separadas).05AB1E , 13 bytes
Experimente online! ou como um conjunto de testes
Explicação
fonte