Удалить начальные и конечные нули


31

Дан непустой список / массив, содержащий только неотрицательные целые числа, как это:

[0, 0, 0, 8, 1, 4, 3, 5, 6, 4, 1, 2, 0, 0, 0, 0]

Выведите список с удаленными конечными и начальными нулями.

Выход для этого будет:

[8, 1, 4, 3, 5, 6, 4, 1, 2]

Некоторые другие тестовые случаи:

[0, 4, 1, 2, 0, 1, 2, 4, 0] > [4, 1, 2, 0, 1, 2, 4]
[0, 0, 0, 0, 0, 0] > nothing
[3, 4, 5, 0, 0] > [3, 4, 5]
[6] > [6]

Самый короткий код выигрывает


Числа только неотрицательные целые числа? Я предлагаю вам уточнить это или добавить контрольные примеры с другими номерами
Луис Мендо

1
Можем ли мы предположить, что будет хотя бы один ведущий и один трейлинг 0?
DJMcMayhem

4
Что ничего не составляет? Я могу думать о нескольких разных вещах, которые в Perl 6 ни к чему не относятся. Nil ()/ [] slip()/ Empty Any {}Некоторые из них не определены, некоторые определены, но единичны, а некоторые попадаются в другие списки так, что они не увеличивают количество элементов. (Существует столько же разных вариаций, Anyсколько существует классов / типов и ролей)
Брэд Гилберт b2gills

7
Это совпадение, что нет целых чисел больше 10, или мы можем предположить, что все числа будут однозначными?
Симмонс

1
Можем ли мы ввести / вывести список в виде строки с разделителями? Например: "0,4,1,2,0,1,2,4,0" => "4,1,2,0,1,2,4"РЕДАКТИРОВАТЬ: только что заметил, что многие языки уже делают это.
Mwr247

Ответы:


25

Желе , 2 байта

Код:

t0

Объяснение:

t   # Trim off...
 0  #  zero at both sides

Попробуйте онлайн!


10
Это работает? Jeez. Я думал, что ответы MATL были безумными.
Skyl3r

4
wut y no don do dis jelly
Аддисон Крамп,

Конечно, Желе побеждает любого другого парня почти каждый раз ...
Эрик Outgolfer

Используется ли желе на реальных предприятиях?
Chromozorz

Человек, я надеюсь, нет
Калеб Пол

10

JavaScript (ES6) 43

a=>(f=a=>a.reverse().filter(x=>a|=x))(f(a))

Меньше гольфа

a=>{
  f=a=>a.reverse().filter(x=>a|=x) // reverse and remove leading 0
  // leverage js cast rules: operator | cast operands to integer
  // an array casted to integer is 0 unless the array is made of
  // a single integer value (that is ok for me in this case)
  return f(f(a)) // apply 2 times
}

Тест

F=a=>(f=a=>a.reverse().filter(x=>a|=x))(f(a))

function test(){
  var l=(I.value.match(/\d+/g)||[]).map(x=>+x)
  O.textContent=F(l)
}

test()
#I { width:90%}
<input id=I oninput='test()' value='0 0 1 3 7 11 0 8 23 0 0 0'>
<pre id=O></pre>


1
Ницца. f=(a,r=f(a,a))=>r.reverse().filter(x=>a|=x)также 43 байта.
Нил

6

CJam, 13 байтов

