Джеку нравится язык программирования C, но он не любит писать выражения, например, V=a*b*h;
умножать значения.
Он хотел бы написать V=abh;
Вместо этого , почему компилятор должен стонать о том, что abh
символ не определен, поскольку он int a, b, h;
определен, чтобы мы могли выводить умножение?
Помогите ему реализовать синтаксический анализатор, который расшифровывает один термин умножения, при условии, что набор переменных, определенных в текущей области видимости, известен.
Для простоты умножаем на число (как в 2*a*b
) не учитывается, появляются только переменные.
Вводом является умножение T , выполняющее регулярное выражение:
[a-zA-Z_][a-zA-Z_0-9]*
и набор переменных Z .
Синтаксический анализ P термина 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
Входные данные (список переменных и термин) могут быть предоставлены любым способом, подходящим для языка.
Вывод может быть в любой разумной форме (один разбор на строку или список через запятую и т. Д.), Но он должен быть однозначным и его можно читать.
Пустой вывод допустим, если нет возможности синтаксического анализа термина (в примерах я использовал '-' для ясности).
Это код гольф, поэтому выигрывает самый короткий код.
ab*c
неправильный анализ, посколькуc
это недопустимая переменная.a*aaa aaa*a
и нетab*c c*ab
Ответы:
Пиф, 18 символов
Это решение адаптировано из моего решения по интерпретации рыбы . Проблемы на самом деле очень похожи.
Ожидается ввод как таковой:
Дает вывод, как это:
Попробуй это здесь.
sm^Qkhlz
: Генерирует все последовательности переменных, содержащие до длины входной строки число переменных.fqzsT
: Отфильтровывает последовательности переменных, соответствующие входной строкеmj\*d
: Вставляет*
символ и печатает.источник
Python 2 -
14794 байтаЭто определяет функцию,
R
которая будет использоваться как:Печать выводится как:
источник
JavaScript (ES6) 111
Исходя из моего «рыбного» ответа , основное отличие заключается в поиске всех решений, а не только первого.
Вывод выводится на консоль. Результат функции не имеет смысла и должен быть отброшен.
Тест в консоли Firefox / FireBug
источник