Джеку подобається мова програмування на C, але він ненавидить писати вирази, які люблять V=a*b*h;
множити значення.
Він хотів би написати V=abh;
замість цього, чому компілятор стогне про те, що abh
символ не визначений, оскільки int a, b, h;
вони визначені, щоб ми могли вивести множення?
Допоможіть йому реалізувати аналізатор, який розшифровує єдиний термін множення за умови, що відомий набір змінних, визначений у поточному діапазоні.
Для простоти множення на число (як і в 2*a*b
) не враховується, з'являються лише змінні.
Вхід є терміном множення T , що виконує regexp:
[a-zA-Z_][a-zA-Z_0-9]*
і змінне безліч Z .
Синтаксичний аналіз терміна T над набором змінної Z - це рядок, що відповідає наступному:
- після видалення всіх випадків
*
з P ми отримуємо T, - або ім'я змінної від Z, або складається з власних імен змінних з Z, розділених на окремі
*
символи.
Рішення повинно надрукувати всі синтаксичні позначення терміна.
Зразок:
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
Вхідні дані (перелік змінних та термін) можуть надаватися будь-яким способом, відповідним мові.
Вихід може бути в будь-якій розумній формі (один аналіз на рядок або список, розділений комами тощо) - але він повинен бути однозначним і можливим для читання.
Порожній вихід прийнятний, якщо неможливий розбір терміна (у прикладах, які я використав '-' для наочності).
Це кодовий гольф, тому виграє найкоротший код.
a*aaa aaa*a
і ніab*c c*ab
ab*c
, що це неправильний аналіз, оскількиc
це не дозволена змінна.