l~{_{}#>W%}2*

С введенным массивом.

Более длинная версия:

l~             Puts input on the stack and parse as array
  {       }    Code block
   _           Duplicate the first thing on the stack
    {}#        Finds the index of the first non-0 value in the array, puts it on the stack
       >       Slices the array from that index
        W%     Reverses the array
           2*  Does the code block twice in total

Хотелось бы использовать тот факт, что преобразование в базу и из нее приведет к удалению ведущих нулей, но, похоже, это слишком долго.
Esolanging Fruit

5

Pyth, 4 байта

.sQ0

Демо-версия:

llama@llama:~$ pyth -c .sQ0
[0, 0, 0, 1, 2, 0, 3, 4, 0, 0, 5, 0, 0, 0, 0]
[1, 2, 0, 3, 4, 0, 0, 5]

Из Pyth'srev-doc.txt :

.s <seq> <any>
    Strip from A maximal prefix and suffix of A consisting of copies of B.



5

R, 43 байта

function(x)x[cummax(x)&rev(cummax(rev(x)))]

или как читать / писать STDIN / STDOUT

x=scan();cat(x[cummax(x)&rev(cummax(rev(x)))])

Это находит совокупный максимум от начала и конца (перевернутая) строка. &Оператор преобразует эти два вектора в логической единицы одного и того же размера , как x, (нули всегда будут преобразованы в FALSEи все остальное , чтобы TRUE), таким образом , это делает возможным подмножество из в xсоответствии с условиями встречались.



4

Mathematica 34 27 байт

#//.{0,a___}|{a___,0}:>{a}&

Это постоянно применяет правила замены до тех пор, пока такое действие не сможет обеспечить новый вывод. 7 байтов сохранено благодаря Alephalpha.

Первое правило удаляет ноль в начале; второе правило удаляет ноль в конце массива.


3
#//.{0,a___}|{a___,0}:>{a}&
alephalpha 13.02.16


3

Perl, 19 + 1 = 20 байт

s/^(0 ?)+|( 0)+$//g

Требуется -pфлаг:

$ perl -pE's/^(0 )+|( 0)+$//g' <<< '0 0 0 1 2 3 4 5 6 0 0 0'
1 2 3 4 5 6

@ MartinBüttner Я, хотя примерно так же, как только после нажатия [Добавить комментарий], теперь мне просто нужно выяснить, чтобы позволить уценке сохранить мою новую
строку в

Через злые HTML хаки. ;)
Мартин Эндер

1
17 + 1 байт:s/^0 | 0$//&&redo
Кенни

@Kenney Это красиво :-) Вы должны опубликовать это как ответ!
andlrc

Благодарность! Мой оригинал был также 19 + 1 байт, но потом я увидел твой ответ, который дал мне идею побрить еще 2, так что он твой, если ты этого хочешь. Кстати, ваш ответ на самом деле 18 + 1, если вы опустите ?как в примере - но это не уменьшит "0"..
Кенни

3

Желе, 10 байт

Uo\U,o\PTị

Это не использует встроенный.

Uo\U            Backward running logical OR
    ,           paired with
     o\         Forward running logical OR
       P        Product
        T       All indices of truthy elements
         ị      Index the input at those values.

Попробуй это здесь .


3

Perl, 38 байт

$\.=$_}{$\=~s/^(0\n)*|(0\n)*\n$//gs

Запуск с perl -p, (добавлено 3 байта -p).

Принимает числа на STDIN, по одному на строку; генерирует числа в STDOUT, по одному на строку, как и должна делать утилита unix.

Только числа, представленные в точности как 0, как нули; можно было бы поддержать другие представления с помощью нескольких дополнительных байтов в регулярном выражении.

Более длинная версия, с которой еще предстоит работать -p:

    # append entire line to output record separator
    $\.=$_
}{
    # replace leading and trailng zeroes in output record separator
    $\ =~ s/^(0\n)*|(0\n)*\n$//gs
    # output record separator will be implicitly printed

Расширенная версия, показывающая взаимодействие с флагом -p:

# implicit while loop added by -p
while (<>) {
    # append line to output record separator
    $\.=$_
}{ # escape the implicit while loop
    # replace leading and traling 
    $\=~s/^(0\n)*|(0\n)*\n$//gs
    # print by default prints $_ followed by
    # the output record separator $\ which contains our answer
    ;print # implicit print added by -p
} # implicit closing brace added by -p

Предполагая, что вы работаете с perl -E, -pфлаг обычно считается только одним байтом, так как есть только один дополнительный байт, отличный от этого и perl -pE.
Крис

3

Эликсир, 77 байт

import Enum
z=fn x->x==0 end
reverse(drop_while(reverse(drop_while(l,z)),z))

л это массив.

Edit: вау! копирование / макароны не удаются. Конечно, нужно импортировать Enum, который увеличивает количество байтов на 12 (или использовать Enum.function_name, что сделает его еще длиннее).


3

Витси, 13 байт

Витси постепенно поправляется ... (Я иду за тобой, Джелли. ಠ_ಠ)

1mr1m
D)[X1m]

Это выходит с массивом в стеке. Для удобства чтения, TryItOnline! ссылка, которую я предоставил ниже объяснения, выведет отформатированный список.

Объяснение:

1mr1m
1m      Do the second line of code.
  r     Reverse the stack.
   1m   I'ma let you figure this one out. ;)

D)[X1m]
D       Duplicate the top item of the stack.
 )[   ] If the top item of the stack is zero, do the stuff in brackets.
   X    Remove the top item of the stack.
    1m  Execute the second line of code.

