Todos lo hemos hecho, bueno, tal vez no, pero crear tu propio lenguaje alienígena y sistema de numeración es un elemento básico de la escritura especialmente fantástica, pero es principalmente una actividad divertida.
La tarea es simple, tome dos entradas:
Una entrada de lista ordenada de 10 [diez] 'números' únicos (cualquier carácter ASCII imprimible) e interpretarlos, en orden, como los valores 0, 1, 2, 3, ..., 9
+ Hay excepciones a lo que puede ser un número aquí. Los operadores aritméticos (+, -, *, /), paréntesis y espacios no se pueden usar como uno de los números.
Un problema aritmético usando solo esos 'números'
Y genera el resultado entero equivalente en la forma dada.
Aquí hay un ejemplo:
INPUT
abcdefghij
bcd + efg + hij
OUTPUT
bdgi
En el ejemplo, la lista de entrada (puede elegir en qué forma se incluye la lista) de 'abcdefghij' corresponde a '0123456789' así como 'hjkloiwdfp' también correspondería 1 a 1 con '0123456789' donde en lugar de 'a' se asocia con cero, 'h' hace. La siguiente aritmética 'se traduce' a 123 + 456 + 789, lo que equivale a 1368. Esto se debe generar en la forma que le dimos, entonces b (que representa 1) d (para 2) g (para 6) e i (para 8)
CASOS DE PRUEBA
abcdefghij
abc + def - ghij
-gedc
qwertyuiop
qwerty / uiop
e
%y83l;[=9|
(83l * 9) + 8%
y9|8
MÁS REGLAS
- ¡Las lagunas estándar están prohibidas!
- Este es el código de golf, por lo que gana las respuestas más cortas en bytes.
- Debe ser un programa completo o una función que tome las entradas y salidas en cualquier formato que funcione mejor para usted. (Simplemente no puede agregar información adicional en las entradas, solo 'números' y la expresión.
- Use el idioma que desee (siempre que cumpla con otras reglas)
fuente
q.ioiopewioyetqorw...
. Si es así, ¿qué tipo de redondeo se debe aplicar?1
para5/3
, no2
, debido a la división de enteros (no redondeo). Esto no invalida el desafío, pero es posible que deba permitir diferentes respuestas aceptables para el mismo caso de prueba (consulte mi respuesta T-SQL a continuación).Respuestas:
05AB1E ,
109 bytes(Ahora) sale como una lista de caracteres.
Pruébalo en línea o verifique todos los casos de prueba .
Explicación:
La nueva versión de 05AB1E es build is build en Elixir . los
.E
función llamarácall_unary(fn x -> {result, _} = Code.eval_string(to_string(x)); result end, a)
, donde elCode.eval_string
es un Elixir incorporado .Tenga en cuenta que la versión heredada de 05AB1E no funcionará para esto, porque está construida en Python. Los números con ceros a la izquierda no se evaluarán:
vea todos los casos de prueba en la versión heredada (que usa la versión de 10 bytes porque la versión
Åв
incorporada es nueva).fuente
R , 58 bytes
Pruébalo en línea!
Utiliza la traducción de caracteres
chartr
para intercambiar los dígitos,parse
syeval
s la expresión, y luegochartr
vuelve a los dígitos originales.Si se requiere redondear al entero más cercano, esto es
R , 65 bytes
Pruébalo en línea!
fuente
[
un nombre más corto para una función con 3 parámetros es muy inteligente. Bien hecho.T-SQL, 117 bytes
Los saltos de línea son solo para legibilidad.
La entrada se realiza a través de una tabla t existente con columnas de texto c (caracteres) y e (ecuación), según nuestras reglas IO .
Utiliza la función SQL 2017
TRANSLATE
para cambiar entre caracteres y generar una cadena que contiene no solo la ecuación, sino también el código para traducir de nuevo a los caracteres originales:Esta cadena se evalúa utilizando
EXEC()
.Puede haber algunos caracteres (como una comilla simple)
'
) que rompan este código; No he probado todos los posibles caracteres ASCII.Según el desafío, estoy evaluando la expresión como se da, sujeta a cómo mi lenguaje interpreta esos operadores. Como tal, el segundo caso de prueba devuelve 1 (
w
), y no 2 (e
), debido a la división de enteros.fuente
Perl 6 , 38 bytes
Pruébalo en línea!
No estoy seguro de cómo se supone que funciona el redondeo. Si se redondea al final entonces puedo añadir
.round
a +6 bytes . Si el comportamiento de/
debe ser diferente, entonces puede ser más largo. Toma entrada como curryf(arithmetic)(numerals)(arithmetic)
.Explicación:
fuente
Stax ,
746665 bytesEjecutar y depurarlo
A Stax no le va bien aquí, ya que carece de una verdadera instrucción "eval". Tiene uno que se llama "eval" en los documentos, pero solo funciona en valores literales, no en expresiones completas.
fuente
Bash, 97 bytes
Podría ser menos si pudiéramos truncar, en lugar de redondear. También es difícil manejar los ceros iniciales (como en el caso de prueba # 2) ya que Bash interpreta los números que comienzan con 0 como octales.
fuente
tr
es parte de los coreutils, mientrasbc
que no lo es. Sin embargo,bc
es una herramienta muy común. Cualquier otro comando en esta respuesta es bash.$T
es solo un byte más corto que0-9
, solo lo usa dos veces y gasta 8 bytes para definirlo.Bean ,
9490 bytesHexdump
JavaScript
Explicación
Este programa asigna implícitamente la primera y segunda líneas de entrada como cadenas a las variables
a
yb
respectivamente.Cada carácter
c
en líneab
se reemplaza con el índice respectivoi
del carácter encontrado en líneaa
, o en sí mismo si no se encuentra.Luego, elimina cada secuencia de uno o más
0
s precedidos por un límite de la cadena resultante. Esto es para evitareval()
evaluar cualquier secuencia de dígitos que comience0
como un literal octal.Después
eval()
yMath.round()
, el resultado se vuelve a convertir en una cadena y cada carácter de dígitoi
se reemplaza por el carácter correspondiente de la líneaa
en el índicei
.Casos de prueba
Manifestación
Manifestación
Manifestación
Manifestación
fuente
Perl 5
-p
, 63 bytesPruébalo en línea!
Toma la expresión en la primera línea de entrada y la lista de traducción en la segunda.
fuente
Perl 5 , 130 bytes
Pruébalo en línea!
Tal vez esa doble evaluación de alguna manera pueda convertirse
s/.../.../geer
.fuente
Carbón , 14 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Nota: La expresión se evalúa de acuerdo con la semántica de Python 3, por lo que, por ejemplo, los ceros iniciales en números distintos de cero son ilegales. Explicación:
fuente
0
no funcionan en Python, que está presente en los casos de prueba.Python 3 , 137 bytes
Un enfoque no regex que usa
str.translate
ystr.maketrans
para reemplazar los caracteres. Perdí muchos personajes al recortar los ceros iniciales ...Pruébalo en línea!
fuente
Python 3 , 167 bytes
Pruébalo en línea!
Margen de mejora...
fuente
Wolfram Language (Mathematica) , 121 bytes
Defino una función pura con dos argumentos. Como algunas funciones se repiten, las guardo en una variable para guardar algunos caracteres. Este código simplemente hace algunos reemplazos de cadena y luego lo usa
ToExpression
para evaluar la expresión con el núcleo Wolfram.Pruébalo en línea!
fuente
Lua ,
162151150 bytesload
lugar defunction(...) end
Pruébalo en línea!
No es la cosa más corta del mundo (Lua te obliga a ser muy difícil, especialmente con grandes palabras clave), pero fue muy divertido de crear. Programa completo que toma datos como argumentos y resultados de impresión.
Explicación
Introducción
Asignar valores de argumentos a variables. Nuestro diccionario es
l
y la expresión esp
.La siguiente expresión es bastante difícil de entender porque tiene un orden de ejecución extraño, así que lo explicaré paso a paso:
Convertir a números normales
Realice el reemplazo en la cadena de expresión: tome cada símbolo y páselo a la función (
load
demostró estar más corto que la declaración normal).La función encuentra la posición de ocurrencia en la cadena dict para el símbolo pasado usando
find
....
es el primer (y único) argumento aquí, ya que estamos en la función vaarg (cualquierload
ed es) que es nuestro símbolo actual. Se requieren los siguientes argumentos parafind
ignorar símbolos especiales (1
es solo un valor corto que se evalúa comotrue
cuando se convierte en booleano): posición inicial (una es predeterminada aquí) yplain
, que en realidad deshabilita el manejo de patrones. Sin esos programas falla en el tercer caso de prueba debido a%
es especial.Si se encuentra una coincidencia, reste uno ya que las cadenas Lua (y las matrices por cierto) están basadas en 1. Si no se encuentra ninguna coincidencia, no devolverá nada, por lo que no se realizará ningún reemplazo.
Resolviendo
Anteponga
return
a nuestra expresión para dejar que devuelva el resultado, calcúlelo compilando como función Lua y llamándolo, realice el redondeo ( esto cambió para hacerlo más corto).Al final, obtenemos una solución numérica a nuestro problema, solo queda convertirla de nuevo.
Volviéndolo loco otra vez
La primera línea es una forma corta de convertir un número en una cadena, por lo que ahora podemos llamar a los métodos de cadena de una manera corta. ¡Hagámoslo!
Ahora
gsub
se llama nuevamente para reemplazar todo de nuevo a la locura. Este tiempo%d
se usa en lugar de.
como patrón de reemplazo, ya que nuestra función puede y debe procesar solo números (.
daría como resultado un error en números negativos). Esta función de tiempo (load
ed nuevamente para guardar bytes) primero agrega1
a su primer (y único) argumento, convirtiéndolo en una posición en la cadena dict, luego devuelve el carácter de él en esa posición.¡Hurra, casi allí!
Dramático final, o por qué importan los corchetes
Bueno ... ¿por qué dos pares de paréntesis de todos modos? Es hora de hablar sobre parall ... eh, retorno múltiple en Lua. La cosa es que una función puede devolver pocos valores de una llamada (mira esta meta pregunta para más ejemplos).
Aquí, el último
gsub
devolvió dos valores: la cadena de respuesta que necesitamos y la cantidad de reemplazos realizados (recuento de dígitos en realidad, pero a quién le importa). Si no fuera por el par interno, tanto la cadena como el número se imprimirían, jodiéndonos. Así que aquí sacrificamos dos bytes para omitir el segundo resultado y finalmente imprimir el producto de esta fábrica de locura.Bueno, he disfrutado explicando casi tanto como jugar golf en primer lugar, espero que entiendas lo que está pasando aquí.
fuente