IMP: analizador de multiplicación implícito

9

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 abhsí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:

  1. después de eliminar todas las ocurrencias de *P, recibimos T,
  2. 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.

pawel.boczarski
fuente
1
En su primer ejemplo, creo que ab*ces un análisis incorrecto, ya cque no es una variable permitida.
isaacg
1
Con una exploración recursiva, encuentro exactamente su resultado en la muestra. Pero es cuestionable: por qué a*aaa aaa*ay noab*c c*ab
edc65
Debido a la regla 1. de análisis. Sí, la multiplicación suele ser conmutativa, pero no llegamos tan lejos, solo queremos "reconstruir" la multiplicación en el orden en que se realizó. En realidad, en el lenguaje de Jack podríamos tener un tipo de matriz: la multiplicación no es conmutativa entonces. Y "aaaa" puede ser a la vez yuxtaposición de "aaa" y "a" o "a" y "aaa", esto no es por conmutación, sino por ambigüedad, estamos teniendo en cuenta a ambos.
pawel.boczarski

Respuestas:

4

Pyth, 18 caracteres

mj\*dfqzsTsm^Qkhlz

Esta solución está adaptada de mi solución Interpreting Fish . Los problemas son en realidad muy similares.

Espera entrada como tal:

aaaa
"a", "aaa"

Da salida como esta:

['a*aaa', 'aaa*a', 'a*a*a*a']

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 entrada

  • mj\*d: Inserta el *símbolo e imprime.

isaacg
fuente
3

Python 2 - 147 94 bytes


R=lambda S,V,F=[]:S and[R(S[len(v):],V,F+[v])for v in V if v==S[:len(v)]]or print("*".join(F))

Esto define una función Rpara ser utilizada como:

>>> R("abc", ["a", "bc", "ab", "c"])

Imprime resultados como:

a*bc
ab*c
matsjoyce
fuente
1

JavaScript (ES6) 111

Adaptado de mi respuesta "pez" , la principal diferencia es encontrar todas las soluciones, no solo la primera.

F=(v,t)=>(k=(s,r)=>s?v.map(v=>s.slice(0,l=v.length)==v&&k(s.slice(l),[...r,v])):console.log(r.join('*')))(t,[])

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

F(['a','c','ab','bc'],'abc')  
a*bc  
ab*c

F(['ab','bc'],'abc')

F(['aaa','a'],'aaaa')
aaa*a
a*aaa
a*a*a*a

F(['xyz'],'xyz')
xyz
edc65
fuente