Обратите внимание, что это вызовет исключение StackOverflowException для неоправданно больших входных данных.

TryItOnline!


2
Витси когда-нибудь получит Джелли.
Конор О'Брайен

Добавить автоматическое совпадение скобок на EOL / EOF
Cyoce

3

R, 39 байт

function(x)x[min(i<-which(x>0)):max(i)]

На четыре байта короче R-ответа Дэвида Аренбурга . Эта реализация находит первый и последний индекс в массиве, который больше нуля, и возвращает все в массиве между этими двумя индексами.



2

Дьялог АПЛ, 15 байт

{⌽⍵↓⍨+/0=+\⍵}⍣2

               ⍣2     Apply this function twice:
{             }       Monadic function:
           +\⍵        Calculate the running sum.
       +/0=           Compare to zero and sum. Number of leading zeroes.
   ⍵↓⍨               Drop the first that many elements from the array.
 ⌽                   Reverse the result.

Попробуй это здесь .


Как насчет {⌽⍵/⍨×+\⍵}⍣2?
lstefano

2

Рубин, 49 44 байта

->a{eval ?a+'.drop_while{|i|i<1}.reverse'*2}

Спасибо manatwork за то, что вырубили 5 байт совершенно другим методом!

Это просто dropпервый элемент массива, whileон равен 0, обращает массив, повторяет его и, наконец, обращает массив, чтобы вернуть его в правильном порядке.


Уч. Теперь даже .drop_while()f=->a{a.drop_while{|i|i<1}.reverse};->a{f[f[a]]}
базовое

Doh. Нет необходимости в двух функциях, просто evalуродство ->a{eval ?a+'.drop_while{|i|i<1}.reverse'*2}.
manatwork

@manatwork Не знаю, почему я так и не подумал <1. Благодарность!
Дверная ручка

2

Vim 16 нажатий клавиш

i<input><esc>?[1-9]<enter>lD0d/<up><enter>

Ввод вводится пользователем между iи esc, и не считается нажатием клавиши. Это предполагает, что будет по крайней мере один ведущий и один конечный ноль. Если это неверное предположение, мы можем использовать эту немного более длинную версию: (18 нажатий клавиш)

i <input> <esc>?[1-9]<enter>lD0d/<up><enter>

1
Я не думаю, что вам нужно включать код, чтобы позволить пользователю вводить цифры ( iи <esc>). В vim golf игрок в гольф начинает с ввода уже в файле загруженного буфера и курсора в верхнем левом углу, но пользователь также должен сохранить и выйти ( ZZобычно это самый быстрый способ). Тогда вы можете сделать что-то вроде d[1-9]<enter>$NlDZZ(13 нажатий клавиш). Примечание N/ nвместо/<up><enter>
Даниеро

2

ES6, 51 байт

f=a=>a.map(x=>x?t=++i:f<i++||++f,f=i=0)&&a.slice(f,t)

tустанавливается на индекс после последнего ненулевого значения, в то время fкак увеличивается до тех пор, пока пока видны только нули.


2

Perl 6 , 23 байта

{.[.grep(?*):k.minmax]}
{.[minmax .grep(?*):k]}

Использование:

# replace the built-in trim subroutine
# with this one in the current lexical scope
my &trim = {.[.grep(?*):k.minmax]}

say trim [0, 0, 0, 8, 1, 4, 3, 5, 6, 4, 1, 2, 0, 0, 0, 0];
# (8 1 4 3 5 6 4 1 2)
say trim [0, 4, 1, 2, 0, 1, 2, 4, 0];
# (4 1 2 0 1 2 4)
say trim [0, 0, 0, 0, 0, 0];
# ()
say trim [3, 4, 5, 0, 0];
# (3 4 5)
say trim [6];
# (6)


2

JavaScript (ES6), 47 байт

a=>a.join(a="").replace(/(^0+|0+$)/g,a).split(a)

Где aнаходится массив.


4
Я думаю , что вам нужно сделать анонимную функцию для ввода тека: a=>a.join(a="")....
andlrc

2
Это обрабатывает только целые числа должным образом , когда они одну цифру
aross

@ dev-null Готово.
user2428118

По-прежнему возвращает неправильные значения для многозначных чисел. [14]вернется [1, 4].
Mwr247

