Del artículo de Wikipedia :
La ubicación aritmética (Latin arithmeticæ localis) es el sistema de numeración binario aditivo (no posicional), que John Napier exploró como una técnica de cálculo en su tratado Rabdology (1617), tanto simbólicamente como en una cuadrícula similar a un tablero de ajedrez.
¿Qué?
Los números de ubicación son una forma de escribir números usando letras del alfabeto.
La notación binaria aún no se había estandarizado, por lo que Napier usó lo que llamó números de ubicación para representar números binarios. El sistema de Napier utiliza la notación de signo y valor para representar números; utiliza letras sucesivas del alfabeto inglés para representar potencias sucesivas de dos: a = 2 ^ 0 = 1, b = 2 ^ 1 = 2, c = 2 ^ 2 = 4, d = 2 ^ 3 = 8, e = 2 ^ 4 = 16 y así sucesivamente.
Un ejemplo
ab
= 1 + 2 = 3 en base 10
aabb
= 1 + 1 + 2 + 2 = 6 en base 10
Tenga en cuenta que aabb
puede acortarse bc
reemplazando 2 instancias de una letra por una superior.
Adición
Simplemente concatena los dos números y simplifica.
acd
+ bde
= acdbde
= abcdde
= acebe
= abcf
= 39
en base 10
Sustracción
Simplemente elimine todos los dígitos que aparecen igualmente en ambas partes de la resta. Puede ser necesario expandir (convertir b
a aa
)
abde
- ad
= be
= 18 en base 10
Multiplicación
Esto es un poco más difícil.
Digamos que queremos multiplicar acd
(13) por def
(56). Primero arreglas acd
verticalmente:
a
c
d
Luego agrega def
después del primero a
:
a def
c
d
Ahora, c es 2 posiciones más tarde en el alfabeto que a, así que agregamos 2 posiciones en el alfabeto def
para hacer fgh
. Eso se agrega a la segunda fila.
a def
c fgh
d
Por último, d es 1 posición más tarde en el alfabeto que c, por lo que agregamos 1 posición en el alfabeto fgh
para hacer ghi
. Eso se agrega a la tercera fila.
a def
c fgh
d ghi
Luego tomas la suma de la derecha: def
+ fgh
+ ghi
= deffgghhi
= deggghhi
= deghhhi
= deghii
=deghj
(728)
Otro ejemplo de multiplicación.
Entrada:
bc * de
Primero:
b
c
Luego
b ef
c
Luego
b ef
c fg
Tenga en cuenta que escribimos ef
en la primera línea. Esto se debe a que bc
comienza con b
y b
es la segunda letra del alfabeto, por lo que debemos cambiar de
1 letra para que se convierta ef
.
Luego
ef+fg
Salida:
eh
División
Esto no es parte de este desafío, porque puede volverse muy complejo.
Tu verdadero desafío
Su programa o función debe tomar la entrada como una cadena que se ve así:
a + b
Y debes dar salida:
ab
Por supuesto, el programa o función debe ser compatible con los números de longitud arbitraria (hasta el límite de la cadena o de entrada de la lengua) con cualquiera de los operadores +
, -
o*
. Algunos ejemplos más:
Entrada:
ab + bd
Salida:
acd
Entrada:
d - ab
Salida:
ac
Entrada:
ab * cd
Salida:
cf
Notas:
- El orden de las letras en la salida no importa, pero siempre se puede suponer que el orden de las letras en los números en la entrada será ascendente (a antes de z).
- Puede tomar la entrada con una nueva línea final y la salida con una nueva línea final.
- Es posible que no tomar la entrada como una lista de
ab
,*
ybd
paraab * bd
. - Se usa el alfabeto inglés (
abcdefghijklmnopqrstuvwxyz
) - Su salida debe ser simplificada (
aa
no está permitido,b
es obligatorio) - La entrada se simplificará (
b
+c
, noaa
+bb
oaa
+aaaa
) - Es posible que necesite un espacio antes y el operador (
+
,-
o*
), o tal vez necesite que haya ninguna. - Solo habrá un operador por entrada.
- Puede suponer que la salida y la entrada nunca superarán 2 ^ 27-1 (
abcdefghijklmnopqrstuvwxyz
) - Este es el código de golf , por lo que gana la respuesta más corta en bytes.
fuente
d is 2 positions later in the alphabet than c
es este wright? no debería ser1
?That is added to the second row.
en la misma oración, ¿no debería ser asíthird
?bc*de==efgh
pero no loefgh
es240
144
bc*de
debería sereh
Respuestas:
Jalea ,
2625 bytesUtiliza los operadores de Jelly (en
×
lugar de*
y en_
lugar de-
) en la cadena de entrada según lo permitido por el OP .(Requiere espacios alrededor de los operadores)
Pruébalo en línea! o ver el conjunto de pruebas
¿Cómo?
fuente
Mathematica, 168 bytes
Mi solución inicial (antes de que se editara la publicación para aclarar que la salida debe simplificarse) fue
64
bytes más cortos:Esto simplemente modificó esa solución para que funcione. Probablemente sea más corto usar los métodos descritos en el desafío, pero de todos modos quería poner esto en práctica.
Explicación:
Reemplaza cada secuencia de letras con su entero correspondiente por aritmética de código de caracteres, luego convierte la cadena resultante en una expresión (que se simplificará automáticamente a un entero), luego produce una cadena de
a
caracteres de longitud igual a ese entero y finalmente reemplaza idéntico adyacente caracteres con el siguiente código de caracteres hasta llegar a un punto fijo.fuente
JavaScript (ES6),
136134133 bytesGuardado 1 byte gracias a Luke
Casos de prueba
Mostrar fragmento de código
fuente
Perl 5 , 95 bytes
94 bytes de código +
-p
bandera.Pruébalo en línea!
Tres pasos aquí:
-
s/\w/a x 2**(-97+ord$&)/ge;
convierte la entrada en una cadena dea
solamente.-
s/(.*)-\1|+//;/*/&&($_=$`x length$')
ejecutará el operador (que son muy simples en cadenas dea
):+
es la concatenación,-
significa eliminar de la primera parte tantasa
como haya en la segunda parte, y*
significa duplicar la primera parte tantas veces como hayaa
en la segunda parte.-
1while s/(.)\1/chr 1+ord$1/e
dobla las mismas letras consecutivas en la siguiente letra del alfabeto.fuente
05AB1E , 29 bytes
Pruébalo en línea! o como un conjunto de pruebas
Explicación
fuente
C y x86 asm, 340 bytes
Compilar con -O0
Explicación
Como C no tiene
eval()
, usé una tabla de instrucciones x86 en su lugar. Tuve que elegir instrucciones que fueran todas de la misma longitud (o rellenadas con nops), y que esperaran src y el destino de los mismos tipos. De particular molestia fue que MUL solo puede escribir en registros, y los códigos de operación de 1 byte MUL solo pueden escribir en EAX. Además, no parecía haber ninguna instrucción SUB de escritura de registros que se restara de la memoria, en lugar de lo contrario, de ahí el XCHG.editar
Como se preguntó en los comentarios, una aproximación más tradicional se vería así:
En realidad es un poco más corto, con 301 caracteres, por algunas razones: 1. Debido a que debe haber muchas funciones, la sobrecarga de cada una se puede cortar con algunas reglas de preprocesador. 2. Linux moderno protege de la ejecución en la pila, por lo que la llamada mprotect () para deshabilitar esto sacrificó 34 bytes. 3. La llamada XCHG es muy subóptima y cuesta otros 30 bytes. Si no fuera por esas cosas, el combo x86 ganaría unos 10-20 bytes.
También cortó 2 bytes de ambos mejorando la llamada islower () en g.
fuente
GNU sed + coreutils, 329 bytes
Sí, no tengo idea de lo que me pasó, pero al menos sé que las secuencias de comandos de sed ahora son un poco mejores. Tenga en cuenta que esta solución requiere la
e
extensión de GNU sed , que ejecuta un comando de shell.Supongo que no habrá espacios alrededor de los operadores. Desde mi terminal:
Y, para aquellos más cuerdos que yo: ¡la versión comentada!
fuente
sed: file golf.sed line 24: ":" lacks a label
PHP, 168
Salida ascendente con el uso de eval
PHP, 185 bytes
Salida ascendente
Versión en línea
Expandido
PHP, 201 bytes
Salida descendente
Versión en línea
Expandido
fuente
Python 3 ,
176167 bytesPruébalo en línea!
fuente
m>=2**(t+1)
conm>=2**t*2
, y cinco bytes reemplazándolosa=a.split();m=eval(i(a[0])+a[1]+i(a[2]))
con algo asíb,c,d=a.split();m=eval(i(b)+c+i(d))
.2**(ord(i)-97)
con1<<ord(i)-97
.PHP, 130
versión expandida:
corre con
php -R <code>
.fuente
AWK, 201 bytes
"(awk '$0="a s"'<<<1)"|getline v
es la mejor manera de que pudiera llegar a hacer unaevaluate
enAWK
. Puedo estar "engañando" un poco para llamar a esto soloAWK
, ya que estoy ejecutando un comando, pero al menos el comando también esAWK
:)Estoy seguro de que me falta alguna forma de reducir el conteo de bytes, pero estoy seguro de que no puedo verlo.
El uso es bastante estándar, por ejemplo, ingrese el código
FILE
y haga:Tenga en cuenta que no se requieren espacios y cualquier carácter no operativo / no [az] se ignorará en silencio. Podría extenderse para trabajar con números mayores que "abcdefghijklmnopqrstuvwxyz" cambiando el ciclo. Para hacer la división, simplemente agregue el
/
carácter a la cadena de operación :). Además, imprimirá una línea en blanco si elresult <= 0
.fuente