Цей виклик пов'язаний з деякими особливостями мови 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]]
M
?
M
. Я зроблю це у виклику "вставити"
[[28, 11], [16, 12], [4], [6, 5]]
дійсний вихід для першого прикладу?