Muitas linguagens de programação fornecem operadores para manipular os dígitos binários (base 2) dos números inteiros. Aqui está uma maneira de generalizar esses operadores para outras bases:
Deixe que x e y ser números de um dígito em base de B . Definir o operador unário ~
e operadores binários &
, |
e ^
de tal forma que:
- Matemática5 pontos
- x & y = min (x, y)
- x y = max (x, y)
- x ^ y = (x e ~ y) | (y & x)
Observe que, se B = 2, obtemos os familiares operadores NOT, AND, OR e XOR, bit a bit.
Para B = 10, obtemos a tabela "decimal XOR":
^ │ 0 1 2 3 4 5 6 7 8 9
──┼────────────────────
0 │ 0 1 2 3 4 5 6 7 8 9
1 │ 1 1 2 3 4 5 6 7 8 8
2 │ 2 2 2 3 4 5 6 7 7 7
3 │ 3 3 3 3 4 5 6 6 6 6
4 │ 4 4 4 4 4 5 5 5 5 5
5 │ 5 5 5 5 5 4 4 4 4 4
6 │ 6 6 6 6 5 4 3 3 3 3
7 │ 7 7 7 6 5 4 3 2 2 2
8 │ 8 8 7 6 5 4 3 2 1 1
9 │ 9 8 7 6 5 4 3 2 1 0
Para números de vários dígitos, aplique o operador de um dígito, dígito por dígito. Por exemplo, 12345 ^ 24680 = 24655, porque:
- 1 ^ 2 = 2
- 2 ^ 4 = 4
- 3 ^ 6 = 6
- 4 ^ 8 = 5
- 5 ^ 0 = 5
Se os operandos tiverem comprimentos diferentes, preencha o menor com zeros à esquerda.
O desafio
Escreva, no menor número de bytes possível, um programa ou função que tome como entrada dois números inteiros (que podem ser assumidos entre 0 e 999 999 999, inclusive) e emita o "XOR decimal" dos dois números, conforme definido acima.
Casos de teste
- 12345, 24680 → 24655
- 12345, 6789 → 16654
- 2019, 5779 → 5770
- 0, 999999999 → 999999999
- 0, 0 → 0
09
um resultado aceitável para uma entrada de90, 99
?A^B^B=A
a^b=b^a
ea^b^b=a
para bases com um divisor primo ímparRespostas:
Gelatina , 14 bytes
Experimente online!
Grade de todos os pares de um dígito
Um link monádico usando uma lista de dois números inteiros como argumento e retornando um número inteiro.
Explicação
Se uma matriz de dígitos é aceitável de entrada / saída:
Gelatina , 12 bytes
Experimente online!
fonte
Pitão , 31 bytes
Experimente online!
fonte
Python 2 , 71 bytes
Experimente online!
fonte
Quarto (gforth) , 111 bytes
Experimente online!
Código Explicação
fonte
C # (compilador interativo do Visual C #) , 75 bytes
Guardado 6 bytes graças a @someone
Experimente online!
fonte
Zip
, você não pode usá-lo como ele automaticamente trunca o mais coleção para o comprimento do mais curtoPHP ,
111109 bytesExperimente online!
Testes: Experimente online!
Se chamarmos os dígitos que queremos XOR,
$a
e$b
, eu achei que:$a
é menor que 5,XOR = min(9-$a, max($a, $b))
$a
é igual ou superior a 5,XOR = min($a, max(9-$a, 9-$b))
Então eu implementei essa lógica mais um hack para lidar com números de diferentes comprimentos. Tomo cada forma dígito final de ambos os números de entrada (com índices negativos gosto
input[-1]
,input[-2]
, ...) e calcular o XOR e colocar o resultado na ordem inversa em uma cadeia a ser impresso no final. Como eu recebo dígitos do final dos números, os resultados do XOR devem ser reunidos em ordem inversa. Quando uma das entradas é maior que a outra, o índice negativo na entrada mais curta resulta em uma sequência vazia que é igual a 0.fonte
Retina ,
8559 bytesExperimente online! Recebe a entrada como linhas separadas, mas o link é para testar o conjunto que reformata a entrada separada por vírgula. Explicação:
Almofada esquerda com zeros ambas as linhas no mesmo comprimento.
Classifique cada dígito pelo índice da coluna e exclua a nova linha. Isso tem o efeito de emparelhar os dígitos da mesma maneira que uma transposição faria.
Aplique separadamente a cada par de dígitos, juntando os resultados.
Duplique o par.
Inverta o segundo dígito do primeiro par e o primeiro dígito do segundo, para que agora tenhamos
x ~y
uma linha e~x y
a outra.Classifique os dígitos de cada linha em ordem, para que o primeiro dígito seja agora
x & ~y
ou~x & y
conforme apropriado.Classificação inversa das linhas.
E extraia o primeiro dígito, que é o resultado desejado.
fonte