Диаграмма состояния стека показывает, как значения одного стека меняются на другие. Например, это диаграмма состояний стека:
3 0 2 1 0
Это означает, что существует стек, изначально содержащий 3 значения ( 3
часть). Эти значения проиндексированы от 0 до 2, с 0 на вершине: 2 1 0
. Следующая часть 0 2 1 0
описывает конечное состояние стека: значение, которое изначально было на вершине стека, также было скопировано на оборотную сторону.
Эти преобразования происходят в стеке, который поддерживает несколько типов данных:
- Тип «значение», который изначально находится в стеке. Это может быть строка, целое число и т. Д., Но его значение не нужно знать.
- Тип «список», который представляет собой список, содержащий значения любого типа данных.
Для моделирования этого преобразования разрешены следующие операции:
S
: Поменяйте местами два значения сверху стека:2 1 0
→2 0 1
D
: Дублируйте значение в верхней части стека:1 0
→1 0 0
R
: Удалить верхнее значение из стека.2 1 0
→2 1
L
: Превратить верхнее значение в одноэлементный список, содержащий это значение:2 1 0
→2 1 (0)
C
: Объединить два верхних списка в стеке:2 (1) (0)
→2 (1 0)
U
: Поместить все значения из списка в стек:2 (1 0)
→2 1 0
Это эквивалентно командам Underload~ : ! a * ^
, при условии, что никакие другие команды не используются.
S
, D
, R
И L
может использоваться с любыми значениями на вершине стека, но C
и U
должны иметь списки на вершине стека функции. Представление которого генерируется последовательность попытка преформ недопустимых операций (например , D
на пустом стеке или U
на не-листе) является неправильным и должны быть наказано фиксировано.
Чтобы решить диаграмму состояния стека, найдите последовательность команд, которая будет правильно преобразовывать начальное состояние стека в новое. Например, одним из решений 3: 0 2 1 0
является LSLCSLCULSLCLSLDCSC USLCU
:
2 1 0
L 2 1 (0)
S 2 (0) 1
L 2 (0) (1)
C 2 (0 1)
S (0 1) 2
L (0 1) (2)
C (0 1 2)
U 0 1 2
L 0 1 (2)
S 0 (2) 1
L 0 (2) (1)
C 0 (2 1)
L 0 ((2 1))
S ((2 1)) 0
L ((2 1)) (0)
D ((2 1)) (0) (0)
C ((2 1)) (0 0)
S (0 0) ((2 1))
C (0 0 (2 1))
U 0 0 (2 1)
S 0 (2 1) 0
L 0 (2 1) (0)
C 0 (2 1 0)
U 0 2 1 0
Ваша задача - написать программу, которая берет диаграмму состояния стека и выводит решение.
Тестовые случаи
2 1 0 ->
3 2 0 -> SR
9 -> RRRRRRRRR
2 0 1 0 -> LSLCDCUR
2 0 1 1 -> SD
6 2 -> RRSRSRSR
5 0 1 2 3 4 -> LSLCSLCSLCSLCU
4 2 0 1 3 2 -> LSLCSLSCSLCULSLSCSLSCLSLDCSCUSLCU
Это код-гольф , поэтому выигрывает самый короткий действительный ответ (в байтах).
источник
C
Нужны ли списки сверху и во второй позиции стека? или элемент во второй позиции может быть добавлен в список сверху?C
нужны списки на обе позиции. Не имеет смысла объединять значение и список.Ответы:
Python 3, 84 байта
Использование:
Пояснение: Для начала мы дублируем ноль и заключаем его в список:
Это наша база. Теперь я объясню общий алгоритм, который превращается
... 1 0 (x)
в... 1 0 (i x)
произвольное целое числоi
. Я буду использовать в качестве примераi = 2
, и у нас есть произвольный список(x)
. Мы начнем с обертывания нашего текущего списка(x)
в другой список:Теперь мы повторяем следующие
i
времена последовательности :Теперь мы готовы вставить 2 в список
(x)
. Это идет следующим образом:Обратите внимание, что мы продолжаем вставлять новые целые числа слева. Итак, самый первый
(0)
мы начали, остается справа.После того, как мы вставили в список каждое целое число, которое нам нужно, мы удаляем оставшуюся часть стека путем замены и удаления n time (
SR
). Наконец мы распаковываем наш список и удаляем первый, который0
мы вставили, чтобы начать наш список (UR
).источник
s
вместоl
?l
было определено в моем REPL.DLLSLSCSLSCSLSCSLSCLSLSCDURLCULCULSCLSLSCSLSCSLSCLSLSCDURLCULCULSCLSLSCSLSCLSLSCDURLCULCULSCLSLSCLSLSCDURLCULCULSCLLSLSCDURLCULCULSCSRSRSRSRUR
). Он пытается выполнитьS
инструкцию, когда в стеке только 1 значение.CJam, 54 байта
Просто перевод с Python-решения orlp на CJam. Здесь нет ничего нового.
Объяснение:
источник