Вдохновленный этим ТАКИМ вопросом
В качестве входных данных вам будет дан непустой список целых чисел, где первое значение гарантированно будет ненулевым. Чтобы построить вывод, перейдите от начала списка, выводя каждое ненулевое значение по пути. Когда вы встретите ноль, вместо этого повторите значение, которое вы недавно добавили в вывод.
Вы можете написать программу или функцию и иметь ввод / вывод в любом удобном формате, который не кодирует дополнительную информацию, если это все еще упорядоченная последовательность целых чисел. При выводе из программы вы можете напечатать завершающий символ новой строки. За исключением этой завершающей новой строки, ваш вывод должен быть приемлемым вводом для вашего представления.
Самый короткий код в байтах побеждает.
Тестовые случаи
[1, 0, 2, 0, 7, 7, 7, 0, 5, 0, 0, 0, 9] -> [1, 1, 2, 2, 7, 7, 7, 7, 5, 5, 5, 5, 9]
[1, 0, 0, 0, 0, 0] -> [1, 1, 1, 1, 1, 1]
[-1, 0, 5, 0, 0, -7] -> [-1, -1, 5, 5, 5, -7]
[23, 0, 0, -42, 0, 0, 0] -> [23, 23, 23, -42, -42, -42, -42]
[1, 2, 3, 4] -> [1, 2, 3, 4]
[-1234] -> [-1234]
источник
[0,0]
?[1,01]
? Используя ответ Исаака Пита, сравните это и это .01
не является допустимым целым числом во входных данных Pyth, поэтому isaac не должен это учитывать. Другие ответы могут принимать входные данные, если они этого хотят, только до тех пор, пока они непротиворечивы (например, как ответ Исаака никогда не выдаст этот список в качестве выходных данных)Ответы:
Pyth, 6 байт
демонстрация
m ... Q
означает, что это отображает функцию на входе. Функция привязывается являетсяJ|dJ
. Это означаетJ = d or J
в Python, посколькуJ
при первом использовании присваивается следующее значение: В отличие от Python, выражения присваивания возвращают значение, назначенное в Pyth, поэтому карта возвращает каждое последующее значение поJ
желанию.источник
Желе неконкурентоспособное
3 байта Этот ответ не является конкурирующим, поскольку он использует функции, которые устарели.
Попробуйте онлайн!
Как это работает
источник
Рубин, 25 байт
Это на самом деле действительно зло.
В частности, фрагмент
x==0 ? a : (a=x)
.Если бы я использовал любое другое имя переменной для
a
(предыдущее ненулевое значение) - скажем, - яy
должен был бы объявить его внеmap
(потомуy=x
что имел бы только область внутри этой единственнойmap
итерации). Это будет использовать четыре символа больше (y=0;
).Но если я использую имя переменной
a
... да, вы догадались. Я фактически переназначаю аргумент, который мы получили в качестве входных данных (исходный массив).map
не волнует, потому что он заботится только о первоначальной ценности того, к чему он призван, так что это на самом деле работает.источник
Haskell, 21 байт
Созданная нами (анонимная) функция находится в последней строке. Первые две строки определяют вспомогательную функцию.
Двоичная функция
%
выводит второй аргумент, если это не так0
, и в этом случае она выводит первый аргумент.scanl1
выполняет итерации этой функции по списку ввода, выводя результат на каждом шаге.источник
J, 8 байт
Это унарная функция, вызываемая следующим образом.
объяснение
источник
{:@(#~|)\
так на один байт длиннее.Сед, 8
/^0$/
соответствует нулю в строке - если это так,g
копирует пространство удержания в пространство шаблонаh
копирует пространство образца в пространство удержанияЦелые числа разделены новой строкой. например:
источник
Javascript ES6, 19 байт
Простое решение, переберите ввод, присвойте
p
текущему элементуi
илиp
еслиi
есть0
и выведите его.Пример выполнения (назначение анонимной функции
f
):источник
Сетчатка , 15 байт
Попробуйте онлайн.
Повторно заменяет число, за которым следует ноль, вдвое больше, пока строка не перестанет меняться.
источник
Dyalog APL,
12109 байтовВдохновленный ответом @ Zgarb's J.
Попробуй это здесь .
источник
Pyth, 8 байт
Использует
.u
(кумулятивное уменьшение) на|
(Pythonor
), с базовым регистром 0.источник
.u
это дольше, даже еслиJ
иK
связаны. Это когда-нибудь оптимально?Python 2, 29 байт
Принимает данные в виде чисел, заданных по одному на строку, и выводит их в том же формате. Завершается с ошибкой после окончания.
Используя короткое замыкание
or
, переменнаяx
обновляется на входе, если только этот вход не равен 0 (что является Falsey), и в этом случае он остается его текущим значением. Затемx
печатается. Обратите внимание, что, поскольку первое значение списка ненулевое,x
оно не оценивается в правой части, прежде чем оно будет присвоено.источник
#\nJ|EJ
Mathematica 38 байт
Сопоставление
...a,0,...
с образцом многократно заменяется на...a,a...
источник
Матлаб, 41
46байтЭто вдохновлено моим первоначальным ответом со следующими отличиями:
nonzeros
.0
.Спасибо Тому Карпентеру за пункт 4 и за его предложение использовать программу вместо функции; вместе они позволили уменьшить 5 байтов.
Пример:
источник
x=input('')
вместо объявления функции иdisp(u(t)
вместоy=
бита. Кроме того, вы можете сохранить еще четыре байта, избавившись отt
переменной, получивx=input('');u=x(~~x);disp(u(cumsum(~~x)))
41@(x)x(~~x)(cumsum(~~x))
работает в Октаве.Gol> <> , 8 байт
Ввод и вывод - числа, разделенные новой строкой.
Объяснение:
Попробуйте это онлайн здесь.
источник
Japt
87 байтДовольно просто Принимает ввод через запятую. Попробуйте онлайн!
Неуправляемый и объяснение
Неконкурентная 4-байтовая версия: (
å
команда и!
-auto-function добавлены после вызова)Объяснение:
Попробуйте онлайн!
источник
ª
скорее ИЛИ, чемº
? Естьº
и случайно?º
есть((
. Они были назначены по значению Unicode, так как я нашел в них необходимость: Pª
nd иº
r гениальны, хотя, я мог бы использовать это для Japt 2.0 ...Ява, 78
Здесь мы просто следим за последними ненулевыми значениями и добавляем их в случае необходимости. Похоже, очевидный способ сделать это.
источник
Пролог (SWI) , 54 байта
Попробуйте онлайн!
объяснение
Я действительно счастлив с этим ответом.
Сначала мы говорим, что пустой список - это решение пустого списка:
Тогда мы говорим, что
[X,X|Y]
это решение[X,0|T]
, если путем удаления второй записи каждого из оставшихся решений.Наконец, мы говорим, что любая оставшаяся вещь действительна, если они начинаются с одного и того же значения, а остальные два списка соответствуют друг другу.
Если это объяснение не работает для вас, вот код, переведенный на Haskell:
Попробуйте онлайн!
источник
GolfScript, 10 байт
Эта программа принимает входные данные из stdin в форме литерала массива GolfScript (например,
[1 0 2 0]
) и записывает свои выходные данные в стандартный вывод (например,[1 1 2 2]
).Попробуйте онлайн.
Функция (принимающая и возвращающая массив GolfScript) будет на три байта длиннее из-за необходимости обернуть ее в блок и назначить ее символу:
Конечно, если подсчитывается только тело функции (то есть
[{1$or}*]
), то я могу фактически сохранить один байт по сравнению с автономной программой.источник
Минколанг 0,14 ,
1210 байтПопробуй это здесь. Ввод может быть дан как в вопросе, но без скобок .
объяснение
Минколанг тороидален, поэтому он вращается вокруг начала и продолжает движение, пока не достигнет
.
и не остановится.источник
𝔼𝕊𝕄𝕚𝕟, 7 символов / 12 байтов
Try it here (Firefox only).
объяснение
источник
O , 31 байт
Это берет вход, разделенный
,
и выводит тот же список в[]
.Объяснение:
17 байт
Вводит в виде списка чисел, разделенных пробелами, используя постфиксную нотацию и может обрабатывать только однозначные шестнадцатеричные числа Негативы с постфиксом
_
.Объяснение:
источник
I~]{n.{:V}{;V}?}d
. Интересно, стоит лиd
просто поместить значение в стек вместоn
...-42
, но она добавляет скобки вокруг вывода.R,
393733 байтаЭто безымянная функция, которая принимает вектор и возвращает вектор. Требует установки
zoo
пакета. Обратите внимание, что он не требуетzoo
привязки к пространству имен, поскольку мы ссылаемся на него напрямую.Название этой операции в мире статистики - вменение LOCF, где LOCF означает «Последнее наблюдение перенесено». Чтобы сделать это в R, мы можем использовать
na.locf
изzoo
пакета, который заменяетNA
значения последним известным ненулевымNA
значением. Мы просто должны заменить нули на входеNA
сначала s.Для этого мы используем
x|NA
, который будет,TRUE
когдаx != 0
и вNA
противном случае. Если мы умножим это наx
,TRUE
элементы будут заменены соответствующими элементами,x
иNA
s останутсяNA
, тем самым заменив все нули. Затем это передается,zoo::na.locf
что дает нам именно то, что мы хотим.Сохранено 4 байта благодаря flodel!
источник
Ржавчина, 100 байт
Наткнулся на этот вызов, подумал, что попробую на моем любимом языке. Попробовал использовать
[T]::windows_mut()
сначала, прежде чем выяснить, что его не существует . И это могло бы быть на самом деле дольше, чем это. Так или иначе, оказывается, что игра в гольф Rust очень уродлива и очень неконкурентоспособна (особенно со всей этой ужасной эзотерикой!) 1Новая строка не включена в bytecount; это только там, так что вам не нужно прокручивать вбок. Это не меняет смысла кода.
Ungolfed:
[1] По крайней мере, это не так плохо, как Java.
источник
public static void main
шаблон…Млечный Путь 1.2.1 , 33 байта
Это предполагает, что список целых чисел находится исключительно в стеке.
объяснение
источник
Юлия, 33 байта
Это функция,
g
которая принимает массив и возвращает массив. Мы начинаем временную переменнуюa
в 0. Для каждого элементаi
входа, еслиi
не 0 , то мы относимa
кi
. Еслиi
0,a
не меняется на этой итерации. Мы используемa
в качестве значения в этой позиции в выходном массиве.источник
Perl 6 , 21 байт
использование:
источник
R, 36 байт
Давайте посмотрим, как это работает, используя
x=
В качестве примера. Здесь
!!x
будет логический (True / False) вектор:Кроме того,
seq(a=x)
дает вектор индексов, покаx
:Мы умножаем оба, давая:
Мы берем совокупный максимум:
Наконец, мы используем этот последний вектор в качестве индексов для извлечения из
x
:источник
CJam, 11 байт
Попробуйте онлайн.
Как это работает
источник
Powershell, 32 байта
$x|%{...}
блокирует скрипт для каждого элемента в$x
.($_,$t)
является массивом текущего элемента и$t
, и[!$_]
означает, что мы используем!$_
для индексации в массиве. Индекс будет0
(false) для ненулевых элементов и1
(true), когда текущий элемент равен нулю, поэтому$t
будет либо текущий элемент, либо$t
. Круглые скобки окружают выражение присваивания, поэтому его значение выводится. Без паратезов это было бы просто «тихим» заданием$t
.источник
param($x)
что превращает это в программу. Вывод представляет собой набор целых чисел, которые вы можете передать в качестве параметра в программу, например,$a = .\program.ps1 1,2,3,4,0,0,5
и затем.\program.ps1 $a
работать как положено.$args|%{($p=($_,$p)[!$_])}
- 26 байтов, используя $ args.Japt , 3 байта
Попытайся
источник