Взято из этого вопроса в Stack Overflow. Спасибо также @miles и @Dada за то, что они предложили тестовые материалы, которые касаются некоторых ключевых случаев.
Соревнование
Учитывая массив целочисленных значений, удалите все нули, которые не окружены некоторым ненулевым значением.
Эквивалентно, запись должна сохраняться либо в том случае, если она ненулевая, либо если это ноль, который непосредственно близок к ненулевому значению.
Сохраняемые записи должны сохранять в выходных данных порядок, в котором они находились.
пример
Данный
[2 0 4 -3 0 0 0 3 0 0 2 0 0]
значения, которые должны быть удалены, помечены x
:
[2 0 4 -3 0 x 0 3 0 0 2 0 x]
и поэтому вывод должен быть
[2 0 4 -3 0 0 3 0 0 2 0]
правила
Входной массив может быть пустым (и тогда вывод тоже должен быть пустым).
Форматы ввода и вывода, как обычно, гибкие: массив, список, строка или все, что разумно.
Код гольф, наименьшее количество лучших.
Контрольные примеры
[2 0 4 -3 0 0 0 3 0 0 2 0 0] -> [2 0 4 -3 0 0 3 0 0 2 0]
[] -> []
[1] -> [1]
[4 3 8 5 -6] -> [4 3 8 5 -6]
[4 3 8 0 5 -6] -> [4 3 8 0 5 -6]
[0] -> []
[0 0] -> []
[0 0 0 0] -> []
[0 0 0 8 0 1 0 0] -> [0 8 0 1 0]
[-5 0 5] -> [-5 0 5]
[50 0] -> [50 0]
источник
_2
вместо-2
? Многие языки используют этот формат.-0
?[010 0 0 01 1]
?Ответы:
JavaScript (ES6), 35 байт
Работает на поплавках тоже для двух дополнительных байтов.
источник
Python, 50 байт
Рекурсивная функция, которая принимает кортеж. Включает первый элемент, если среди первых двух элементов или предыдущего значения, сохраненного в прошлый раз, имеется ненулевое значение. Затем удаляет первый элемент и рекурсивно. Предыдущий элемент хранится в синглтон-списке
p
, который автоматически упаковывается в список и начинается как пустой (спасибо Деннису за 3 байта с этим).55 байтов:
Создает все фрагменты длины-3 из списка, сначала помещая нули в начало и конец, и берет элементы середины тех, которые не все равны нулю.
Итеративный подход оказался длиннее (58 байт)
Это не совсем работает, потому что
b,*l
нужен Python 3, но Python 3input
дает строку. Инициализация тоже безобразна. Возможно, подобный рекурсивный подход подойдет.К сожалению, метод индексации
не работает, потому что
l[-1:2]
интерпретируется-1
как конец списка, а не точка перед его началом.источник
Haskell,
5548 байтовПример использования:
h [0,0,0,8,0,1,0,0]
->[0,8,0,1,0]
.scanr
перестраивает входной списокx
с дополнительным0
в начале и конце. На каждом шаге мы сопоставляем 3 элемента и сохраняем средний, если есть хотя бы один ненулевой элемент.Спасибо @xnor за 7 байтов, переключившись с
zip3
наscanr
.источник
h x=[snd t|t<-zip3(0:x)x$tail x++[0],(0,0,0)/=t]
, но я думаю, что нет короткого способа получить второй элемент 3-кортежа.scan
чемzip3
:h x=[b|a:b:c:_<-scanr(:)[0]$0:x,any(/=0)[a,b,c]]
.Matlab,
2927 байтВходные данные должны состоять из
1*n
матрицы (гдеn=0
это возможно). (Это приведет к ошибке для0*0
матриц.)источник
's'
вместо'same'
<- :-D'UniformOutpout'
(понятно). Но я не знал об этом~~a
вместоa.*a
?logical
массивы. Это часто является проблемой для встроенных модулей, которые не написаны в самом Matlab. В противном случае логические массивы ведут себя во многом как числовые. Это может работать в мысли Октавы, но у меня не установлено в данный момент.J,
1714 байтСохранено 3 байта с помощью @ Zgarb.
использование
объяснение
Попробуй это здесь.
источник
0<
работать на месте0~:
?MATL , 8 байт
Выход - строка с числами, разделенными пробелами. Пустой массив на выходе отображается как ничто (даже не перевод строки).
Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
Код преобразует входные данные в логический тип, то есть ненулевые записи становятся
true
(или1
), а нулевые записи становятсяfalse
(или0
). Это тогда свернуто с ядром[1 2 3]
. Ненулевое значение вызывает ненулевой результат в этой позиции и в соседних позициях. Преобразование в логическое даетtrue
значения, которые должны быть сохранены, поэтому индексация ввода с тем, который производит желаемый результат.источник
Джольф, 14 байт
Теперь, когда я думаю об этом, Джольф - это Ява языков игры в гольф. вздохи Попробуй здесь.
объяснение
источник
Python 3, 55 байт
источник
Желе , 9 байт
Попробуйте онлайн! или проверьте все контрольные примеры .
Как это работает
источник
Perl, 34 + 1 (
-p
флаг) = 35 байтТребуется -p флаг для запуска. Принимает список номеров как вменяемый. Например :
источник
5
если я введу50 0
.Haskell, 48 байтов
Просматривает предыдущий элемент
p
, первый элементh
и элемент после (если есть), и, если они есть, отличны от нуля, добавляет первый элементh
.Условие
any(/=0)$p:h:take 1t
длительное, в частностиtake 1t
. Я буду искать способ сократить его, возможно, путем сопоставления с образцом.источник
Retina ,
423533 байта7 байтов благодаря Мартину Эндеру.
Последняя строка необходима.
Проверьте все тестовые случаи одновременно. (Немного изменен, чтобы запускать все тестовые сценарии одновременно.)
Похоже, идеальный язык для этого ... все еще побежден большинством ответов.
источник
Mathematica, 43 байта
источник
C 96 байтов
Вызов
f()
с указателем на список целых чисел и указатель на размер списка. Список и размер изменяются на месте.Попробуйте это на Ideone .
источник
f(int*p,int*n)
сохраняет байт. Или определитеs
в качестве третьего параметра (это не передается. Это нормально).Брахилог ,
4438 байтПопробуйте онлайн!
Этот язык хорош как доказательство того, что мы будем использовать.
Предикат 0 (основной предикат)
Предикат 1 (вспомогательный предикат)
источник
Matlab с инструментарием обработки изображений, 27 байт
Это анонимная функция.
Пример использования:
источник
imerode
тоже об этом думал , но мои версии продолжали быть длиннее, чем моя текущая, хорошая работа =)Утилиты Bash + GNU, 25
Принимает ввод как разделенный новой строкой список.
Ideone - с добавлением кода тестового драйвера для запуска всех тестовых сценариев путем преобразования в / из пробела и перевода строки.
источник
Чеддер , 78 байт
Тестирование.
У Cheddar нет фильтра, поэтому фильтрация выполняется путем обертывания нужных элементов и преобразования ненужных элементов в пустые массивы, а затем объединения всего.
Например,
[0,0,0,8,0,1,0,0]
становится[[],[],[0],[8],[0],[1],[0],[]]
, и тогда будет конкатенированный массив[0,8,0,1,0]
.источник
.reduce((+))
->.sum
APL, 14 байтов
Тест:
Объяснение:
0,⍵,0
: добавить ноль в начало и конец ⍵×3∨/
: найти знак GCD каждой группы из трех смежных чисел (это будет 0, если все они равны нулю, и 1 в противном случае).⍵/⍨
: выберите все элементы из ⍵, для которых результат был 1.источник
Ruby 2.x, 63 байта
Кредит, где это должно произойти, это - по существу порт превосходного ответа Нила ES6.
Это также моя первая подача pcg. ура.
источник
Brain-Flak 142 байта
Попробуйте онлайн!
объяснение
источник