Desafio
Dada uma sequência de números, crie uma função que retorne as etapas da sequência.
- Suponha que uma sequência será
N >= 3
- A sequência repetirá as etapas pelo menos uma vez
- Sequência conterá apenas números naturais
- Sua função ou programa deve retornar a menor seqüência possível de etapas
Exemplo:
Entrada: [1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15, 17]
Resultado: [1, 1, 2]
Explicação: A sequência inicial vai de1 => 2 (1 step), 2 => 3 (1 step), 3 => 5 (2 steps)
. Então repete. A saída é então[1 step, 1 step, 2 steps] => [1, 1, 2]
Outro exemplo:
Entrada: [2, 5, 6, 7, 8, 11, 12, 13, 14, 17, 18, 19, 20]
Resultado: [3, 1, 1, 1]
[2, 5, 6, 7, 8, 11, 12, 13, 14, 17, 18, 19, 20]
\ /\ /\ /\ /
3 1 1 1 Then it repeats...
Casos de teste
Input: [1, 4, 8, 9, 10, 13, 17, 18, 19, 22, 26, 27, 28] => Output: [3,4,1,1]
Input: [6, 11, 13, 18, 20, 25, 27, 32, 34, 39, 41] => Output: [5,2]
Input: [2, 6, 10, 13, 17, 21, 25, 28, 32, 36, 40, 43, 47] => Output: [4,4,3,4]
Input: [5, 6, 7] => Output: [1]
Esclarecimentos
- O comprimento de entrada - 1 é divisível pelo comprimento de saída
- Suponha que a sequência sempre aumentará
Isso é código-golfe , então a resposta mais curta em bytes vence.
fonte
Respostas:
Geléia ,
97 bytesExperimente online!
Como funciona
fonte
JavaScript (ES6), 58 bytes
Gera uma sequência separada por vírgula (com uma vírgula inicial).
Experimente online!
Ou 56 bytes, se usarmos
,-
como separador e assumirmos que a sequência é sempre estritamente aumentando .Quão?
Primeiro convertemos a matriz de entrada a [] em uma lista de diferenças consecutivas com:
Como p é inicialmente definido como um valor não numérico (a função de retorno de chamada de map () ), a primeira iteração gera NaN .
Exemplo:
Coagimos então o resultado a uma string:
Finalmente, procuramos o menor padrão 1 de números inteiros separados por vírgula (
,\d+
) começando logo após "NaN" e repetindo até o final da string:1: usando o não ganancioso
*?
fonte
/(,.+?)\1*$/
.Braquilog , 11 bytes
Experimente online!
Seriam 5 bytes se houvesse um interno para diferenças consecutivas.
Explicação
fonte
Pitão, 11 bytes
Experimente aqui
Explicação
fonte
Japonês ,
1412 bytesTente
Explicação
Original
Tente
fonte
R ,
4946 bytesPrograma completo:
Experimente online!
R ,
725854 bytesEnvio da função original com todos os casos de teste em um só lugar:
Experimente online!
Agradecemos a JayCe por sugerir a rota completa do programa e -4 bytes na função, e a Giuseppe por mais -3.
fonte
a<-
aqui tambémJ ,
2219 bytes3 bytes salvos graças ao FrownyFrog!
Experimente online!
[Experimente online!] [TIO-ji2uiwla]
Quão?
fonte
/:
vez de#\
, poderá0{"1[:~.
salvar 1 byte."0 1
é #"{
05AB1E , 8 bytes
Economizou 3 bytes graças a Kevin Cruijssen .
Experimente online!
05AB1E , 11 bytes
Experimente online!
13 bytes
Uma alternativa atraente, IMO:
Experimente online!
fonte
.œ
.Javascript, 49
56bytesEditar 7 bytes salvos, obrigado (adivinhe quem?)
Mesma ideia de regex que Arnauld, mas curiosamente tão diferente na implementação ...
Retornando uma sequência com etapas separadas por vírgula (e uma vírgula inicial)
Teste
fonte
match
foi uma péssima decisão minha. Você pode me superar um pouco mais . :-) #MATL ,
141312 bytesExperimente online!
Acabei de descobrir que o MATL tem uma função circulante!
Explicação
d
- Obtenha as diferenças entre termos sucessivos, como uma matrizt5YL
- duplique isso e chame a funçãoYL
('galeria') com5
('circulante'). Cria uma matriz com o vetor fornecido como primeira linha e, em seguida, as linhas sucessivas são movidas circularmente até o mesmo vetor, até que se envolva.FTF#Xu
- Verifique se há linhas exclusivas e obtenha seus números de linha (não tenho certeza se há uma maneira mais curta de fazer isso). Quando as etapas da sequência se repetem, a linha deslocada circularmente é a mesma que a primeira linha e as linhas subseqüentes serão repetidas. Portanto, isso obtém os índices da primeira execução das etapas da sequência antes que eles comecem a repetir.)
- indexe usando isso na matriz de diferenças original, para obter a resposta.Mais velho:
Experimente online!
(-1 byte graças a Giuseppe)
Explicação:
fonte
Python 2 , 101 bytes
Experimente online!
Primeiro gera os deltas d , depois encontra o primeiro prefixo p de d que, quando repetido ⌊len (L) / len (p) ⌋ vezes, produz L , onde L é a lista de entrada.
fonte
Ruby , 62 bytes
Baseia-se na lógica Regex adaptada da resposta de Arnauld .
Experimente online!
Determinação alternativa de diferenças de etapas, também 62 bytes:
Experimente online!
fonte
Java 10,
104100 bytesRegex
( ?.+?)\1*$
para menor repetindo substring de @Neil 'comentário s sobre @Arnauld ' JavaScript resposta s (ES6) .Experimente online.
Explicação:
fonte
APL + WIN, 39 bytes
Solicitar entrada.
Experimente online! Cortesia de Dyalog Classic
Explicação:
fonte
Python 2 ,
8685 bytesExperimente online!
Construa as diferenças como
d
; sed
repete com o tamanho da unidaden
entãod[n:]==d[:-n]
; mais recurse.fonte
Retina 0.8.2 , 42 bytes
Experimente online! O link inclui casos de teste. A saída inclui vírgula inicial. Explicação:
Converta para unário.
Calcule as diferenças para a frente, exceto o primeiro número, que é deixado para trás.
Corresponder às diferenças repetidas.
Converta para decimal.
fonte
05AB1E ,
1413 bytesExperimente online ou verifique todos os casos de teste .
Eu sei que já existem duas respostas 05AB1E mais curtas postadas por @ Mr.Xcoder , mas eu queria tentar essa abordagem alternativa usando rotação e verificação de igualdade.
Pode ser capaz de jogar alguns bytes sem cair
Á
.-1 byte após uma dica de @Emigna para remover os registros global_variable (
©
e 2x®
) e usar um Duplicate (D
) e um Triplicate (Ð
).Explicação:
fonte
Haskell, 107 bytes
x é a matriz de entrada.
fonte
f x=
. Além disso, o uso deinits
exigeimport Data.List
, pois não faz parte do Prelude: Experimente online!(init x)
pode serx
porquezip
trunca automaticamente se uma das listas for maior que a outra. E paramap(uncurry(-))$zip
existe uma build-in:zipWith(-)
. Em vez def x=let i=...in
você pode usar um guarda padrão:f x|i<-...=
.filter
, em!!0
vez dehead
e emcycle
vez deconcat$repeat
: Experimente online!Stax ,
86 bytesExecute e depure
Aqui está uma versão anotada descompactada para mostrar como funciona.
Execute este
fonte
Perl 6 , 57 bytes
Teste-o
A saída é separada por espaço (
"1 1 2"
)Expandido:
fonte
~(.skip Z-$_)
05AB1E , 9 bytes
Explicação:
Alternativa de 9 bytes:
O mesmo, mas em vez de comparar com a lista de deltas (que precisa ser salva / restaurada), isso usa
.¥
(undelta) e compara com a entrada (implícita).Experimente online!
fonte
K4 , 30 bytes
Solução:
Exemplos:
Explicação:
Parece pesado para o que estamos tentando resolver. Obtenha os deltas da entrada e, em seguida, construa sequências e determine a menor que corresponda a ela.
fonte
Wolfram Language (Mathematica) , 26 bytes
Experimente online!
Retorna um
Sequence
contendo as etapas.+2 bytes para
List
saída:Experimente online!
fonte
Perl 5
-p
, 55 bytesExperimente online!
Os números são inseridos como uma lista separada por espaços. Saída é o mesmo formato.
fonte