A Jack le gusta el lenguaje de programación C, pero odia escribir expresiones como V=a*b*h;
multiplicar los valores.
En su V=abh;
lugar, le gustaría escribir , ¿por qué el compilador debe gemir acerca de que el abh
símbolo no está definido ya que int a, b, h;
están definidos, para que podamos deducir la multiplicación?
Ayúdelo a implementar un analizador que descifre un solo término de multiplicación, siempre que se conozca el conjunto de variables definidas en el alcance actual.
Por simplicidad, la multiplicación por número (como en 2*a*b
) no se tiene en cuenta, solo aparecen las variables.
La entrada es un término de multiplicación T , que cumple la expresión regular:
[a-zA-Z_][a-zA-Z_0-9]*
y un conjunto variable de Z .
Un análisis P del término T sobre el conjunto variable Z es una cadena que cumple lo siguiente:
- después de eliminar todas las ocurrencias de
*
P, recibimos T, - es un nombre de variable de Z o consta de nombres de variable apropiados de Z divididos por
*
caracteres individuales .
La solución debe imprimir todos los análisis de un término.
Muestra:
Vars a, c, ab, bc
Term abc
Solution ab*c, a*bc
Vars ab, bc
Term abc
Solution -
Vars -
Term xyz
Solution -
Vars xyz
Term xyz
Solution xyz
Vars width, height
Term widthheight
Solution width*height
Vars width, height
Term widthheightdepth
Solution -
Vars aaa, a
Term aaaa
Solution aaa*a, a*aaa, a*a*a*a
La entrada (la lista de variables y el término) se puede proporcionar de cualquier manera adecuada para el idioma.
La salida puede estar en cualquier forma sensata (un análisis por línea o una lista separada por comas, etc.), pero debe ser inequívoca y posible de leer.
La salida vacía es aceptable si no hay un posible análisis de un término (en los ejemplos usé '-' para mayor claridad).
Este es un código de golf, por lo que gana el código más corto.
ab*c
es un análisis incorrecto, yac
que no es una variable permitida.a*aaa aaa*a
y noab*c c*ab
Respuestas:
Pyth, 18 caracteres
Esta solución está adaptada de mi solución Interpreting Fish . Los problemas son en realidad muy similares.
Espera entrada como tal:
Da salida como esta:
Pruébalo aquí.
sm^Qkhlz
: Genera todas las secuencias de variables que contienen hasta la longitud del número de cadena de entrada de variables.fqzsT
: Filtra las secuencias variables que coinciden con la cadena de entradamj\*d
: Inserta el*
símbolo e imprime.fuente
Python 2 -
14794 bytesEsto define una función
R
para ser utilizada como:Imprime resultados como:
fuente
JavaScript (ES6) 111
Adaptado de mi respuesta "pez" , la principal diferencia es encontrar todas las soluciones, no solo la primera.
La salida se imprime en la consola. El resultado de la función no tiene significado y debe descartarse.
Prueba en la consola Firefox / FireBug
fuente