Эта проблема связана с некоторыми возможностями языка MATL в рамках мероприятия « Язык месяца», который состоится в мае 2018 года . Сопутствующий вызов : Функция буфера обмена: вставка .
Вступление
MATL имеет несколько буферов обмена , где вы можете хранить значения (копировать), которые будут получены позже (вставить). Некоторые буферы обмена являются автоматическими , что означает, что копирование автоматически инициируется определенными событиями. Эта задача фокусируется на одной из автоматических буферов обмена, называемых буфером ввода функций или просто буфером функций .
В этом буфере обмена хранятся входы для четырех самых последних вызовов обычных функций ввода. Нормальные функции - самый распространенный тип функций в MATL. Получение ввода означает, что функция принимает по крайней мере один вход (функции, которые не принимают никакого ввода, не рассматриваются буфером функций).
Это лучше всего объяснить с помощью следующих примеров, в которых используются две нормальные функции:
+
, который извлекает два числа из стека и выталкивает их сумму.U
, который выскакивает одно число и толкает его квадрат.
Пример 1 :
3 2 + 6 + 12 4 U + +
дает результат 39
. Код интерпретируется следующим образом:
- Числовые литералы, такие как
3
или12
выталкиваются в стек - Такие функции, как
+
выталкивание их входов и помещение их выходов в стек.
Вызовы функций в хронологическом порядке:
3 2 +
дает5
5 6 +
дает11
4 U
дает16
12 16 +
28
11 28 +
дает39
.
Буфер обмена можно просматривать как список из четырех списков. Каждый внутренний список содержит входные данные для вызова функции, причем самые последние вызовы выполняются первыми . Внутри каждого внутреннего списка входы находятся в их первоначальном порядке .
Итак, после запуска кода содержимое буфера обмена (в нотации Python):
[[11, 28], [12, 16], [4], [5, 6]]
Пример 2 :
10 20 U 30 +
оставляет номера 10
и 430
в стеке. Стек отображается снизу вверх в конце программы.
Вызовы функций
20 U
дает400
400 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]]
[[28, 11], [16, 12], [4], [6, 5]]
Допустим ли вывод для первого примера?M
?M
. Я сделаю это в вызове «вставить»Ответы:
05AB1E , 20 байтов
Попробуйте онлайн!
-4 спасибо Эмигне (а также -8 благодаря тому, что он сообщил мне о правилах).
a
b
источник
Баш , 43 байта
Попробуйте онлайн!
Это распечатывает буфер обмена в следующем формате, обратите внимание на использование \ x0F в качестве разделителя.
Основная идея состоит в том, чтобы передать это в dc, основанный на стеке язык, так, чтобы требуемые элементы стека были напечатаны.
Входные данные передаются в sed, где каждый
+
заменяется наrdnFPrp+
, который в dc печатает второе число в стеке, за которым следует \ x0F, а затем верхнее число перед выполнением сложения. sed также заменяет каждыйU
наp2^
, печатает верхний элемент стека и возводит его в квадрат.Результат sed оценивается как код постоянного тока, распечатывая весь буфер обмена.
Поскольку линии расположены в обратном порядке,
tac
(обратноеcat
) используется для исправления этого.И, наконец, sed выбирает первые 4 строки из TAC.
источник
Python 2 , 126 байт
Попробуйте онлайн!
источник
Haskell ,
113109 байтПервая строка определяет анонимную функцию , которая принимает строку, например
"3 2 + 6 + 12 4 U + +"
, и возвращает список списков целых чисел:[[11,28],[12,16],[4],[5,6]]
. Попробуйте онлайн!источник
Чисто , 140 байт
Попробуйте онлайн!
В классическом чистом стиле это решение Haskell, за исключением примерно на 50% длиннее.
источник
JavaScript (ES6), 107 байт
Принимает ввод как список, состоящий из целых чисел,
'+'
и'U'
. Возвращает другой список, состоящий из целых чисел, массивов из 2 целых чисел и'_'
для пустых слотов.Попробуйте онлайн!
комментарии
источник
Go,
305303295 байтУдалил 8 байтов благодаря @ovs
Попробуйте онлайн!
источник
Октава , 206 байт
Попробуйте онлайн!
Если бы только у Octave был
pop
синтаксис.m
это буфер памяти,t
стек.источник
m
иt
наоборот, добавив элементы вперед, а не в конец?Python 3 ,
218204 байта-14 байт благодаря овсу
Попробуйте онлайн!
источник
Красный ,
335330 байтПопробуйте онлайн!
Более читабельно:
источник
R ,
205182 байтПопробуйте онлайн!
M
это буфер памяти,P
это программа иS
стек.Технически
S
инициализируется как вектор, содержащий один ноль, но, поскольку мы никогда не получим неверный ввод, он спасает меня от байтаS={}
.источник
C (gcc) , 264 байта
Я использовал рекурсию, чтобы я мог использовать стек функций в качестве стека данных: список входов просматривается и операции выполняются: результаты отображаются в обратном порядке, а нажатия стеков не отображаются.
Стек реализован в виде связанного списка. Вот как это работает:
Первоначально я использовал структуру для узлов, но я переключился на голые указатели, чтобы сэкономить место. Интересной особенностью этого связанного списка является то, что он очищает себя после завершения рекурсии.
Попробуйте онлайн!
источник