Введение
Некоторые из вас, возможно, слышали о Гранд Отеле Гильберта . Менеджер там потерял свой список того, где находятся гости, но у него все еще есть порядок, в котором они зарегистрировались. Каждый гость не может оставаться в комнате с номером комнаты, который меньше их стоимости, и если гость добавлен к более низкому комната, все гости в более высоких комнатах без свободного места между ними и новым гостем перемещаются на одну комнату. Можете ли вы помочь ему найти, где каждый из гостей остановился?
Требования
Напишите программу, которая получает упорядоченный список натуральных чисел в качестве входных данных и помещает их в свой индекс. Если в этом индексе уже есть значение, оно перемещается к следующей записи в списке. Этот процесс повторяется до тех пор, пока не будет найдено первое пустое (0 или неопределенное) пространство. Любые неопределенные пробелы между текущим самым высоким индексом и любым новым вводом будут заполнены добавлением 0. Поскольку это Гранд-отель Гильберта, номеров, превышающих текущий самый высокий индекс занятости, не существует.
Вход и выход
На входе будет упорядоченный список натуральных чисел (разрешено читать через любую принятую форму ввода).
Каждый номер на входе считается одним гостем, прибывающим в отель, и находится в порядке прибытия
На выходе будет окончательное расположение гостей (номера)
Примеры
Вход: 1 3 1
Выход: 1 1 3
Шаг за шагом:
1
Создайте комнату с индексом 1 и поместите в нее
1 1 3 3
Создайте комнаты с индексом 3 и поместите 3 в комнату 3
1 1 3
Сдвиньте содержимое комнаты 1 вверх одна комната и место 1 в комнате 1Вход: 1 4 3 1 2 1
Выход : 1 1 2 1 3 4
Шаг за шагом:
1
Создайте комнату с индексом 1 и поместите в нее
1 1 0 0 4
Создайте комнаты с индексом 4 и поместите 4 в комнату 4
1 0 3 4
Поместите 3 в комнату 3
1 1 3 4
Поменяйте содержимое комнаты 1 на одну комнату и поместите 1 в комнату 1
1 2 1 3 4
Поменяйте содержимое комнаты 2 на 4 на одну комнату и поместите 2 в комнату 2
1 1 2 1 3 4
Поменяйте содержимое комнат с 1 по 5 на одну комнату и поместите 1 в комнату 1Вход: 10
Выход: 0 0 0 0 0 0 0 0 0 0 10
Шаг за шагом:
0 0 0 0 0 0 0 0 0 10
Создайте комнаты до комнаты 10 и поместите 10 в комнату 10Примечания:
Работа с индексированными 0 - это нормально, и в этом случае вы можете вставить 0 в начало вывода
Стандартные лазейки запрещены, выигрывает самый короткий код в байтах
источник
PHP 93 байта
0 проиндексировано. Использует цикл 2 в 1, который ищет следующего гостя после того, как он получает 0 (или нулевую форму, выходящую за пределы текущей последней комнаты). Используйте как:
Ungolfed:
источник
Haskell , 107 байт
Попробуйте онлайн!
источник
JavaScript (ES6),
144120 байтЭкономия 20B благодаря Арно и 11B благодаря Нейлу
использование
Вы можете назначить функцию переменной,
f
и список должен быть представлен в виде массива. Пример:Выход
Вывод также в массиве. Поскольку Javascript работает с нулевым индексом, есть дополнительный 0 в начале.
источник
(c+'').split`,`.map(Number)
сделать работу?c.map(n=>n|0)
а не(c+'').split`,`.map(Number)
.map()
вообще не выполняется итерация для неопределенных значений в массиве. (Тем не менее, я уверен, что есть более короткий путь, чем тот, который я предложил.)JavaScript (ES6), 86 байт
Лидирующий ноль в результате, потому что JavaScript индексируется 0.
источник
Mathematica, 98 байт
Безымянная функция, принимающая список натуральных чисел и возвращающая 0-индексированный список целых чисел. Вся
If
функция принимает частично заполненный список и следующее целое число для вставки в качестве аргументов. Если следующее целое число превышает длину частичного списка, соответственноPadRight@##~Append~#2
увеличивает частичный список; в противном случаеJoin[Take@##,{#2},Drop@##/.{a___,0,b__}->{a,b}]]
вставляет следующее целое число в свою позицию, а затем выбрасывает первое0
найденное после него.Fold[...,{0},#]
повторно применяет эту функцию к исходному списку, начиная с пустой гостиницы{0}
, и выводит окончательный список гостиниц.источник
JavaScript (ES6), 81
Использование индексации 0
Меньше гольфа
Тест
источник
R 133 байта
Чтобы избежать проблем с плохой индексацией, я дополняю нулями, а затем в конце убираю их. Возможно, это не лучшее решение, но оно работает.
источник
Python,
134125116 байтДействительно как для Python 2.7.13, так и для 3.6.0. Этот код функционирует посредством замены удерживаемого значения на значение, содержащееся в каждом индексе, пока удерживаемое значение не станет равным 0. Если он достигает индекса, еще не находящегося в массиве, он добавляет нули в конец массива, пока массив не содержит показатель. Спасибо Wheat Wizard и xnor за игру в гольф по 9 байт каждый
источник
while
иif
не нужны парены. Вы можете поместить несколько операторов в одну строку, разделенные;
одинаковыми,if(i<d):r.extend([0]*(d-i));i=d
если в последующих операторах нет потока управления.