선행 및 후행 0 제거


31

다음과 같이 음이 아닌 정수만 포함하는 비어 있지 않은 목록 / 배열이 제공됩니다.

[0, 0, 0, 8, 1, 4, 3, 5, 6, 4, 1, 2, 0, 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]

최단 코드 승리


숫자가 음이 아닌 정수입니까? 나는 당신이 그것을 명확히 또는 다른 번호로 테스트 케이스를 추가 제안
루이스 Mendo을

1
적어도 하나의 선행과 후행 0이 있다고 가정 할 수 있습니까?
DJMcMayhem

4
무엇이 아무것도 구성하지 않습니까? 나는 펄 아무것도에 변화 몇 가지 다른 것들을 생각할 수 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

답변:



10

자바 스크립트 (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 바이트입니다.
Neil

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

베이스로 변환하거나 밑으로 변환하면 선행 0을 제거 할 수 있지만 너무 길어 보입니다.
Esolanging 과일 0

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의rev-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

매스 매 티카 34 27 바이트

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

이는 이러한 조치가 새 출력을 제공하지 못할 때까지 대체 규칙을 반복해서 적용합니다. Alephalpha 덕분에 7 바이트가 절약되었습니다.

첫 번째 규칙은 처음에 0을 삭제합니다. 두 번째 규칙은 배열 끝에서 0을 삭제합니다.


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


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 나는 [Add Comment]를 친 직후에 거의 동일하지만, 이제 마크 다운이 코드 블록에 줄 바꿈을 저장하도록하기 위해 지금 알아 내야합니다
andlrc

사악한 HTML 해킹을 통해. ;)
Martin Ender 2019

1
17 + 1 바이트 :s/^0 | 0$//&&redo
Kenney

@ Kenney 그것은 아름답습니다 :-) 당신은 답변으로 그것을 게시해야합니다!
andlrc

감사! 내 원본도 19 + 1 바이트 였지만 2 번 더 면도하는 아이디어를 얻은 대답을 보았으므로 원하는 경우 귀하의 것입니다. Btw, ?예 에서 와 같이 를 삭제하면 실제로 답변은 18 + 1입니다. 그러나 그것은 감소하지 않습니다 "0"..
Kenney

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

펄, 38 바이트

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

로 실행하십시오 perl -p(에 대해 3 바이트 추가 -p).

STDIN에서 한 줄에 하나씩 숫자를 허용합니다. 잘 동작하는 유닉스 유틸리티로서 STDOUT에서 한 줄에 하나씩 숫자를 내 보냅니다.

정확히 '0'으로 표시된 숫자 만 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그 사이 단 하나의 여분의 바이트 다른 거기 때문에 플래그는 보통 1 바이트로 계산됩니다 perl -pE.
Chris

3

엘릭서, 77 바이트

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

l은 배열입니다.

편집 :와! 복사 / 파스타가 실패합니다. 물론 Enum을 가져와야하므로 바이트 수가 12 증가합니다 (또는 Enum.function_name을 사용하면 더 길어집니다).


3

Vitsy, 13 바이트

Vitsy가 점점 좋아지고 있습니다 ... (Jelly를 위해 왔습니다.

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
Vitsy는 언젠가 젤리를 얻을 것입니다.
코너 O'Brien

EOL / EOF에 자동 브래킷 일치 추가
Cyoce

3

R, 39 바이트

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

David Arenburg의 R answer 보다 4 바이트 짧습니다 . 이 구현은 배열에서 0보다 큰 첫 번째 인덱스와 마지막 인덱스를 찾아 두 인덱스 사이의 배열에있는 모든 것을 반환합니다.


3

MATL , 9 바이트

2:"PtYsg)

온라인으로 사용해보십시오!

설명

2:"     % For loop (do the following twice)
  P     %   Flip array. Implicitly asks for input the first time
  t     %   Duplicate
  Ys    %   Cumulative sum
  g     %   Convert to logical index
  )     %   Apply index
        % Implicitly end for
        % Implicitly display stack contents

2

Dyalog APL, 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}

완전히 다른 방법으로 5 바이트를 자르는 manatwork 덕분에 !

이것은 drop배열의 첫 번째 요소 인 while0이며 배열을 뒤집고 반복하며 마지막으로 배열을 뒤집어 올바른 순서로 반환합니다.


