Su tarea es escribir un programa que tome datos como este:
a + b * c + a / 2
y generará el código fuente para un programa que toma la entrada del usuario y luego evalúa la expresión.
La expresión puede contener los operadores +
, -
, *
, /
; variables minúsculas de una letra; y enteros entre 0 y 32000. La precedencia aritmética estándar debe seguirse correctamente. La expresión está limitada a 26 variables únicas de la a a la z. Sin embargo, una sola variable puede aparecer más de una vez.
Puede suponer que la expresión de entrada es válida (sigue estas reglas).
El programa generado debe solicitar la entrada del usuario en este formulario, solicitando solo una vez para cada variable:
a =
La entrada del usuario de 0 a 32000 debe manejarse correctamente. Luego imprimirá la expresión y el resultado correcto. Puede usar aritmética de enteros o de coma flotante. Los cálculos deben realizarse con al menos 32 bits de precisión. Más allá de eso, no tiene que preocuparse por el desbordamiento o dividir por cero.
Ejemplo de un programa Perl generado sin golf para la expresión anterior:
print "a = ";
my $a = <>;
print "b = ";
my $b = <>;
print "c = ";
my $c = <>;
print "a + b * c + a / 2 = " . ($a + $b * $c + $a / 2);
Ejemplo de entrada y salida del programa generado para la expresión anterior:
a = 1
b = 2
c = 3
a + b * c + a / 2 = 7.5
La puntuación se calcula como la longitud del programa + longitud del programa generado para esta expresión:
1 + a * 4 * b + 2 / d * e - a - 3 + g / h * 32000
La puntuación más baja gana.
Actualización: Solo para resaltar un par de requisitos del problema, como se indicó anteriormente:
- La salida del programa debe ser el código fuente de otro programa que evalúe la expresión.
- El programa debe imprimir la expresión original . Quizás haya cierta ambigüedad en esto (se podría argumentar que
a+b
es la misma expresión quea + b
), pero para mayor claridad, digamos que debe ser la expresión original con el espacio en blanco intacto. Todas las respuestas válidas hasta ahora lo han hecho de esa manera.
\pL
puede reemplazar[a-z]
. No hay necesidad dedo
bloquear. Puede escribir:${$&}//=print"$& = "and<>
\pL
hecho. No se puede usarand
en ninguno de los programas, porque la precedencia es demasiado baja;and
tiene menor precedencia que//=
.Lua, 202 + 166 = 368
Archivo "generate_code.lua"
Uso:
Código generado (no se especifica el orden de las variables):
Código generado en acción:
fuente
Tcl 198 + 155 = 352
genera
fuente
foreach
=>lmap
;va
=>v
Pitón 125 + 151 = 276
Ahora ejecutándolo:
fuente
z=sorted(set(filter(str,isalpha,t)))
conz=''.join(set(filter(str.isalpha,t)))
.