На самом деле, я до сих пор жду ответа на этот комментарий . Во всяком случае, я, к сожалению, не вижу способа справиться с многозначными целыми числами, используя ту же технику, которую я использовал для своего ответа, и я не думаю, что смогу победить этот ответ в любом случае. Я могу попробовать, когда у меня есть время, хотя.
user2428118


2

JavaScript (ES6), 34 байта

a=>a.replace(/^(0 ?)*|( 0)*$/g,'')

Ввод и вывод выполняются в форме списка, разделенного пробелами, например "0 4 1 2 0 1 2 4 0".



2

PHP, 56 54 52 байта

Использует кодировку Windows-1252

Струнное решение

<?=preg_replace(~ÜÒ×ßÏÖÔƒ×ßÏÖÔÛÜ,"",join($argv,~ß));

Запустите так:

echo '<?=preg_replace(~ÜÒ×ßÏÖÔƒ×ßÏÖÔÛÜ,"",join($argv,~ß));' | php -- 0 0 123 234 0 500 0 0 2>/dev/null;echo

Если ваш терминал установлен в UTF-8, это то же самое:

echo '<?=preg_replace("#-( 0)+|( 0)+$#","",join($argv," "));' | php -- 0 0 123 234 0 500 0 0 2>/dev/null;echo

Tweaks

  • Сохранено 2 байта путем отрицания строк и удаления разделителей строк
  • Сохранено 2 байта с помощью короткого тега печати

1
Можете ли вы предоставить решение ASCII. Никто не может прочитать это!
Тит

1
@ Титус Конечно. Тем не менее, множество нечитаемых эсолангов там ... не то, чтобы мой ответ не чувствовал себя как дома.
aross

Массив как первый параметр объединения?
Йорг Хюльсерманн

1
@ JörgHülsermann Да. Это задокументировано с другой стороны, но оно принимает и то и другое.
aross

Вы правы, я не осознаю этого
Йорг Хюльсерманн

2

Python 2, 69 67 байт

def f(a):
 for i in(0,-1):
  while a and a[i]==0:a.pop(i)
 return a

Вы можете удалить пробел перед вашим кортежем во второй строке.
Зак Гейтс

Вы можете сделатьfor i in-1,0:
mbomb007

Кроме того, вы можете пересчитать свои байты. Я считаю 67 как есть. Вы также можете заменить [space][space]whileна [tab]while. А ==0может быть <1. mothereff.in/…
mbomb007


1

PowerShell, 49 байт

($args[0]-join',').trim(',0').trim('0,')-split','

Принимает данные $args[0]и -joinвводит их вместе с запятыми для формирования строки. Затем мы используем .Trim()функцию, вызываемую дважды, чтобы удалить сначала завершающие, а затем начальные нули и запятые. Затем мы помещаем -splitстроку с запятыми обратно в массив.


Альтернативная версия, без использования преобразования
PowerShell, 81 байт

function f{param($a)$a=$a|%{if($_-or$b){$b=1;$_}};$a[$a.Count..0]}
f(f($args[0]))

Поскольку PowerShell не имеет функции для обрезки массивов, мы определяем новую функцию f, которая сделает для нас половину этого. Функция принимает в $aкачестве входных данных, затем перебирает каждый элемент с помощью цикла foreach |%{...}. Каждую итерацию мы проверяем на условность $_ -or $b. Так как ненулевые целые числа являются правдивыми, но $nullложными (и $b, будучи ранее не определенными, начинаются как $null), это будет только $trueпосле того, как мы попадем в наш первый ненулевой элемент в массиве. Затем мы устанавливаем $b=1и добавляем текущее значение $_в конвейер. Затем это будет продолжаться до конца входного массива, с нулями в середине и концом, добавляемым на выход, так как мы установили $btruey.

Мы инкапсулируем и сохраняем результаты цикла обратно в $a. Затем мы индексируем $aв обратном порядке (т. Е. Обращаем массив), который остается в конвейере и, таким образом, является возвращаемым значением функции.

Мы дважды вызываем функцию на $args[0]входе в программу, чтобы «обрезать» ее спереди, а затем снова спереди (то есть сзади, поскольку мы перевернули). Порядок сохраняется, так как мы дважды меняем направление.

Эта версия немного не соответствует правилам для входного массива всех нулей, но поскольку игнорирование STDERR является общепринятой практикой, программа выдаст две (подробные) Cannot index into a null arrayошибки (эквивалент PowerShell) в STDERR и затем ничего не выдаст.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.