A aritmética de localização (Latin arithmeticæ localis) é o sistema numérico binário aditivo (não-posicional), que John Napier explorou como técnica de computação em seu tratado Rabdology (1617), tanto simbolicamente quanto em uma grade semelhante a um tabuleiro de xadrez.
O que?
Os números de localização são uma maneira de escrever números usando as letras do alfabeto.
A notação binária ainda não havia sido padronizada, portanto Napier usou o que chamou de numerais de localização para representar números binários. O sistema de Napier usa notação de valor de sinal para representar números; usa letras sucessivas do alfabeto inglês para representar potências sucessivas de dois: a = 2 ^ 0 = 1, b = 2 ^ 1 = 2, c = 2 ^ 2 = 4, d = 2 ^ 3 = 8, e = 2 ^ 4 = 16 e assim por diante.
Um exemplo
ab
= 1 + 2 = 3 na base 10
aabb
= 1 + 1 + 2 + 2 = 6 na base 10
Observe que isso aabb
pode ser reduzido bc
, substituindo as duas instâncias de uma carta por uma mais alta.
Adição
Você apenas concatena os dois números e simplifica.
acd
+ bde
= acdbde
= abcdde
= acebe
= abcf
= 39
na base 10
Subtração
Apenas remova todos os dígitos que aparecem igualmente nas duas partes da subtração. Pode ser necessário expandir (converter b
para aa
)
abde
- ad
= be
= 18 na base 10
Multiplicação
Isso é um pouco mais difícil.
Digamos que queremos multiplicar acd
(13) por def
(56). Primeiro você organiza acd
verticalmente:
a
c
d
Então você adiciona def
após o primeiro a
:
a def
c
d
Agora, c é 2 posições mais tarde no alfabeto que a, então adicionamos 2 posições no alfabeto def
para fazer fgh
. Isso é adicionado à segunda linha.
a def
c fgh
d
Por fim, d é 1 posição mais tarde no alfabeto que c, portanto, adicionamos 1 posição no alfabeto a fgh
ser criada ghi
. Isso é adicionado à terceira linha.
a def
c fgh
d ghi
Então você toma a soma do direito: def
+ fgh
+ ghi
= deffgghhi
= deggghhi
= deghhhi
= deghii
= = deghj
(728)
Outro exemplo de multiplicação
Entrada:
bc * de
Primeiro:
b
c
Então
b ef
c
Então
b ef
c fg
Observe que anotamos ef
na primeira linha. Isso ocorre porque bc
começa com b
e b
é a segunda letra do alfabeto, então precisamos mudar de
uma letra para que ela se torne ef
.
Então
ef+fg
Saída:
eh
Divisão
Isso não faz parte desse desafio, porque pode ficar muito complexo.
Seu verdadeiro desafio
Seu programa ou função deve receber a entrada como uma string parecida com esta:
a + b
E você deve produzir:
ab
Naturalmente, o seu programa ou função deve suportar números de comprimento arbitrário (até a corda ou a entrada limite do seu idioma) com qualquer um dos operadores +
, -
ou *
. Mais alguns exemplos:
Entrada:
ab + bd
Saída:
acd
Entrada:
d - ab
Saída:
ac
Entrada:
ab * cd
Saída:
cf
Notas:
- A ordem das letras na saída não importa, mas você sempre pode assumir que a ordem das letras nos números da entrada será crescente (a antes de z).
- Você pode receber entradas com uma nova linha à direita e produzir com uma nova linha à direita.
- Você pode não ter a entrada como uma lista de
ab
,*
ebd
paraab * bd
. - O alfabeto inglês é usado (
abcdefghijklmnopqrstuvwxyz
) - Sua saída deve ser simplificada (
aa
não é permitido,b
é necessário) - A entrada será simplificada (
b
+c
, nãoaa
+bb
ouaa
+aaaa
) - Você pode exigir um espaço antes e o operador (
+
,-
ou*
), ou você pode exigir que haja nenhum. - Haverá apenas um operador por entrada.
- Você pode assumir que a saída e a entrada nunca ultrapassarão 2 ^ 27-1 (
abcdefghijklmnopqrstuvwxyz
) - Isso é código-golfe , então a resposta mais curta em bytes vence!
bc*de==efgh
mas efgh
é 240
não144
bc*de
deve sereh
d is 2 positions later in the alphabet than c
isso é certo? não deveria ser1
?That is added to the second row.
na mesma frase, não deveriathird
?