Задний план
Программисты в наши дни не могут держать свои буферы прямо! Распространенным источником ошибок является попытка использовать индекс массива, который слишком велик для буфера. Ваша задача - реализовать буфер, в котором большие индексы уменьшаются до размера, который может обрабатывать буфер. Поскольку я решаю, что лучше для всех, вы примените этот буфер к моим точным спецификациям.
обзор
У вас есть буфер только для вставки, размер которого увеличивается по мере добавления к нему элементов. Буфер индексируется нулем, а также индексируется по модулю его текущего размера. Специальное правило для этого вызова таково:
- Чтобы вставить элемент с индексом я означает вычислить J ,
j = i % buffer.length()
и вставить новый элемент после -м элемента в списке.
Единственный особый случай - если буфер пуст, так как арифметика по модулю ноль не работает. Таким образом, если буфер в настоящее время пуст, новый элемент будет иметь индекс 0 .
Если в буфере есть только один элемент, то вы всегда вставляете после 0-го элемента. Это всего лишь один пример общего случая.
Если буфер содержит 6 элементов: [4, 9, 14, 8, 5, 2]
и вам предлагается вставить новый элемент 10
с индексом 15 , вы обнаружите это 15 % 6 == 3
, а затем вставите новый 10
после 8
индекса с 3, что даст результирующий буфер [4, 9, 14, 8, 10, 5, 2]
проблема
Напишите функцию или программу, которая получает упорядоченный список положительных целых чисел и индексов положительных целых чисел, в которые их можно вставить.
Начните с пустого буфера и добавьте в него указанные целые числа по соответствующим индексам.
Выведите упорядоченный список целых чисел, которые находятся в буфере после всех указанных вставок.
Это задача для игры в гольф, поэтому выигрывает самый короткий код.
Рекомендации по вводу
Вы можете взять входные списки, как считаете нужным. Примеры:
- Список пар:
[ [1,1], [2,4], [3,9], [4,16], [5,25]...]
- Список предметов и индексный список:
[1, 2, 3, 4, 5...], [1, 4, 9, 16, 25]
- Уплощенная:
[1, 1, 2, 4, 3, 9, 4, 16, 5, 25 ...]
- и т.п.
Вы можете предположить, что вход всегда содержит хотя бы один элемент и соответствующий индекс.
Контрольные примеры
Случай квадратов сверху:
[(1, 1), (2, 4), (3, 9), (4, 16), (5, 25), (6, 36), (7, 49), (8, 64)] -> [1, 2, 8, 7, 6, 5, 4, 3]
Я генерировал это случайно:
[(11, 9), (13, 14)] -> [11, 13]
[(1, 18), (11, 7), (3, 35), (16, 22)] -> [1, 11, 16, 3]
[(3, 16), (16, 37), (0, 28), (18, 24)] -> [3, 18, 0, 16]
[(7, 26), (8, 20), (11, 39), (1, 23), (17, 27)] -> [7, 8, 11, 1, 17]
[(15, 35), (17, 7), (16, 15), (1, 13), (2, 6), (11, 34)] -> [15, 17, 1, 2, 16, 11]
[(2, 13), (1, 20), (16, 25), (8, 21), (5, 2), (16, 37), (3, 0)] -> [2, 3, 8, 1, 16, 5, 16]
[(6, 20), (15, 15), (12, 26), (10, 27), (17, 13), (7, 18), (4, 16)] -> [6, 10, 17, 12, 7, 4, 15]
[(18, 9), (5, 34), (15, 4), (12, 29), (2, 5), (7, 0), (7, 10), (16, 38)] -> [18, 7, 15, 2, 16, 5, 7, 12]
[(0, 12), (12, 0), (4, 16), (15, 12), (6, 28), (8, 10), (11, 24), (0, 25)] -> [0, 11, 8, 6, 15, 0, 4, 12]
[(6, 12), (14, 13), (10, 33), (11, 35), (1, 3), (0, 28), (15, 27), (8, 10), (1, 2)] -> [6, 14, 10, 1, 11, 8, 15, 0, 1]
[(2, 29), (19, 30), (18, 17), (13, 3), (0, 21), (19, 19), (11, 13), (12, 31), (3, 25)] -> [2, 13, 3, 11, 0, 12, 19, 18, 19]
Реализация ссылок на Python3
def f(inputs):
# `inputs` is a list of pairs
buff = []
for item, index in inputs:
if len(buff) == 0:
buff.insert(0, item)
else:
insert_after = index % len(buff)
buff.insert(insert_after+1, item)
return buff
Ответы:
MATL ,
2422 байтаВвод - это матрица (с
;
разделителем строк), содержащая значения в первой строке и индексы во второй.Выходные данные - это массив столбцов, отображаемый в виде чисел, разделенных символами новой строки.
Попробуйте онлайн! Или проверьте все тестовые случаи , каждый результат отображается в одной строке.
объяснение
источник
Perl, 37 байт
35 байтов кода + 2 байта для
-lp
флагов.Попробуйте онлайн!
Реализация довольно проста,
splice
вставка в массив@F
по индексу1+<>%(@F||1)
(обратите внимание, что@F||1
обрабатывает случай, когда массив пуст).Несколько слов о (казалось бы) непревзойденных фигурных скобках
}{
(потому что у меня был комментарий по этому поводу, и я думаю, что это довольно странно для людей, которые не знают Perl), и это довольно распространенная уловка в Perl-гольфах:-p
флаг окружает код с (примерно)while(<>){ CODE } continue { print }
, (continue
выполняется после каждой итерации). Так что с теми , кто не имеет себе равных}{
, я изменяю свой код наwhile(<>) { CODE}{ } continue { print }
. Таким образом, он создает пустой блок сразу после моего кода (но это не проблема), иcontinue
выполняется только один раз, послеwhile
(то есть, когда все входные данные были прочитаны).источник
}{
сводит меня с ума ...}{
напоминает мне об этой иллюзииES6 (Javascript),
58,57,53, 50 байтовGolfed
Принимает массив пар индекс-значение в качестве входных данных.
редактирует
&&
для возврата значения, -1 байт|0
(поскольку сплайс, видимо, может хорошо обрабатывать NaN), -2 байтаb=[]
второй «аргумент» для map () , -2 байта (Thx @ETHproductions!)Тест
источник
a=>a.map(e=>...,b=[])&&b
e=>
к(e,i)=>
и используяi
вместоb.length
Haskell ,
7069 байтовПопробуйте онлайн! Использование:
foldl(!)[] [(1,5),(2,4),(3,7)]
. Сохранено один байт благодаря @nimi!Объяснение:
Решение без вычисления модуля: (90 байт)
Попробуйте онлайн!
источник
j<-1+i`mod`length b
сохраняет байт.Python 2 ,
64625856 байтСпасибо @xnor за 2 байта!
Попробуйте онлайн!
источник
(len(x)or 1)
вместо инициализации длины?len(x or[0])
и другое-~len(x[1:])
.Python 2 ,
6260 байтПринимает ввод в виде списка пар, печатает результат. Редактировать: Outgolfed Деннис
Попробуйте онлайн!
Это довольно просто - переберите ввод, вставьте элементы в правильное место, а затем напечатайте результат. Решение о том, в какой индекс вставить, делается
1+y%(len(b)or 1)
. Это стандартный способ модульной индексации сor 1
обработкой края пустого списка.источник
JavaScript (ES6), 60 байт
Тестовый фрагмент
Показать фрагмент кода
источник
V ,
384035 байтЭтот ответ отклоняет определение списка и обычно не является языком, который вы бы использовали для манипулирования списком, но я хотел использовать тот,
[count]/{regex}
который недавно добавил в V. Ввод принимается как[index] [num] [index] [num] ...
и возвращается как[num] [num] [num]
.Попробуйте онлайн!
Hexdump для 2 скрытых персонажей:
объяснение
Код для
dG@"
форматирования всех\d+ \d+
пар, так что список 1 2 3 4 5 6 будет выглядеть каки затем
dG@"
выполняет все это как V-код, как показано ниже:источник
PHP,
7292 байтапринимает ввод, сплющенный из аргументов командной строки. Беги с
-nr
.источник
Fatal error: Uncaught DivisionByZeroError: Modulo by zero
, исправил это, затем попытался1 1 1 2 1 3
и получил[1=>null]
как вывод вместо[1,3,2]
j+1
а не вставляет послеj
, нет?18 1 7 11 35 3 22 16
=>[1,11,16]
а не[1,11,16,3]
insert
ключевое слово. Благодарность; исправлено.Java 7,
125124 байтаПринимает плоский список значений, за которым следуют индексы. Для теста квадраты вход будет
new int[] {1, 2, 3, 4, 5, 6, 7, 8, 1, 4, 9, 16, 25, 36, 49, 64}
Попробуйте онлайн!
источник
Mathematica, 62 байта
Чистая функция с первым аргументом
#
должна быть списком пар. Начиная с пустого списка{}
, оставляемFold
список ввода#
со следующей функцией:источник
Perl 6 , 51 байт
Принимает сплющенный ввод.
источник
Clojure, 87 байт
источник