아야. 이제 .drop_while()기반 솔루션 조차 더 짧을 것입니다 (2 개의 기능을 사용하는 경우).f=->a{a.drop_while{|i|i<1}.reverse};->a{f[f[a]]}
manatwork

도 두 가지 기능이 필요하지 않고 eval추악한 점이 ->a{eval ?a+'.drop_while{|i|i<1}.reverse'*2}있습니다.
manatwork

@manatwork <1어쨌든 내가 왜 생각하지 않았는지 잘 모르겠습니다 . 감사!
Doorknob

2

Vim 16 키 스트로크

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

The input is to be typed by the user between i and esc, and does not count as a keystroke. This assumes that there will be at least one leading and one trailing zero. If that is not a valid assumption, we can use this slightly longer version: (18 Keystrokes)

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

1
I don't think you need to include code to allow the user to input the numbers (i and <esc>). In vim golf the golfer starts with the input already in a file loaded the buffer and the cursor in the top left corner, but the user also has to save and exit (ZZ is usually the fastest way). Then you could do something like d[1-9]<enter>$NlDZZ (13 keystrokes). Note N/n instead of /<up><enter>
daniero

2

ES6, 51 bytes

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

t is set to the index after the last non-zero value, while f is incremented as long as only zeros have been seen so far.


2

Perl 6, 23 bytes

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

Usage:

# 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 bytes

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

Where a is the array.


4
I think you need to make an anonymous function to take input: a=>a.join(a="")....
andlrc

2
This only handles integers properly when they're a single digit
aross

@dev-null Done.
user2428118

Still returning wrong for multi-digit integers. [14] will return [1, 4].
Mwr247

Actually, I was (and am) still awaiting a reply to this comment. Anyway, I unfortunately don't see a way to do handle multi-digit integers using the same technique I've used for my answer and I don't think I'll be able to beat this answer anyway. I may try when I have the time, though.
user2428118


2

JavaScript (ES6), 34 bytes

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

Input and output are in the form of a space-delimited list, such as "0 4 1 2 0 1 2 4 0".


2

Javascript (ES6) 40 bytes

a=>/^(0,)*(.*?)(,0)*$/.exec(a.join())[2]

2

PHP, 56 54 52 bytes

Uses Windows-1252 encoding

String based solution

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

Run like this:

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

If your terminal is set to UTF-8, this is the same:

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

Tweaks

  • Saved 2 bytes by negating strings and dropping string delimiters
  • Saved 2 bytes by using short print tag

1
Can you please provide an ASCII solution. Nobody can read this!
Titus

1
@Titus Sure. However, plenty of unreadable esolangs out there.... it's not like my answer doesn't feel right at home.
aross

An array as first parameter of join?
Jörg Hülsermann

1
@JörgHülsermann Yup. It's documented the other way around but it accepts both.
aross

You are right I have not realize it
Jörg Hülsermann


1

PowerShell, 49 bytes

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

Takes input $args[0] and -joins them together with commas to form a string. We then use the .Trim() function called twice to remove first the trailing and then the leading zeros and commas. We then -split the string on commas back into an array.


Alternate version, without using conversion
PowerShell, 81 bytes

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

Since PowerShell doesn't have a function to trim arrays, we define a new function f that will do half of this for us. The function takes $a as input, then loops through each item with a foreach loop |%{...}. Each iteration, we check a conditional for $_ -or $b. Since non-zero integers are truthy, but $null is falsey (and $b, being not previously defined, starts as $null), this will only evaluate to $true once we hit our first non-zero element in the array. We then set $b=1 and add the current value $_ onto the pipeline. That will then continue through to the end of the input array, with zeros in the middle and the end getting added onto the output, since we've set $b truthy.

We encapsulate and store the results of the loop all back into $a. Then, we index $a in reverse order (i.e., reversing the array), which is left on the pipeline and thus is the function's return value.

We call the function twice on the $args[0] input to the program in order to "trim" from the front, then the front again (which is the back, since we reversed). The order is preserved since we're reversing twice.

This version plays a little loose with the rules for an input array of all zeros, but since ignoring STDERR is accepted practice, the program will spit out two (verbose) Cannot index into a null array errors to (PowerShell's equivalent of) STDERR and then output nothing.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.