Dada uma sequência aritmética finita de números inteiros positivos, com alguns termos removidos do meio, reconstrua a sequência inteira.
A tarefa
Considere uma sequência aritmética: uma lista de números inteiros positivos na qual a diferença entre dois elementos sucessivos é a mesma.
2 5 8 11 14 17
Agora, suponha que um ou mais números inteiros sejam removidos da sequência, sujeitos às seguintes restrições:
- Os números inteiros removidos serão termos consecutivos da sequência.
- O primeiro e o último número inteiro na sequência não serão removidos.
- Pelo menos três números inteiros permanecerão na sequência.
Para a sequência acima, as possíveis remoções incluem:
2 5 8 14 17 (removed 11)
2 5 17 (removed 8 11 14)
2 14 17 (removed 5 8 11)
Sua tarefa: Dada uma dessas seqüências parciais, reconstrua a sequência completa original.
Detalhes
Você pode assumir que a entrada é válida (tem uma solução) e está faltando pelo menos um termo. Todos os números na sequência serão números inteiros positivos (> 0). A sequência pode ter uma diferença positiva ou negativa entre os termos (ou seja, pode estar aumentando ou diminuindo). Não será uma sequência constante (por exemplo 5 5 5
).
Sua solução pode ser um programa completo ou uma função . Qualquer um dos métodos padrão de entrada e saída é aceitável.
Sua entrada e saída podem ser uma string (com qualquer delimitador razoável), uma lista de strings ou uma lista de números. Você pode representar os números em qualquer base que seja conveniente para o seu idioma.
Mencione quaisquer métodos / formatos incomuns de E / S em seu envio, para que outros possam testar seu código mais facilmente.
Casos de teste
In: 2 5 8 14 17
Out: 2 5 8 11 14 17
In: 2 5 17
Out: 2 5 8 11 14 17
In: 2 14 17
Out: 2 5 8 11 14 17
In: 21 9 6 3
Out: 21 18 15 12 9 6 3
In: 10 9 5
Out: 10 9 8 7 6 5
In: 1 10 91 100
Out: 1 10 19 28 37 46 55 64 73 82 91 100
Isso é código-golfe ; a resposta mais curta em cada idioma vence.
fonte
2 5 ... 17
Respostas:
Haskell , 63 bytes
Experimente online!
Basicamente, funciona tentando criar o resultado pela frente e, se isso falhar, por trás. Isso usa o fato de que o primeiro e o último membro da entrada sempre estarão corretos, o fato de que os membros excluídos precisam ser consecutivos e o fato de que sempre haverá pelo menos três itens na entrada. Tudo o que tenho a fazer é supor que o segundo ou penúltimo membro seja preciso e verifique se funciona. Felizmente, Haskell tem uma sintaxe realmente bonita para criar séries aritméticas.
EDIT: obrigado a @xnor por apontar um erro e fornecer uma solução!
fonte
[1,3,4,5]
dá[1,3,5]
.all(`elem`s)c
deveria corrigi-lo com a mesma contagem de bytes.05AB1E ,
98 bytesExperimente online!
Explicação
Salvo 1 byte usando, em
gcd of deltas
vez demin delta
, inspirado pelo usuário202729fonte
Brachylog v2, 9 bytes
Experimente online!
Este é um envio de função. O intérprete Brachylog pode ser feito para avaliar uma função como se fosse um programa completo, fornecendo-a
Z
como um argumento de linha de comando; neste caso, a entrada é especificada no formato, por exemplo,[1, 2, 4]
e a saída é retornada em um formato semelhante, por exemploZ = [1, 2, 3, 4]
. (Obviamente, para o envio de uma função, a entrada e a saída não estão em nenhum formato; são apenas listas.)Na verdade, isso resolve um problema mais difícil do que o solicitado pelo OP: elabora a menor sequência aritmética de números inteiros que contém os valores especificados na ordem especificada, independentemente de as exclusões serem consecutivas ou não. Por usar força bruta, pode ser muito lento se muitos valores forem excluídos.
Explicação
O programa tem três partes principais.
⊆
encontra uma superssequência da entrada (isto é, uma sequência que possui a entrada como uma subsequência). Quando há mais de uma saída possível de um programa Brachylog, a saída escolhida é a primeira saída em ordem de desempate, e a ordem de desempate é determinada pelo primeiro comando do programa que possui uma opinião; neste caso,⊆
especifica uma ordem que favorece saídas curtas em vez de longas. Portanto, a saída que obteremos será a menor superseqüência da entrada que obedecer às restrições no restante do programa..
…∧
É usado para gerar o valor que vê como entrada (isto é, a superssequência neste caso), mas também afirmar que uma condição específica se mantém nele. Em outras palavras, estamos produzindo a menor superseqüência que obedece a uma condição específica (e ignorando os resultados intermediários usados para ver se ela obedece à condição).Finalmente, temos
s₂ᵇ-ᵐ
=
, ou seja, "todos os deltas da sequência são iguais", a condição que estamos aplicando à saída. (O valor de retorno disso é uma lista de deltas, em vez da própria superseqüência, e é por isso que precisamos de.
…∧
para garantir que a coisa certa seja exibida.)O Brachylog é retido aqui por não ter nenhum built-in que possa lidar com o cálculo de deltas, aplicando uma operação a pares sobrepostos de uma lista ou algo semelhante. Em vez disso, precisamos dizer o que queremos dizer explicitamente:
s₂ᵇ
encontra todos os (ᵇ
) substrings (s
) de comprimento 2 (₂
) (ᵇ
é necessário o uso de para manter um vínculo entre incógnitas nos substrings e na superseqüência; o mais comumente usadoᶠ
quebraria isso ligação). Em seguida,-ᵐ
faz uma subtração em cada um desses pares para produzir um delta. É irritante ter que escrever cinco bytess₂ᵇ-ᵐ
para algo que a maioria das linguagens de golfe modernas tem, mas é dessa maneira que o codegolf às vezes é, eu acho.fonte
Python 2,
104978983716760 bytesAgradecimentos a Chas Brown por economizar 4 bytes.
Agradecimentos a ovs por economizar 7 bytes.
Insira a lista por argumentos.
Experimente online!
Explicação:
Como os removidos são consecutivos, basta verificar as diferenças entre dois pares de elementos consecutivos.
fonte
b if b%c else c
por[c,b][b%c>0]
.key=abs
! Parece que, aqui em diante, as pessoas frequentemente omitem af=
peça, a menos que uma função recursiva seja usada; para que você possa economizar 2 bytes dessa maneira.a[-1]-a[-2]
pora[2]-a[1]
- a lógica é a mesma e você recebe outros 2 bytes.Pitão , 11 bytes
Experimente aqui!
Agradecimentos a Steven H. por salvar um byte!
Pitão , 12 bytes
Experimente aqui!
Como funciona
fonte
Q
para que você possa classificar e dar o primeiro elemento em vez deabs(GCD(Q))
, como no%hS.+SQ}hQe
de 11 bytes. Suíte de testeGeléia , 8 bytes
Experimente online!
Notas:
Trabalhe apenas em uma versão antiga do Jelly. ( este commit, por exemplo) (onde
g
usefractions.gcd
, que tem o resultado, assina o mesmo que o sinal de entrada, em vez demath.gcd
, que sempre retorna valor positivo).O link TIO acima é o link Python 3 TIO, o código Python consiste no código-fonte Jelly da confirmação mencionada acima, com exceção de tudo (3 arquivos) compactados no mesmo arquivo (para execução do TIO) e
dictionary.py
foi reduzido para apenas algumas linhas. No entanto,dictionary.py
não está relacionado a esta resposta, pois não usa string compactada. (a“...»
construção)Explicação:
Primeiro, como um segmento contínuo é excluído e pelo menos três elementos permanecem, há dois números consecutivos na lista antiga e os deltas serão todos múltiplos da etapa. Portanto, a lista
gcd
das diferenças (I
, incrementos) será o valor absoluto da etapa.Felizmente o documento
gcd
está assinado (veja a nota acima)Então o programa faz:
Um número inteiro crescente do
Ṃ
mínimo aoṀ
aximal.Modular, escolha todos os enésimos elementos.
Combinação de
$
cadeia monádica ( ) combinadaI
(incrementos, diferenças) eg/
(redução degcd
elementos da lista). Se os incrementos forem positivos,gcd
será positivo e a lista de retorno será da esquerda para a direita (crescente) e vice-versa.fonte
gcd
vez demin
nos fez amarrar. Pena que eu obter um gcd com sinal, caso contrário eu estaria no 7;)MATL , 13 bytes
Experimente online!
Explicação:
fonte
JavaScript (ES6),
9290Editar 2 bytes salvos thx Arnauld
Fácil, pois basta verificar as diferenças entre os dois primeiros e os dois últimos. Mas ainda incrivelmente longo.
Menos golfe
Teste
fonte
a-=d=e*e>d*d?d:e
deve funcionar e salvar 2 bytes.Wolfram Language (Mathematica) , 50 bytes
Experimente online!
fonte
{##}
eLast@{##}
, mas o melhor que eu poderia conseguir com que foi de 51 bytes.Ruby ,
65 62 5554 bytesExperimente online!
-1 byte graças a Justin Mariner
fonte
h
e deixando-o coma,*,b,c
. Experimente online!Haskell ,
7369 bytesExperimente online!
fonte
J ,
49, 4746 bytesInspirado pela solução da Emigna.
Como funciona:
Experimente online!
fonte
Casca , 9 bytes
Experimente online!
Muito obrigado a H.PWiz por reduzir pela metade a contagem de bytes, apontando que a aplicação
…
em uma lista a varia!fonte
F⌋
ser substituído por▼
?gcd
foi lidar com deltas negativos #C # (.NET Core) ,
167 + 13 = 180145 + 13 = 158 bytesExperimente online!
+13 para
using System;
Surpreendentemente, esse desafio teve mais nuances do que eu previ inicialmente.
Agradecimentos
-22 bytes salvos devido a algumas simplificações puras do @DLosc.
DeGolfed
fonte
Python 2 , 147 bytes
Experimente online!
fonte
Python 2 , 78 bytes
Experimente online!
fonte
Geléia , 8 bytes
Experimente online!
fonte
dc , 64 bytes
Experimente online!
fonte
Japonês , 12 bytes
Tente
Explicação
Gere uma matriz de números inteiros (
õ
) do último elemento da matriz de entrada (Ì
) para o primeiro (Ug
). Calcule a etapa entre os elementos, obtendo todos os dois pares de elementos da entrada e reduzindo-os pela diferença absoluta (Uäa
), classificando (ñ
) essa matriz e obtendo o primeiro elemento (g
).fonte