Isso foi inspirado por um problema de matemática que vi em algum lugar na internet, mas não me lembro onde (UPDATE: O problema original foi encontrado no subreddit de enigmas matemáticos com uma prova, desde que seja possível, veja também este post do Math SE ), solicitando uma prova se o seguinte processo é possível para qualquer par arbitrário de números inteiros (pelo que me lembro, era possível para qualquer par):
Dado um par de números inteiros, j e k, dobre um deles e adicione um ao outro, resultando em um par de novos números inteiros, ou seja, (j, k) -> (j + 1, k * 2) ou (j * 2, k + 1). Em seguida, repita esse processo com esses números inteiros, com o objetivo de ter o par de números inteiros igual.
Estes exemplos fornecidos não são necessariamente ótimos, mas mostram como esse processo pode ser feito em números inteiros, positivos, negativos ou zero:
(2, 5) -> (3, 10) -> (6, 11) -> (12, 12)
(5, 6) -> (6, 12) -> (7, 24) -> (14, 25) -> (28, 26) -> (56, 27) -> (112, 28) -> (113, 56) -> (226, 57) -> (227, 114) -> (228, 228)
(0, 2) -> (1, 4) -> (2, 5) -> (3, 10) -> (6, 11) -> (12, 12)
(-4, 0) -> (-3, 0) -> (-2, 0) -> (-1, 0) -> (0, 0)
(3, -1) -> (6, 0) -> (12, 1) -> (13, 2) -> (14, 4) -> (15, 8) -> (16, 16)
(-4, -3) -> (-8, -2) -> (-16, -1) -> (-32, 0) -> (-31, 0) -> ... -> (0, 0)
Desafio
Crie um programa que, com dois números inteiros, produza a lista de etapas necessárias para tornar esses inteiros iguais incrementando repetidamente um e dobrando o outro
Especificações
- A solução não precisa ser ideal, mas deve resolver em um número finito de etapas para qualquer par arbitrário
A entrada deve ter dois números inteiros
Saída pode ser qualquer saída razoável que denota claramente os números inteiros resultantes de cada etapa, por exemplo:
- uma string com dois delimitadores distintos (qualquer símbolo, espaço em branco etc.), um para cada número inteiro em um par e um para cada par
- por exemplo, entrada j, k: 2, 5 -> saída: 3,10; 6,11; 12,12
- uma lista de listas de números inteiros
- por exemplo, entrada j, k: 2, 5 -> saída: [[3, 10], [6, 11], [12, 12]]
- uma string com dois delimitadores distintos (qualquer símbolo, espaço em branco etc.), um para cada número inteiro em um par e um para cada par
Se a entrada for um par de números iguais, você poderá produzir qualquer coisa, desde que seja consistente com outras respostas não triviais
- por exemplo
- se a entrada [2, 5] tiver saída [[3, 10], [6, 11], [12, 12]], que não inclui o par de entrada, a entrada [4, 4] não deve produzir nada.
- se a entrada [2, 5] tiver saída [[2, 5], [3, 10], [6, 11], [12, 12]], que inclui o par de entrada, a entrada [4, 4] deve saída [[4, 4]].
- por exemplo
Os métodos de IO padrão se aplicam e as brechas padrão são proibidas
Este é o código de golfe, então a resposta mais curta em bytes ganha
fonte
[(12,12),(6,11),(3,10),(2,5)]
para entrada(2,5)
?Respostas:
JavaScript (ES6),
1119083 bytesExperimente online!
Comentado
fonte
Haskell,
7069 bytesExperimente online!
Um simples BFS. Mantém o controle das etapas em uma lista de lista de pares.
fonte
Python 3 ,
907472 bytes-2 bytes graças a Dennis .
Experimente online!
Recebe entrada como uma lista de singleton .
Ungolfed
fonte
Pitão, 41 bytes
Experimente aqui
Explicação
Essa é a primeira pesquisa bastante direta. Mantenha uma fila de possíveis sequências (
J
) e, até obtermos um par correspondente, faça a próxima sequência, prenda cada um dos movimentos possíveis e coloque-os no final da fila.Por uma questão de brevidade, definimos uma função
y
(usando a expressão lambdaL
) para executar um dos movimentos e aplicá-la para frente e para trás.fonte
Gelatina , 20 bytes
Experimente online!
fonte
[[2,5]]
)05AB1E ,
252220 bytesPega uma lista duplamente aninhada como entrada e gera uma lista irregular com cada etapa em uma profundidade de aninhamento.
Experimente online!
Explicação
fonte
Retina , 72 bytes
Experimente online! Apenas dois casos de teste devido às limitações da aritmética unária. Explicação:
Converta para unário.
Enquanto a entrada não contém um par de números idênticos ...
... corresponde ao último par de cada linha ...
... e transforme a linha em duas linhas, uma com o sufixo do primeiro número incrementado e a segunda dobrada, a outra com o primeiro número dobrado e o segundo incrementado.
Mantenha a linha com o par correspondente.
Converta de volta para decimal.
89versão aritmética decimal não assinada de 88 bytes (funciona também com 0):Experimente online!
fonte
MATL , 24 bytes
O tempo de execução é aleatório, mas é finito com probabilidade 1.
O código é muito ineficiente. As entradas que exigem mais de 4 ou 5 etapas têm uma grande probabilidade de tempo limite no intérprete online.
Experimente online!
Explicação
fonte
Stax ,
2926 bytesExecute e depure
É uma amplia primeira pesquisa. Parece razoavelmente rápido.
É necessário um par de números inteiros envolto em uma matriz. A saída é uma lista de valores separados por espaço. A cada dois valores representa um par no caminho para a solução.
fonte
Haskell , 95 bytes
Experimente online! Saídas na ordem inversa, por exemplo,
h(2,5)
rendimentos[(12,12),(6,11),(3,10),(2,5)]
.fonte
Vermelho , 142 bytes
Toma a entrada como um bloco duplamente aninhado do par de números inteiros no formato de Red
(2, 5)
->2x5
Retorna o resultado como uma lista de pares vermelhos , por exemplo
2x5 3x10 6x11 12x12
. Inclui o par inicial.Experimente online!
Entrada estrita:
A entrada é dois números, por exemplo
2 5
Vermelho , 214 bytes
Experimente online!
Explicação:
fonte