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 aabbpode 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= 39na 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 bpara 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 acdverticalmente:
a
c
d
Então você adiciona defapó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 defpara 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 fghser 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 efna primeira linha. Isso ocorre porque bccomeça com be bé a segunda letra do alfabeto, então precisamos mudar deuma 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,*ebdparaab * bd. - O alfabeto inglês é usado (
abcdefghijklmnopqrstuvwxyz) - Sua saída deve ser simplificada (
aanão é permitido,bé necessário) - A entrada será simplificada (
b+c, nãoaa+bbouaa+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==efghmas efghé 240não144
bc*dedeve sereh
d is 2 positions later in the alphabet than cisso é certo? não deveria ser1?That is added to the second row.na mesma frase, não deveriathird?