Список чисел называется монотонно увеличивающимся (или неубывающим), если каждый элемент больше или равен элементу перед ним.
Например, 1, 1, 2, 4, 5, 5, 5, 8, 10, 11, 14, 14
монотонно увеличивается.
Учитывая монотонно растущий список положительных целых чисел, который имеет произвольное количество пустых пятен, обозначаемых как ?
, заполните пустые места положительными целыми числами так, чтобы в списке присутствовало как можно больше уникальных целых чисел, но он остается монотонно увеличивающимся.
Там может быть несколько способов сделать это. Любое действительно.
Выведите итоговый список.
Например , если вход
?, 1, ?, 1, 2, ?, 4, 5, 5, 5, ?, ?, ?, ?, 8, 10, 11, ?, 14, 14, ?, ?
гарантируется, что без пустых мест список будет монотонно увеличиваться
1, 1, 2, 4, 5, 5, 5, 8, 10, 11, 14, 14
и ваша задача состоит в том, чтобы назначить положительные целые числа каждому,
?
чтобы максимизировать число различных целых чисел в списке, сохраняя его неубывающим.Одно задание , которое является не действительным является
1, 1, 1, 1, 2, 3, 4, 5, 5, 5, 5, 5, 5, 5, 8, 10, 11, 14, 14, 14, 14, 14
потому что, хотя оно не уменьшается, у него есть только одно уникальное целое число, а не входное, а именно
3
.В этом примере можно вставить шесть уникальных натуральных чисел и сохранить список неубывающим.
Пара возможных способов:1, 1, 1, 1, 2, 3, 4, 5, 5, 5, 6, 7, 8, 8, 8, 10, 11, 12, 14, 14, 15, 16 1, 1, 1, 1, 2, 3, 4, 5, 5, 5, 5, 6, 6, 7, 8, 10, 11, 13, 14, 14, 20, 200
Любой из этих (и многих других) будет правильным выводом.
Все пустые места должны быть заполнены.
Не существует верхнего предела для целых чисел, которые можно вставить. Это нормально, если в научной записи напечатаны очень большие целые числа.
Ноль не является положительным целым числом и никогда не должен вставляться.
На месте ?
вы можете использовать любое приемлемое значение, которое не является положительным целым числом, например 0
, -1
, null
, False
, или ""
.
Самый короткий код в байтах побеждает.
Больше примеров
[input]
[one possible output] (a "*" means it is the only possible output)
2, 4, 10
2, 4, 10 *
1, ?, 3
1, 2, 3 *
1, ?, 4
1, 2, 4
{empty list}
{empty list} *
8
8 *
?
42
?, ?, ?
271, 828, 1729
?, 1
1, 1 *
?, 2
1, 2 *
?, 3
1, 3
45, ?
45, 314159265359
1, ?, ?, ?, 1
1, 1, 1, 1, 1 *
3, ?, ?, ?, ?, 30
3, 7, 10, 23, 29, 30
1, ?, 2, ?, 3, ?, 4
1, 1, 2, 3, 3, 3, 4
1, ?, 3, ?, 5, ?, 7
1, 2, 3, 4, 5, 6, 7 *
1, ?, 3, ?, 5, ?, ?, 7
1, 2, 3, 4, 5, 6, 7, 7
1, ?, ?, ?, ?, 2, ?, ?, ?, ?, 4, ?, 4, ?, ?, 6
1, 1, 1, 1, 1, 2, 3, 4, 4, 4, 4, 4, 4, 5, 6, 6
98, ?, ?, ?, 102, ?, 104
98, 99, 100, 101, 102, 103, 104 *
источник
Ответы:
Haskell , 41 байт
f
берет список и возвращает список с 0, представляющим?
s.По сути, первый список сканирования слева, заменяя 0 на один больше, чем предыдущий элемент (или 0 в начале); затем отсканируйте справа, уменьшив слишком большие элементы, чтобы они равнялись значению справа.
Попробуйте онлайн! (с оберткой для преобразования
?
s.)источник
Mathematica, 84 байта
Функция Pure принимает список в качестве аргумента, где пустые места обозначаются
Null
(как в{1, Null, Null, 2, Null}
) или удаляется вообще (как в{1, , , 2, }
), и возвращает подходящий список (в данном случае,{1, 2, 2, 2, 3}
).Оказывается, я использую тот же алгоритм, что и в ответе Оркена Йохансена на Haskell : сначала замените каждый
Null
на единицу больше, чем число слева (//.{a___,b_,,c___}:>{a,b,b+1,c}
), а затем замените слишком большое число числом справа (//.{a___,b_,c_,d___}/;b>c:>{a,c,c,d}
). Чтобы разобраться с возможнымиNull
s в начале списка, мы начинаем с добавления a0
({0,##}&@@#
), выполняем алгоритм, затем удаляем initial0
(Rest
).Да, я выбрал
Null
вместоX
или что-то подобное, чтобы сохранить буквально один байт в коде (тот, который в противном случае был бы между запятымиb_,,c___
).источник
?, 2
. Я подозреваю, что вы бы тогда производили2, 2
вместо правильных1, 2
.С 160
Это никогда не победит, но:
Он берет список из аргументов командной строки.
источник
05AB1E ,
312313 байтСохранено 10 байтов благодаря Grimy
Попробуйте онлайн!
объяснение
источник
}}
могут]
сэкономить 2 байта; иõ-)R
можно)˜R
сохранить дополнительный байт.Пип ,
252321 байтПринимает ввод как несколько разделенных пробелом аргументов командной строки. Выводит список результатов по одному номеру в каждой строке. Попробуйте онлайн! (Я выдумал несколько аргументов командной строки, потому что было бы больно добавлять 25 аргументов в TIO, но это работает так, как рекламируется).
объяснение
Мы продолжаем в два прохода. Сначала мы заменяем каждый прогон
?
s во входных данных последовательностью, начинающейся с предыдущего числа в списке и увеличивающейся на единицу каждый раз:Затем мы повторяем цикл снова; для каждого числа мы печатаем минимум этого числа и все числа справа от него. Это приводит к слишком высоким числам, чтобы сохранить монотонность.
источник
Python 2 с NumPy, 163 байта
Сохранено 8 байт благодаря @wythagoras
Нули используются для обозначения пустых мест
Более читабельно с комментариями:
источник
if l[a]>l[b]:l[a]=l[b]
может быть,l[a]=min(l[a],l[b])
и тогда это может быть на линии до этого. Кроме того, это означает, что всю строку можно поставить послеwhile
. И я думаю,l=input()
иl=[1]+l
может бытьl=[1]+input()
(Кроме того, в целом: если вы используете два уровня отступа, вы можете использовать пробел и табуляцию вместо пробела и двух пробелов в Python 2 (см. Codegolf.stackexchange.com/a/58 ) )len(z)-i:f(z[i-1],z[i]);i+=1
когда начинается с i = 1.PHP,
9577716968 байтпринимает входные данные из аргументов командной строки, печатает разделенный пробелами список. Беги с
-nr
.сломать
$n
верно для любой строки, кроме пустой строки и"0"
.$n>0
верно для положительных чисел - и строк, содержащих их.источник
Perl 6 , 97 байт
Входные данные - это либо список значений, либо строка, разделенная пробелом, где
?
используется для замены значений, подлежащих замене.Выход - строка, разделенная пробелом, с завершающим пробелом.
Попытайся
Expanded:
источник
$"
вместо того,' '
чтобы брить байт. Это работает здесь?$!
. ($/
существует, но используется для$1
→$/[1]
и$<a>
→$/{ qw< a > }
)JavaScript (ES6), 65 байт
Потому что я хотел использовать
reduceRight
. Объяснение: Параметрmap
заменяет каждое ложное значение на единицу больше, чем предыдущее значение, затем выполняетreduceRight
обратное выполнение с конца, гарантируя, что никакое значение не превысит следующее значение.источник
Q, 63 байта
{1_(|){if[y>min x;y-:1];x,y}/[(|){if[y=0;y:1+-1#x];x,y}/[0,x]]}
По сути тот же алгоритм, что и в ответе Хаскелла Эрджана Йохансена .
Использование min vs last использовалось для сохранения одного байта, поскольку можно предположить, что последний элемент будет элементом min с учетом сортировки массива по убыванию.
источник
TI-Basic (TI-84 Plus CE), 81 байт
Простой порт ответа Хаскелла Эрджана Йохансена на TI-Basic. Использует 0 как нулевое значение. Принимает данные от L 1 .
Объяснение:
источник
Java 8,
199164 байтаИзменяет массив ввода вместо того, чтобы возвращать новый для сохранения байтов.
Использует
0
вместо?
.Попробуйте онлайн.
Объяснение:
источник
Python 2 ,
144124119 байтовПопробуйте онлайн!
Использует
0
вместо?
источник
b=filter(abs,l[n:])
равноb=l[n:]
?JavaScript (ES6), 59
Функция с целочисленным массивом в качестве входных данных. Пустые места отмечены
0
Тест
источник
C # (.NET Core) , 182 байта
Использую ту же стратегию, что и Орджан Йохансен.
Использует 0 в списке ввода, чтобы отметить неизвестную переменную.
Попробуйте онлайн!
источник
Perl 5
-p
, 99 байтПопробуйте онлайн!
источник