O desafio
Dados 3 números X
, Y
e Z
na base B
, encontre um número B
no qual a adição X
e o Y
rendimento Z
. As entradas x = 20
, Y = 12
e Z = 32
poderia originar 5
porque 20 + 12 = 32
em 5 de base.
- Você pode supor que sempre haverá uma base na qual a adição está correta (há casos em que não existe uma base, graças a @ MasonWheeler e @ Não a Charles, por alguns exemplos disso).
- A base mais baixa possível é 1. Você pode usar 1s ou 0s como dígitos em unário, mas não pode misturá-los.
I / O
- Os dígitos dos números de entrada serão números inteiros não negativos.
- Você pode supor que os números de entrada contenham zeros à esquerda, de modo que tenham um comprimento específico (ou igual).
- Você pode pegar os números no formato mais conveniente, desde que não seja pré-processado. Isso inclui o formato geral dos três números de entrada e o formato dos dígitos de cada um desses números. Por favor, deixe claro qual formato você usa.
- Se houver várias bases possíveis, você poderá produzir todas ou apenas uma delas.
- Você pode assumir que os números base e de entrada estarão dentro dos limites numéricos do seu idioma.
Regras
- Função ou programa completo permitido.
- Regras padrão para entrada / saída.
- Aplicam-se brechas padrão .
- Isso é código-golfe , portanto, a menor contagem de bytes vence. O desempate é uma submissão anterior.
Casos de teste
O formato de entrada aqui é uma lista de números inteiros para representar cada número. As três listas são separadas por vírgulas.
Observe que às vezes existem várias bases possíveis. Somente uma solução (aleatória) é produzida aqui.
[12, 103], [4, 101], [16, 204] -> 349 [4, 21, 25], [5, 1, 20], [9, 23, 17] -> 28 [16, 11], [25, 94], [41, 105] -> 147 [2, 140], [21, 183], [24, 100] -> 223 [8, 157], [1, 28], [9, 185] -> 227 [2, 158], [88], [3, 12] -> 234 [8, 199], [1, 34], [9, 233] -> 408 [3, 247], [7, 438], [11, 221] -> 464 [3, 122], [3, 2], [6, 124] -> 480 [6, 328], [3, 31], [9, 359] -> 465 [2, 1, 0, 0, 0, 0], [1, 2, 0, 0, 1, 0, 1, 0], [1, 2, 2, 1, 1, 0, 1, 0] - > 3 [16, 105], [16, 120], [33, 84] -> 141 [15, 60], [9, 30], [24, 90] -> 268 [2, 0], [1, 2], [3, 2] -> 5 [1, 3, 3, 7], [1, 2, 3], [1, 4, 6, 0] -> 10 [0], [1, 12, 8], [1, 12, 8] -> 16 [1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1], [1, 0, 0, 1, 0, 1, 1, 1, 0, 0 , 1], [1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0] -> 2 [1], [1], [1,1] -> 1
Você pode gerar casos de teste adicionais com este programa Pyth . Insira uma base na primeira linha e os valores decimais para X
e Y
nas duas linhas a seguir.
Além disso, você pode usar este programa Pyth para criar vários casos de teste de uma vez usando valores aleatórios. Basta digitar a quantidade desejada de casos de teste na entrada.
Feliz codificação!
Respostas:
Geléia,
16117 bytesEssa abordagem é fortemente baseada na resposta Octave do @ beaker .
O formato de entrada é Z, Y, X , com ordem de dígitos little-endian, usando o dígito 0 para unário.
Experimente online! ou execute todos os casos de teste .
Como funciona
Em vez de testar incrementalmente bases possíveis, isto resolve o polinómio que corresponde à matriz P: = X + Y - Z . Isso retorna o maior coeficiente de P ≠ 0 - que deve ser uma raiz, já que existe pelo menos uma base válida - ou o dígito mais alto de X , Y e Z , incrementado por 1 .
fonte
Pitão, 13 bytes
Espera Z, seguido por X e Y.
Suíte de teste
Essencialmente, testamos todas as bases possíveis, começando com mais um que o maior dígito. O teste é que convertemos cada número na base em questão, dobramos a subtração sobre os números e negamos logicamente o resultado.
fonte
Oitava,
67753832 bytesPorque "repetir TODAS as coisas" é muito trabalho.
Requer 0 preenchimento para tornar as matrizes de entrada do mesmo tamanho, por exemplo:
Como
0
é usado para preenchimento,1
é usado como token para unário.(Agradecemos a @DenkerAffe pelo esclarecimento na pergunta.)
Amostra executada em ideone .
Breve explicação:
Tome um caso que não envolva transporte:
Nesse caso, não há restrições na base, desde que seja maior que qualquer "dígito". Simplesmente pegue o elemento max de
z
(asz >= x,y
) e adicione 1 (ou qualquer número inteiro positivo).No caso de uma entrega (sem entrega), excedemos a base em uma das colunas e a diferença entre
x+y
ez
é a base:Se a soma da segunda coluna também exceder a base, exigindo uma execução, bem como a entrada, seu valor seria
base+(-1)
. Teremos uma coluna em algum lugar à direita com uma transferência e nenhuma transferência que possua o valor base (maior) correto.fonte
Haskell,
9073 bytesExemplo de uso:
f [[3, 247],[7, 438],[11, 221]]
->464
.Simplesmente tente todas as bases
b
(ondeb
é maior que o máximo dos dígitos). Escolha o primeiro ondex+y==z
.Edit: @xnor salvou muitos bytes, principalmente se livrando do
import Data.Digits
.fonte
unDigits b
faz o que penso, deve ser mais curto para implementar comofoldl(\x y->b*x+y)0
ou equivalentefoldl((+).(b*))0
.maximum
após achatamento:b<-[1+(maximum$id=<<l)..]
.maximum
comob<-[1..],all(<b)$id=<<l
.d
de umb
número base0 <= d < b
, então, para a base1
o único dígito possível é0
?f [[0],[0],[0,0]]
avalia como1
.MATL , 20 bytes
A entrada está no formato (observe as chaves externas):
Isso funciona na versão atual (15.0.0) .
Experimente online!
Explicação
fonte
MATL,
1312 bytesTradução do meu resposta Octave para o MATL. (Minha primeira resposta MATL!)
Z, X, Y
(ou,Z, Y, X
se preferir, eu sou fácil)Experimente online!
Explicação
fonte