Я смотрю на формат ввода для этой проблемы ACM , а именно:
Описание NTA дается числом состояний n
, за которым следует число принятие состояний на одной строке, разделенной пробелом. Таблица перехода n × n
следует в основном порядке строк; каждая строка перехода задается в отдельной строке.
(игнорировать остальное, это не имеет значения.)
Так, например:
3 1
a
a
c
ca
a
b
c
b
a
Это означает что 9 (3²) строк, следующих за первой строкой, являются переходами. В моем коде мне нужно сохранить как значение 3, так и значение 1, а также список из 9 переходов. В идеале я хотел бы, чтобы выражение, которое дает мне:
- 3
- 1
['ab', 'a', 'c', 'a', 'ab', 'b', 'c', 'b', 'ab']
Моя первая мысль была попробовать выражение на основе countedArray()
:
from pyparsing import pyparsing_common, Word, alphas, countedArray
table_start = pyparsing_common.integer*2
table_start.addParseAction(lambda toks: toks[0]**2)
table_transitions = countedArray(Word(alphas), table_start)
Однако countedArray()
подавляет выражение count, что означает, что я теряю значение 1 (число принимающих состояний) и могу получить только 3 обратно, взяв квадрат root длины результирующего списка.
Я не слишком обеспокоен полным анализом этой проблемы, так как проблемы ACM позволяют предположить, что входные данные будут правильно отформатированы. Таким образом, я мог легко использовать более простое выражение и простые Python манипуляции с результатами. Но я изучаю Pyparsing и хотел бы знать, возможно ли это простым способом с использованием этой библиотеки (тем более, что я сталкиваюсь с подобными грамматиками в реальных проектах, которые я хотел бы использовать Pyparsing для упрощения).