Эта проблема связана с некоторыми возможностями языка MATL в рамках мероприятия « Язык месяца», который состоится в мае 2018 года . Сопутствующий вызов: Функция буфера обмена: копия .
Вступление
Буфер обмена функций MATL хранит («копирует») входные данные для четырех самых последних вызовов обычных функций ввода. Нормальные функции - самый распространенный тип функций в MATL. Взятие ввода означает, что функция берет по крайней мере один ввод. Сохраненное содержимое буфера обмена может быть помещено в стек («вставлено»).
Эта задача будет принимать содержимое буфера обмена в качестве входных данных. Предполагается, что все функции, которые создали это состояние буфера обмена, приняли одно или несколько положительных целых чисел в качестве входных данных. Таким образом, состояние буфера обмена может быть представлено списком номеров. (Для получения дополнительной информации о том, как фактически заполнен буфер обмена, см. Связанную проблему, но для текущей это не обязательно).
Интерпретация содержимого буфера обмена
Пример 1
Первый внутренний список относится к самому последнему вызову функции, и так далее, таким образом, состояние буфера обмена
[[11, 28], [12, 16], [4], [5, 6]]
указывает на то, что вызов последней функции взял два входа, а именно 11
, 28
; второй последний вызов принял входы 12
, 16
; и т. д. (Это состояние буфера обмена создается кодом в первом примере связанной задачи).
Пример 2
Если не было достаточно вызовов функций , некоторые конечные внутренние списки в буфере обмена будут пустыми:
[[7, 5], [], [], []]
(Это производится программой, которая просто добавляет 7
и 5
).
Пример 3
Вызовы функций могут иметь любое количество входов , но всегда как минимум 1
(функции, не имеющие входов, не изменяют состояние буфера обмена). Таким образом, следующее также возможно.
[[3], [2, 40, 34], [7, 8, 15], []]
Доступ к содержимому буфера обмена
Содержимое буфера обмена функции помещается в стек с помощью функции MATL M
(которая, кстати, является не обычной функцией, а функцией буфера обмена). Эта функция принимает положительное целое число в качестве входных данных и помещает часть содержимого буфера обмена в стек следующим образом. Со ссылкой на состояние буфера обмена в примере 1:
[[11, 28], [12, 16], [4], [5, 6]]
1M
возвращает все входные данные для самого последнего вызова функции. Таким образом, для рассматриваемого примера, он дает11
,28
.- Точно так же
2M
,3M
и4M
вернуть все входы на второй, третий и четвертый самые последние вызовы функций. Таким образом ,2M
дает12
,16
;3M
дает4
; и4M
дает5
,6
. - Числа за пределами
4
выбирают отдельные входы для вызовов функций, которые занимали более одного входа. Поэтому5M
возвращает последний ввод для самого последнего такого вызова. В нашем случае это дает28
.6M
возвращает предыдущий отдельный вход, который11
.7M
возвращает последний ввод второго по последнему вызову, то есть16
и8M
дает12
. Теперь9M
дает6
. Обратите внимание, как ввод4
пропускается, потому что это был единственный ввод при вызове функции. Наконец,10M
дает5
.
Для состояния буфера обмена в примере 3:
[[3], [2, 40, 34], [7, 8, 15], []]
1M
дает3
.2M
дает2
,40
,34
.3M
дает7
,8
,15
.4M
имеет неопределенное поведение (для целей этой задачи), потому что было только три вызова функций.5M
дает34
.6M
дает40
.7M
дает2
.8M
дает15
.9M
дает8
,10M
дает7
.11M
,12M
... также есть неопределенное поведение .
Соревнование
Вход :
- состояние буфера обмена в виде списка списков или любого другого приемлемого формата;
- положительное целое число n .
Выход : результат вызова функции M
с n в качестве ввода. Выходными данными будут одно или несколько чисел с однозначным разделителем или в любом приемлемом формате, таком как список или массив.
Разъяснения:
- Состояние буфера обмена состоит из четырех списков чисел. Некоторые из конечных списков могут быть пустыми, как в примерах 2 и 3. При желании вы можете ввести буфер обмена без этих конечных пустых списков. Так что пример 3 станет
[[3], [2, 40, 34], [7, 8, 15]]
. - Все числа в буфере обмена будут положительными целыми числами, возможно, с более чем одной цифрой.
- Число n гарантированно будет действительным. Так, например, 3 выше,
n
не может быть4
или11
.
Дополнительные правила:
Ввод и вывод могут быть приняты любым разумным способом .
Программы или функции разрешены на любом языке программирования . Стандартные лазейки запрещены .
Самый короткий код в байтах побеждает.
Контрольные примеры
Clipboard state
Number
Output(s)
[[11, 28], [12, 16], [4], []]
2
12, 16
[[11, 28], [12, 16], [4], []]
5
28
[[7, 144], [12], [4, 8], [3, 4, 6]]
1
7, 144
[[7, 144], [12], [4, 8], [3, 4, 6]]
10
4
[[30], [40], [50, 60], [70, 80, 90]]
2
40
[[30], [40], [50, 60], [80, 90]]
7
90
[[15], [30], [2, 3, 5], [4, 5, 10]]
3
2, 3, 5
[[15], [30], [2, 3, 5], [4, 5, 10]]
7
2
источник
Ответы:
Желе , 8 байт
Попробуйте онлайн!
источник
ḊƇ
выделите все несинглетоны ,U
переверните иẎ
сгладьте. Для ввода[[11, 28], [12, 16], [4], []]
это получает[16, 12, 28, 11]
значения5M
через8M
. Теперь добавьте исходный ввод в этот список⁸;
и внесите в результирующий список другой вход⁹ị
.U
это не меняет результатḊƇ
, а скорее на каждый из его элементов. Только если бы я мог как-то уменьшитьḊƇUẎ⁸;
...Haskell ,
56 5147 байт-5-9 байт благодаря Laikoni (сопоставление с образцом, чтобы обеспечить длину> 1 и использованиеdo
-notation над списком понимания)!Попробуйте онлайн!
Pointfree,
5855 байт-3 байта благодаря Лайкони (перемещение
([]:)
и заменаid
)!В качестве альтернативы мы могли бы использовать эту версию без очков
(!!).(([]:)<>map pure.(>>=reverse).filter((1<).length))
,источник
APL (Dyalog Unicode) , 17 байт
Попробуйте онлайн!
источник
JavaScript (Node.js) , 57 байт
Попробуйте онлайн!
Это анонимная функция с карри. Запустить его с
( function code )(clipboard)(n)
объяснение
источник
JavaScript (ES6), 72 байта
Принимает ввод в синтаксисе карри
(clipboard)(n)
.Попробуйте онлайн!
источник
Python 2 ,
6056 байтспасибо Джонатану Аллану за -4 байта.
Попробуйте онлайн!
источник
Java 8, 110 байт
Лямбда (карри), принимающая состояние буфера обмена в качестве
int[][]
и число в качествеint
и возвращаяint
илиint[]
(одно число может быть возвращено через любой тип).Попробуйте онлайн
Ungolfed
источник
05AB1E , 12 байтов
Попробуйте онлайн!
объяснение
источник
Шелуха , 12 байт
Попробуйте онлайн!
объяснение
Практически прямой порт ответа Хаскелла:
источник
R , 58 байт
Попробуйте онлайн!
Принимает
M
какlist
векторовc()
; поэтому замена[[
наlist(
,[
сc(
и]
на)
должна преобразовать контрольные примеры в R.Для входных данных
n<=4
с «неопределенным поведением» возвращает,NULL
а для других недопустимых входных данных выдает ошибку «индекс за пределами».источник
[n]
вместо[[n]]
.Stax ,
121413 байтЗапустите и отладьте его
Объяснение:
Stax, 12 байт
Распакованный:
Это блок, поэтому я могу избавиться от него
]|u
, но я не знаю, допустимо ли это, поскольку он упаковывает блок.источник
J ,
3322 байта-11 байт (на 1/3 короче) благодаря решению FrownyFrog!
Попробуйте онлайн!
Мое первоначальное решение:
J , 33 байта
Не рад - я уверен, что это может быть сделано в гольф гораздо дальше.
Объяснение:
Диадическая функция, принимающая состояние буфера обмена в качестве своего правого аргумента, левый аргумент
n
<:@[
вычтите 1 из левого аргумента{
выбираетi
элемент th (рассчитанный выше) из списка справа(...)
весь список#
копия]
из списка состояния буфера обмена(1<#)
подсписки длиной более 1|.&.>
вращать каждый скопированный список<"0@;
никак и коробка - помещает каждый номер в отдельную коробку,
добавить новый список в список состояний буфера обмена@]
делает весь глагол в (...) монадическомПопробуйте онлайн!
источник
0;
больше всего. Благодарность!V + coreutils ,
53 45 43 4240 байт-9 байт благодаря DJMcMayhem (используя
VGÇ /d
снова:,$g/^[^ ]*$/d
,D@"dd
снова"aDÀdd
и!!
снова:.!
)!Моя самая первая попытка V (советы приветствуются!), Приведенный ниже код использует обведенные символы (например,
ⓞ
для\xf
) для удобства чтения:Попробуйте онлайн!
шестнадцатеричного
объяснение
Первая строка содержит n, а строки ниже содержат записи в буфере обмена, каждая запись разделяется пробелами, если было несколько входов:
источник
Красный , 91 байт
Попробуйте онлайн!
источник
C (gcc) , 176 байт
Попробуйте онлайн!
Принимает массив как список из 4 пар указателей начала / конца, затем n.
Описание:
источник