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!
fonte
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
?bc*de==efgh
masefgh
é240
não144
bc*de
deve sereh
Respostas:
Geléia ,
2625 bytesUsa os operadores do Jelly (em
×
vez de*
e em_
vez de-
) na string de entrada, conforme permitido pelo OP .(Requer espaços ao redor dos operadores)
Experimente online! ou veja a suíte de testes
Quão?
fonte
Mathematica, 168 bytes
Minha solução inicial (antes da edição da postagem para esclarecer que a saída deve ser simplificada) foi
64
bytes mais curtos:Isso apenas modificou essa solução para funcionar. Provavelmente é mais curto para realmente usar os métodos descritos no desafio, mas eu queria colocar isso de qualquer maneira.
Explicação:
Substitui cada sequência de letras pelo número inteiro correspondente pelo código de caracteres aritmético, depois converte a sequência resultante em uma expressão (que simplifica automaticamente para um número inteiro), produz uma sequência de
a
caracteres de comprimento igual a esse número inteiro e, finalmente, substitui os caracteres idênticos adjacentes. caracteres com o próximo caractere codificam até que um ponto fixo seja alcançado.fonte
JavaScript (ES6),
136134133 bytesGuardado 1 byte graças a Luke
Casos de teste
Mostrar snippet de código
fonte
Perl 5 , 95 bytes
94 bytes de código +
-p
sinalizador.Experimente online!
Três etapas aqui:
-
s/\w/a x 2**(-97+ord$&)/ge;
converte a entrada em uma sequência dea
apenas.-
s/(.*)-\1|+//;/*/&&($_=$`x length$')
executará o operador (que é muito simples em cadeias dea
):+
é a concatenação,-
significa remover da primeira parte quantasa
houver na segunda parte e*
duplicar a primeira parte quantas vezes houvera
na segunda parte.-
1while s/(.)\1/chr 1+ord$1/e
dobra as mesmas letras consecutivas na próxima letra do alfabeto.fonte
05AB1E , 29 bytes
Experimente online! ou como um conjunto de testes
Explicação
fonte
C & x86 asm, 340 bytes
Compilar com -O0
Explicação
Desde C não tem
eval()
, usei uma tabela de instruções x86 em seu lugar. Eu tive que escolher instruções com o mesmo comprimento (ou preenchidas com nops) e quais esperavam src e destino dos mesmos tipos. Um incômodo particular foi o fato de o MUL apenas gravar nos registros, e os opcodes MUL de 1 byte podem gravar no EAX. Além disso, parecia não haver nenhuma instrução SUB de gravação de registro que subtraísse da memória, e não o contrário, daí o XCHG.editar
Como foi solicitado nos comentários, uma abordagem mais tradicional seria assim:
Na verdade, é um pouco mais curto, com 301 caracteres, por alguns motivos: 1. Como é preciso haver muitas funções, a sobrecarga de cada uma pode ser cortada com algumas regras do pré-processador. 2. O linux moderno protege da execução na pilha; portanto, o mprotect () chama para desativar esses 34 bytes sacrificados. 3. A chamada XCHG é muito subótima, custando outros 30 bytes. Se não fosse por essas coisas, o combo x86 venceria em cerca de 10 a 20 bytes.
Também cortou 2 bytes de ambos melhorando a chamada islower () em g.
fonte
GNU sed + coreutils, 329 bytes
Sim, eu não tenho ideia do que aconteceu comigo, mas pelo menos eu sei que os scripts estão um pouco melhores agora. Observe que esta solução requer a
e
extensão do GNU sed , que executa um comando shell.Presumo que não haverá espaços ao redor dos operadores. Do meu terminal:
E, para aqueles mais sãos do que eu: a versão comentada!
fonte
sed: file golf.sed line 24: ":" lacks a label
PHP, 168
Saída Crescente com o uso de eval
PHP, 185 bytes
Saída Crescente
Versão Online
Expandido
PHP, 201 bytes
Saída Decrescente
Versão Online
Expandido
fonte
Python 3 ,
176167 bytesExperimente online!
fonte
m>=2**(t+1)
porm>=2**t*2
e cinco bytes substituindoa=a.split();m=eval(i(a[0])+a[1]+i(a[2]))
por algo parecidob,c,d=a.split();m=eval(i(b)+c+i(d))
.2**(ord(i)-97)
por1<<ord(i)-97
.PHP, 130
versão expandida:
correr com
php -R <code>
.fonte
AWK, 201 bytes
"(awk '$0="a s"'<<<1)"|getline v
é a melhor maneira que eu poderia chegar a fazer umevaluate
noAWK
. Eu posso estar "trapaceando" um pouco para chamar isso apenasAWK
, já que estou executando um comando, mas pelo menos o comando também éAWK
:)Tenho certeza de que estou perdendo uma maneira de reduzir a contagem de bytes, mas com certeza não consigo vê-lo.
O uso é bastante padrão, por exemplo, insira o código
FILE
e faça:Observe que os espaços não são necessários e qualquer caractere não op / não [az] será ignorado silenciosamente. Pode ser estendido para trabalhar com números maiores que "abcdefghijklmnopqrstuvwxyz", alterando o loop. Para fazer a divisão, basta adicionar o
/
caractere à operação string :). Além disso, imprimirá uma linha em branco se oresult <= 0
.fonte