Эта проблема связана с некоторыми возможностями языка MATL в рамках мероприятия « Язык месяца», который состоится в мае 2018 года . Сопутствующий вызов : Функция буфера обмена: вставка .
Вступление
MATL имеет несколько буферов обмена , где вы можете хранить значения (копировать), которые будут получены позже (вставить). Некоторые буферы обмена являются автоматическими , что означает, что копирование автоматически инициируется определенными событиями. Эта задача фокусируется на одной из автоматических буферов обмена, называемых буфером ввода функций или просто буфером функций .
В этом буфере обмена хранятся входы для четырех самых последних вызовов обычных функций ввода. Нормальные функции - самый распространенный тип функций в MATL. Получение ввода означает, что функция принимает по крайней мере один вход (функции, которые не принимают никакого ввода, не рассматриваются буфером функций).
Это лучше всего объяснить с помощью следующих примеров, в которых используются две нормальные функции:
+, который извлекает два числа из стека и выталкивает их сумму.U, который выскакивает одно число и толкает его квадрат.
Пример 1 :
3 2 + 6 + 12 4 U + +
дает результат 39. Код интерпретируется следующим образом:
- Числовые литералы, такие как
3или12выталкиваются в стек - Такие функции, как
+выталкивание их входов и помещение их выходов в стек.
Вызовы функций в хронологическом порядке:
3 2 +дает55 6 +дает114 Uдает1612 16 +2811 28 +дает39.
Буфер обмена можно просматривать как список из четырех списков. Каждый внутренний список содержит входные данные для вызова функции, причем самые последние вызовы выполняются первыми . Внутри каждого внутреннего списка входы находятся в их первоначальном порядке .
Итак, после запуска кода содержимое буфера обмена (в нотации Python):
[[11, 28], [12, 16], [4], [5, 6]]
Пример 2 :
10 20 U 30 +
оставляет номера 10и 430в стеке. Стек отображается снизу вверх в конце программы.
Вызовы функций
20 Uдает400400 30 +дает430
Поскольку было только два вызова функций, некоторые из внутренних списков, определяющих буфер обмена, будут пустыми . Обратите внимание также, как 10не используется в качестве входных данных для любой функции.
Таким образом, содержимое буфера обмена после запуска кода:
[[400, 30], [20], [], []]
Пример 3 (неверно):
10 20 + +
считается недействительным, потому что отсутствует вход для второго +(в MATL это неявно инициирует пользовательский ввод).
Соревнование
Входные данные : строка S с номером литералов, +и U, разделенные пробелами.
Вывод : содержание функции буфера обмена после оценки строки S .
Разъяснения:
- Вы можете использовать любые два согласованных символа для представления этих функций, кроме цифр. Также вы можете использовать любой непротиворечивый символ в качестве разделителя вместо пробела.
- Будут рассматриваться только две указанные функции.
- Входная строка будет содержать хотя бы один числовой литерал и хотя бы одну функцию.
- Все числа будут положительными целыми числами, возможно, с более чем одной цифрой.
- Возможно, что некоторые числовые литералы не используются какой-либо функцией, как в примере 2.
- На входе гарантированно будет действительный код, не требуя дополнительных цифр. Таким образом, строка, как в примере 3, никогда не появится.
- Завершающие пустые внутренние списки в выводе могут быть опущены. Таким образом, результат в примере 2 может быть
[[400, 30], [20]] - Любой разумный, однозначный формат вывода является приемлемым. Например, строка с запятой в качестве разделителя и внутренней точки с запятой в качестве разделителя: наружного
400,30;20;;.
Дополнительные правила:
Ввод и вывод могут быть приняты любым разумным способом .
Программы или функции разрешены на любом языке программирования . Стандартные лазейки запрещены .
Самый короткий код в байтах побеждает.
Контрольные примеры
Input
Output
3 2 + 6 + 12 4 U + +
[[11, 28], [12, 16], [4], [5, 6]]
15 3 4 + 2 U 8 + U +
[[7, 144], [12], [4, 8], [2]]
3 6 9 12 + + 10 8 U 6
[[8], [6, 21], [9, 12], []]
8 41 12 25 4 5 33 7 9 10 + + + + + + + +
[[41, 105], [12, 93], [25, 68], [4, 64]]
10 1 1 + U U U U U
[[65536], [256], [16], [4]]
M?
M. Я сделаю это в вызове «вставить»
[[28, 11], [16, 12], [4], [6, 5]]Допустим ли вывод для первого примера?