Учитывая ввод списка положительных целых чисел, некоторые из которых заменены на 0
, выведите список с отсутствующими числами, которые были заменены на 0
замененные.
Характеристики входного списка:
Список всегда будет иметь длину не менее 2.
Давайте определим входной список как
a
и «исходный список» (то есть список до того, как числа были заменены на0
s) какb
. Для любогоn
,a[n]
либоb[n]
или0
.Для любого
n
,b[n]
либоb[n-1] + 1
илиb[n-1] - 1
. То есть числа вb
будут всегда меняться1
на каждый индекс по сравнению с его предыдущим. Первый элемент, конечно, освобожден от этого правила.Для каждого прогона нулей в
a
(то есть, последовательные элементы заменен0
), сx
представляющим индексом начала цикла иy
представляющим конца,a[x-1]
чтобыa[y+1]
всегда быть либо только увеличение или уменьшение исключительно. Следовательно, будет только один возможный способ заполнить нули.- Это также означает, что ни первый, ни последний элемент массива не могут быть нулями.
Проще говоря, чтобы заполнить ряд нулей, просто замените его диапазоном от числа до до числа, следующего за ним. Например, ввод
1 2 0 0 0 6 7
должен выводить
1 2 3 4 5 6 7
Поскольку это код-гольф , победит самый короткий код в байтах.
Тестовые случаи:
In Out
-----------------------------------------------------
1 0 0 0 5 6 0 4 0 0 1 | 1 2 3 4 5 6 5 4 3 2 1
7 6 0 0 3 0 0 0 7 0 5 | 7 6 5 4 3 4 5 6 7 6 5
1 0 3 0 5 0 3 0 5 0 7 | 1 2 3 4 5 4 3 4 5 6 7
14 0 0 0 0 0 0 0 0 23 | 14 15 16 17 18 19 20 21 22 23
источник
0
наша программа могла принимать другое значение, напримерnull
?0
.Ответы:
JavaScript (ES6),
72 66 64 5453 байтаСохранено 12 байтов благодаря @Neil!
Сохранено 1 байт благодаря @IsmaelMiguel
Довольно хорошо для JavaScript.
Попробуйте онлайн (все браузеры работают)
объяснение
источник
a.find((q,r)=>r>i&&q)>b?++b:--b
это так же, какb+=a.find((q,r)=>r>i&&q)>b||-1
MATL , 11
12байтРаботает с текущей версией (13.0.0) языка / компилятора.
Попробуйте онлайн!
источник
Haskell,
686158 байтПример использования:
g.filter(>0) $ [7,6,0,0,3,0,0,0,7,0,5]
->[7,6,5,4,3,4,5,6,7,6,5]
.Как это работает: уберите нули с входа, затем позвоните
g
. Позвольтеa
быть первым, аb
затем вторым элементом оставшегося списка. Объедините спискиa
сверху внизb-1
и снизу вверх (один из них будет пустым) и рекурсивный вызов с отброшенным.a
b+1
a
Редактировать: @Zgarb сохранил 3 байта. Благодарность!
источник
Mathematica, 59 байт
Прецедент
источник
Perl,
4745443937 байтВключает +1 для
-p
Ожидает список на stdin. Пример: echo 1 0 3 0 1 | perl -p file.pl
источник
Желе,
1211 байтПопробуйте онлайн!
Альтернативная версия, 8 байт (не конкурирует)
К сожалению,
pop
в последней версии, предшествующей этой проблеме , Jelly's не был приведен к повторяемости. Это было исправлено, и в текущей версии работает следующее.Попробуйте онлайн!
Как это работает
В альтернативной версии
ḢWW;
становится ненужным. Однако, поскольку первый элемент приводится к повторяемости перед извещением, он фактически не изменяется. ФиналḊ
удаляет дубликат первого элемента.источник
Сетчатка,
393431 байт3 байта сохранены благодаря @Martin.
Принимает ввод и выдает вывод в унарном виде.
Код итеративно заполняет каждое пустое место (0)
previous_number - 1 + 2 * if_next_nonzero_number_bigger
.previous_number - 1
есть$1
иif_next_nonzero_number_bigger
есть$3
.С десятичным вводом / выводом код имеет длину 51 байт, как вы можете видеть в онлайн-интерпретаторе со всеми тестовыми примерами .
источник
1
в предпросмотре.GNU Sed (с
exec
расширением, использующим bash), 61Оценка включает в себя +1 для
-r
опции для sed.0
s и заменить их..
{1..4}
для локальных конечных точек. Прелесть расширений bash-скобок здесь в том, что сгенерированная последовательность всегда будет идти в правильном направлении, независимо от того, больше ли начало или конец.e
опциюs
команды, чтобы вызвать bash, чтобы оценить это расширение скобки0
найдены какие-либо другие s, вернитесь к началу.Ideone.
источник
Python 2,
195111 байтов (спасибо, Алекс !)Входные данные: должны быть
[list]
целыми числамиВыходные данные:
[list]
целыми числамиисточник
Perl,
8582 байтавключает +1 для
-p
Ожидает список на stdin. Пример:
echo 1 0 3 0 1 | perl -p file.pl
.Это использует вложенное регулярное выражение. Несколько читабельно:
источник
Python 2,
9288 байт(Удалена промежуточная переменная)
источник
Pyth, 17 байт
Как это работает:
Другими словами: все нули удаляются из входных данных, затем исключительный диапазон вставляется между каждым элементом. Этот диапазон имеет нулевую длину для элементов, находящихся только на расстоянии друг от друга.
источник
05AB1E , 3 байта (не конкурирующие)
Эта функция была добавлена после испытания. Код:
Объяснение:
Попробуйте онлайн! или проверьте все контрольные примеры!
источник
Vim: 231 команда клавиш
Обратите внимание, что любой ^ перед символом означает, что вы должны держать контроль при наборе этого символа
Шаги, чтобы вы могли запустить это тоже!
:s/\^V/<Ctrl-V><Ctrl-V>/g
и нажмите ввод (две буквы должны дать вам синее ^ V):s/\^R/<Ctrl-V><Ctrl-R>/g
и нажмите Enter (вы должны увидеть синий ^ Rs сейчас):s/\^X/<Ctrl-V><Ctrl-X>/g
и нажмите ввод (вы должны увидеть синие ^ X сейчас):s/\^O/<Ctrl-V><Ctrl-O>/g
и нажмите ввод:s/\^A/<Ctrl-V><Ctrl-A>/g
и нажмите ввод:s/\^\[/<Ctrl-V><Ctrl-[>/g
и нажмите enter (эта команда немного отличается, потому что мне нужно было выйти из [)0"yy$
. Команда теперь хранится в регистре y@y
Если кто-то знает лучший способ поделиться командой, пожалуйста, дайте мне знать. Я знаю, что это долго, но это лучшее, что я мог придумать.
Ввод, вывод
Входная строка должна быть одна на любой строке в файле. 1 0 0 4 3 0 0 0 7
Выходные данные просто перезапишут входную строку 1 2 3 4 3 4 5 6 7
объяснение
Алгоритм
Используемые макросы
@e - Проверить конец. К последнему номеру будет добавлена электронная почта. Если число под курсором имеет значок e в конце, удалите его и остановите выполнение. В противном случае начните цикл интерполяции с @b.
@b - начать цикл интерполяции. Сохраните число под курсором для операции вычитания (@s), а затем найдите следующий ненулевой член (@f)
@s - Сохраняет команду вычитания для использования в @d. Это просто
(val)^X
где(val)
находится число в начале шага интерполяции. Это устанавливается командой @b.@f - Найти следующий ненулевой член. Запишите текущее значение в безымянный регистр, затем напишите
@f @d
в следующей строке и запустите @z. Это повторит эту команду, если число равно нулю, и выполнит @d, если это не так.@z - Условное выполнение, если безымянный регистр равен 0. Эта команда ожидает две команды в новой строке в формате
command1 command2
. Если безымянный регистр равен 0,command1
выполняется, в противном случаеcommand2
выполняется. Обратите внимание, что ни одна из команд не может содержать пробелов.@t - Временный регистр команд. Сохраняет различные команды в течение короткого времени перед их выполнением. Используется в основном в операторах if.
@d - определить направление интерполяции. Вычитает первое число в последовательности из числа под курсором (используя @s). Если результат отрицательный, интерполяция должна уменьшаться, поэтому ^ X сохраняется в @a. В противном случае мы должны увеличить значение, чтобы ^ A было сохранено в @a. Как только это будет сохранено, вернитесь к началу этого цикла интерполяции и запустите @i для фактической интерполяции.
@a - магазины либо
^A
или^X
для увеличения или уменьшения на стадии интерполяции. Это устанавливается командой @d.@i - интерполировать. Скопируйте номер в текущем местоположении в @x и перейдите к следующему номеру. Если это число равно нулю, замените его на @x и запустите @a, чтобы правильно изменить его вверх или вниз, затем повторите эту команду. Если число не ноль, мы достигли конца этого цикла интерполяции. Новый должен начинаться с этого номера в качестве начала, поэтому запустите @e, чтобы проверить конец, и снова запустите.
@x - регистр временного хранения. Используется в команде интерполяции (@i)
Сломать нажатия клавиш
источник
Python 3.5, 159 байт
рекурсивное решение
Ungolfed
В решении для гольфа я заменяю условия, используя тот факт, что
h*True=h
иh*False=[]
Результат
источник
Perl 6 , 54 байта
источник
MATLAB,
393837 байтАнонимная функция, которая линейно интерполирует между точками в
a
.find(a)
является массивом индексов ненулевых элементов вa
иa(a>0)
являются положительными значениями. Сохранено 1 байт благодаря предложению друга,>
а не~=
.источник