목록에서 0을 가리십시오


41

이 SO 질문에서 영감을 얻었습니다.

입력으로 비어 있지 않은 정수 목록이 주어지며 첫 번째 값은 0이 아닙니다. 출력을 구성하려면 목록의 시작 부분을 따라 0이 아닌 각 값을 출력하십시오. 0이 발생하면 가장 최근에 출력에 추가 한 값을 반복하십시오.

프로그램이나 함수를 작성할 수 있으며, 입력 / 출력은 정렬 된 정수 순서 인 한 추가 정보를 인코딩하지 않는 편리한 형식을 취합니다. 프로그램에서 출력하는 경우 후행 줄 바꿈을 인쇄 할 수 있습니다. 이 마지막 줄 바꿈을 제외하고는 출력물이 제출물에 적합한 입력이어야합니다.

바이트 단위의 가장 짧은 코드가 이깁니다.

테스트 사례

[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]

21
약간의 사소한 통계 : 통계 세계에서이 작업의 이름은 LOCF (마지막으로 관측 된 결과) 대치입니다.
Alex A.

입력이 있으면 어떻게됩니까 [0,0]?
Kritixi Lithos

4
@ KριτικσιΛίθος "... 여기서 첫 번째 값은 0이 아닌 것으로 보장됩니다"
Sp3000

입력이 있으면 어떻게 [1,01]되나요? issac의 Pyth 답변을 사용하여 thisthis 비교 하십시오 .
Arcturus

@Eridan 01은 Pyth 입력에서 유효한 정수가 아니므로 isaac 는이를 설명 할 필요가 없습니다. 다른 답변은 원하는 경우 일관성을 유지하는 한 입력을 수락 할 수 있습니다 (이삭의 답변이 해당 목록을 출력으로 생성하지 않는 방법)
FryAmTheEggman

답변:


19

Pyth, 6 바이트

mJ|dJQ

데모

m ... Q이는 입력에 함수를 맵핑 함을 의미합니다. 매핑되는 함수는입니다 J|dJ. J = d or J파이썬에서는 J처음 사용할 때 다음 값에 암시성이 할당 되므로 의미 합니다. Python과 달리 대입 식은 Pyth에 지정된 값을 반환하므로 맵은 J원하는 각 연속 값을 반환 합니다.


23

비경쟁 젤리

3 바이트이 답변은 도전 과제를 수행하는 기능을 사용하므로 경쟁이 아닙니다.

o@\

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

작동 원리

o      Take the logical OR of its arguments.
 @     Reverse the argument order of the link to the left.
  \    Do a cumulative reduce, using the link to the left.

6
제 뇌는 이해할 수 없습니다 이미 없었던 것처럼. ಠ_ಠ
Addison Crump

1
설명은 더 이상 프로그램과
맞지

18

루비, 25 바이트

->a{a.map{|x|x==0?a:a=x}}

이것은 실제로 정말 악하다.

특히, 조각 x==0 ? a : (a=x).

다른 변수 이름 a(이전의 0이 아닌 값) 을 사용한 경우 (예 : 0이 아닌) y외부에서 선언해야합니다 map( y=x단일 map반복 내부의 범위 만 있기 때문에 ). 그것은 4 문자를 더 사용합니다 ( y=0;).

그러나 변수 이름을 사용하면 a... 그렇습니다. 실제로 입력 (원래 배열) 으로 얻은 인수에 다시 할당합니다 .

map그것이 호출되는 것의 원래 가치 에만 관심이 있기 때문에 상관하지 않으므로 실제로 작동합니다.


17

하스켈, 21 바이트

a%0=a
a%b=b
scanl1(%)

우리가 만드는 (익명) 기능은 마지막 줄에 있습니다. 처음 두 줄은 도우미 기능을 정의합니다.

scanl1(%) [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]

이항 함수 %0그렇지 않으면 두 번째 인수를 출력합니다. scanl1이 기능을 입력 목록에서 반복하여 각 단계에서 결과를 출력합니다.


13

J, 8 바이트

{:@-.&0\

다음과 같이 호출되는 단항 함수입니다.

   f =: {:@-.&0\
   f 2 0 0 4 0 _1 0
2 2 2 4 4 _1 _1

설명

{:@-.&0\
       \  Map over non-empty prefixes:
   -.      remove all occurrences
     &0    of the number 0 and
{:@        take the last element.

0을 제거하는 대신 절대 값으로 복제 할 수 있습니까?
lirtosiast

@ThomasKwa 저의 첫 시도였습니다. 그것은의 {:@(#~|)\한 바이트 이상, 그래서.
Zgarb

13

세드, 8

/^0$/g
h
  • /^0$/줄의 0과 일치합니다. 그렇다면 g보류 공간을 패턴 공간에 복사합니다.
  • h 패턴 공간을 홀드 공간으로 복사

정수는 줄 바꿈으로 구분됩니다. 예 :

$ printf -- "-1\n0\n5\n0\n0\n7\n" | sed -f zerocover.sed
-1
-1
5
5
5
7
$ 

11

자바 스크립트 ES6, 19 바이트

s=>s.map(i=>p=i||p)

간단 용액 입력을 반복, 할당 p현재 요소 i거나 p하는 경우 i이다 0그것을 출력하고.

예제 실행 (익명 함수를에 할당 f) :

>> f([1, 0, 2, 0, 7, 7, 7, 0, 5, 0, 0, 0, 9])
<< Array [1, 1, 2, 2, 7, 7, 7, 7, 5, 5, 5, 5, 9]

이것을 실행할 때마다 "변수 p를 찾을 수 없습니다"라는 오류가 발생합니다.
Downgoat

@Downgoat 인터프리터가 엄격한 모드 전용 인터프리터이기 때문입니다. 엄격 모드에서 해당 코드를 실행하지 않으면 작동합니다.
wizzwizz4

@ wizzwizz4 ohh, r okay
Downgoat

1
@ wizzwizz4 엄격한 모드는 바보입니다.
SuperJedi224

1
@ SuperJedi224 바보 아니에요. 매우 유용합니다. 그것은 코드가 모호하지 않은지 확인하고 주요 업데이트로도 작동하며 정의되지 않은 동작 등을 사용하지 않습니다. 그러나 엄격하지 않은 것은 기본적으로 활성화되어 있습니다. 엄격 모드 문자열을 처음에 넣지 않으면 원하지 않으며 코드 골프입니다.
wizzwizz4


7

Dyalog APL, 12 10 9 바이트

(⊃0~⍨,⍨)\

@Zgarb의 J 답변에서 영감을 얻었습니다.

(⊃0~⍨,⍨)\      Monadic function:
        \      Cumulative reduce by
(⊃0~⍨,⍨)       the dyadic function:
     ,⍨           Arguments concatenated in reverse order
  0~⍨             With zeroes removed
 ⊃                Take the first element

여기서 사용해보십시오 .


6

Pyth, 8 바이트

t.u|YNQ0

기본 사례 0과 함께 (Python 's .u)에 의해 (누적 감소)를 사용합니다 .|or


@isaacg처럼 보인다 .u해도 이상 JK묶여있다. 적 최적입니까?
lirtosiast

여기에 (적어도 afaik) 있었습니다 . 일반적으로 어떤 이유로 든 모든 결과를 원할 때 도움이됩니다.
FryAmTheEggman

5

파이썬 2, 29 바이트

while 1:x=input()or x;print x

한 줄에 하나씩 주어진 숫자로 입력을 받아서 같은 형식으로 출력합니다. 완료 후 오류로 종료됩니다.

의 단락 특성을 사용하여 입력이 0 (Falsey)이 아닌 한 현재 값을 유지하지 않으면 or변수 x가 입력으로 업데이트됩니다. 그런 다음 x인쇄됩니다. 첫 번째 목록 값이 0 x이 아니므로 할당되기 전에 오른쪽에서 평가되지 않습니다.


이 Pyth에서 6 바이트이며, 오류 억제 :#\nJ|EJ
isaacg

5

Mathematica 38 바이트

패턴 매칭이 반복적 ...a,0,...으로...a,a...

#//.{b___,a_/;a!=0,0,e___}:>{b,a,a,e}&

5

Matlab, 41 46 바이트

이것은 원래의 대답 에서 영감을 얻었으며 다음과 같은 차이점이 있습니다.

  1. 대신 논리적 인덱싱을 사용하십시오 nonzeros.
  2. 와 비교하는 대신 이중 논리 부정 0.
  3. 출력 형식이 유연하므로 조옮김을 제거 할 수 있습니다.
  4. 중간 변수를 제거합니다.

항목 4에 대한 Tom Carpenter 와 함수 대신 프로그램을 사용하라는 제안에 감사 합니다. 함께 5 바이트를 줄일 수있었습니다.

x=input('');u=x(~~x);disp(u(cumsum(~~x)))

예:

>> x=input('');u=x(~~x);disp(u(cumsum(~~x)))
[4 0 3 2 0 5 6 0]
     4     4     3     2     2     5     6     6

x=input('')함수 선언 disp(u(t)대신 y=비트 대신 프로그램으로 변환하여 1 바이트를 저장할 수 있습니다 . 또한 t변수를 제거 하여 x=input('');u=x(~~x);disp(u(cumsum(~~x)))41 바이트를 생성하여 4 바이트를 더 절약 할 수 있습니다.
Tom Carpenter

@TomCarpenter 감사합니다! 편집
Luis Mendo

Matlab이 없지만 @(x)x(~~x)(cumsum(~~x))Octave에서 작동합니다.
alephalpha

@alephalpha Matlab은 반복 색인 생성을 허용하지 않습니다.
AlexR


5

apt, 8 7 바이트

N£U=XªU

꽤 간단합니다. 쉼표로 구분하여 입력을받습니다. 온라인으로 사용해보십시오!

언 골프와 설명

N£    U=Xª U
NmXYZ{U=X||U

        // Implicit: N = input, U = first item
NmXYZ{  // Map each item X to:
U=Z||U  //  Set U to (X || U) and return.
        //  If X is non-zero, this sets U to X.
        //  Otherwise, this leaves U as the last non-zero we've encountered.
        // Implicit: output last expression

비경쟁 4 바이트 버전 : ( 챌린지 후 å명령 및 !-자동 기능 추가)

Nå!ª

설명:

Nå!ª
Nå!||
NåXY{Y||X}

        // Implicit: N = input, U = first item
NåXY{   // Cumulatively reduce N; take each item Y and prev value X,
Y||X}   //  and return Y if it is non-zero; return X otherwise.
        // Implicit: output last expression

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


잠깐만, ª아니면 OR º아닌가? 인가 º와 혹시?
caird coinheringaahing

@cairdcoinheringaahing Nope º입니다 ((. 그들은 내가 그들에 대한 필요성을 발견 유니 코드 값에 의해 할당 된 : P ª차 및 ºr은 ... 내가 JAPT 2.0이를 사용할 수 있습니다,하지만 천재
ETHproductions

5

자바, 78

int[]f(int[]a){for(int i=-1,b=i;++i<a.length;a[i]=b=a[i]==0?b:a[i]);return a;}

여기서 우리는 단지 0이 아닌 마지막을 추적하고 적절한 곳에 밀어 넣습니다. 그것을하는 명백한 방법 인 것 같습니다.


5

프롤로그 (SWI) , 54 바이트

[X,0|T]+[X,X|Y]:-[X|T]+[X|Y].
[X|T]+[X|Y]:-T+Y.
[]+[].

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

설명

이 답변에 정말 만족합니다.

먼저 빈 목록이 빈 목록의 해결책이라고 말합니다.

[]+[].

그런 다음 나머지 각 솔루션의 두 번째 항목을 제거하여 [X,X|Y]의 솔루션 이라고 말합니다 [X,0|T].

[X,0|T]+[X,X|Y]:-[X|T]+[X|Y].

마지막으로 남은 것은 동일한 값으로 시작하고 나머지 두 목록이 서로 일치하면 유효합니다.

그 설명이 효과가 없다면 다음은 Haskell로 번역 된 코드입니다.

g(a:0:x)=a:g(a:x)
g(a:x)=a:g x
g x=x

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


매우 간결합니다! 일부 기능 및 논리 프로그래밍 언어를 사용하여 규칙을 문자 그대로 번역하는 방법을 좋아합니다. 그것을 작성하는 것은 자연스러운 방법입니다!
ThePlasmaRailgun

4

GolfScript, 10 바이트

~{1$or}*]`

이 프로그램은 골프 스크립트 배열 리터럴 (예 :)의 형태로 stdin에서 입력을 가져와 [1 0 2 0]동일한 형식 (예 :) 으로 출력을 stdout에 씁니다 [1 1 2 2].

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

함수 (GolfScript 배열 가져 오기 및 반환)는 블록으로 감싸서 기호에 할당해야하기 때문에 3 바이트 더 길어집니다.

{[{1$or}*]}:f

물론 함수 본문 (예 :) 만 [{1$or}*]계산하면 실제로 독립 실행 형 프로그램과 비교하여 1 바이트를 저장할 수 있습니다.


놀랍지 않게도 새롭고 더 짧은 버전은 Dennis의 CJam 항목 과 매우 유사합니다 . GolfScript는 입력을 자동으로 읽으므로 추가 바이트가 필요하지 않기 때문에 1 바이트 씩 이깁니다.
Ilmari Karonen

4

Minkolang 0.14 , 12 10 바이트

$I?.nd?xdN

여기에서 시도하십시오. 질문에서와 같이 입력 할 수 있지만 괄호없이 입력 할 수 있습니다 .

설명

$I      Push the length of the input on the stack.
  ?.    If this is 0, stop. Otherwise, continue.

nd        Take number from input and duplicate it.
  ?x      If this number is 0, dump the top of stack.
    dN    Duplicate the top of stack and output as number

Minkolang은 환상적이므로 처음부터 끝까지 반복되어 .멈출 때까지 계속 진행 됩니다.


4

𝔼𝕊𝕄𝕚𝕟, 7 자 / 12 바이트

ïⓜa=$⋎a

Try it here (Firefox only).

설명

        // implicit: ï = input array
ïⓜ     // map over input
  a=    // set a to:
    $   // (if element is truthy (not 0)) element itself
     ⋎a // else whatever a was set to before
        // implicit output

4

O , 31 바이트

[[I',T%T/]{n#}d]{n.{:V}{;V}?}d]

이것은로 구분 된 입력을 취하고 ,의 동일한 목록을 출력합니다 [].

7,0,3,0,0,2,-50,0,0 => [7,7,3,3,3,2,-50,-50,-50]

설명:

[] 결과를 배열에 넣습니다
 [I ', T % T /] {n #} d] 숫자 배열로 입력 형식화
                {n. {: V} {; V}?} d 0을 채 웁니다 (아래의 작동 방식 참조).


17 바이트

I~]{n.{:V}{;V}?}d

접미사 표기법을 사용하여 공백으로 구분 된 숫자 목록으로 입력을 받고 한 자리 16 진수 만 처리 할 수 ​​있습니다. 제외 어는 뒤에 접미사가 붙습니다 _.

5 4 0 0 1 0 0 => 5 4 4 4 1 1 1
A 3 0 0 1 B 0 => 10 3 3 3 1 11 11
67* 0 0 78* 0 => 42 42 42 56 56
67*_ 4 3_ 0 0 => -42 4 -3 -3 -3

설명:

I ~] 입력을 정수 배열에 넣습니다
   {} d 입력의 각 숫자에 대해
    n. {; V} {: V}? 숫자가 0이면 V를 누릅니다.
                  그렇지 않은 경우 V를 숫자로 설정하십시오.

을 사용하여 2 바이트를 저장할 수 있습니다 I~]{n.{:V}{;V}?}d. 난 d그냥 스택 대신에 가치를 넣어야 궁금해 n...
kirbyfan64sos

O가 이것을 처리 할 수 ​​있습니까? “출력이 제출물에 적합한 입력이어야합니다”요구 사항을 만족시키는 방법을 찾지 못했습니다.
manatwork

@manatwork 이제는 더 나은 버전을 사용할 수 -42있지만 출력 주위에 대괄호가 추가됩니다.
단계

4

R, 39 37 33 바이트

function(x)zoo::na.locf(x*(x|NA))

이것은 벡터를 받아들이고 벡터를 반환하는 명명되지 않은 함수입니다. zoo패키지를 설치 해야합니다 . zoo네임 스페이스를 직접 참조하기 때문에 네임 스페이스에 연결 하지 않아도 됩니다.

통계 세계에서이 작업의 이름은 LOCF 대치입니다. 여기서 LOCF는 Last Observation Carried Forward를 나타냅니다. R에서이를 수행하기 na.locf위해 zoo패키지 에서 사용할 수 있습니다 . 패키지에서 NA값을 마지막으로 알려진 비값으로 바꿉니다 NA. 입력의 0을 NA먼저 s 로 바꿔야합니다 .

이를 위해, 우리는 사용 x|NA이 될 것이다, TRUEx != 0NA그렇지. 이 값에을 곱 x하면 TRUE요소가의 해당 요소 xNAs로 NA대체되어 0이 모두 바뀝니다 . 그런 다음 zoo::na.locf우리에게 원하는 것을 정확하게 전달합니다 .

flodel 덕분에 4 바이트를 절약했습니다!


4

녹, 100 바이트

fn f(i:&[i64])->Vec<i64>{let(mut o,mut l)=(i.to_vec(),0);
for x in&mut o{if *x==0{*x=l}else{l=*x}};o}

이 도전을 우연히 발견하면서 내가 가장 좋아하는 언어로 시도해 보았습니다. 존재하지 않는[T]::windows_mut() 것을 발견하기 전에 처음에 사용해 보았습니다 . 실제로 이보다 길었을 수도 있습니다. 어쨌든 golfed 녹 매우 추한 매우 경쟁력이없는 것으로 나타났다 (특히 모든 goshdarned esoterics와 함께!) (1)

줄 바꿈은 바이트 수에 포함되지 않습니다. 거기에만 있기 때문에 옆으로 스크롤 할 필요가 없습니다. 코드의 의미는 바뀌지 않습니다.

언 골프 드 :

fn cover_zeroes(input: &[i64]) -> Vec<i64> {
    let mut output = input.to_vec();
    let mut last_nonzero = 0;
    for item in &mut output {
        if *item == 0 {
            *item = last_nonzero;
        }
        else {
            last_nonzero = *item;
        }
    }
    output
}

[1] 적어도 자바만큼 나쁘지는 않다.


7
" 적어도 자바만큼 나쁘지 않습니까?"
Ahem

1
@Geobits 아, 맞아. 나는 당신이 그 public static void main상용구 를 필요로한다고 믿고있었습니다 …
Blacklight Shining

3

은하수 1.2.1 , 33 바이트

:y;=<:&{~<?{0b_^;:3≤_;}1-}^<Ω!

정수 목록이 스택에만 있다고 가정합니다.


설명

:    : :           :              # duplicate the TOS
 y                                # push the length of the TOS
  ;               ;    ;          # swap the TOS and STOS
   =                              # dump a list to the stack
    < <    <                 <    # rotate the stack leftward
        &{~                }      # while loop
            ?{  _     _ }         # if-else statements
              0     3    1        # push an integer
               b                  # == on the TOS and STOS
                 ^          ^     # pop the TOS without output
                     ≤            # rotate the top N stack elements leftward
                          -       # subtract the TOS from the STOS
                              Ω   # push a list made of the top N stack elements
                               !  # output the TOS

TOS와 STOS가 Top of Stack과 Second-to-Top of Stack을 의미한다고 확신합니다. 맞습니까?
애디슨 크럼

Yep @FlagAsSpam
Zach Gates

3

줄리아, 33 바이트

g(x,a=0)=[(i!=0&&(a=i);a)for i=x]

이것은 g배열을 받아들이고 배열을 반환하는 함수 입니다. a0에서 임시 변수 를 시작합니다 i. 입력의 각 요소 에 대해 i0이 아닌 경우 에 할당 a합니다 i. 경우 i0이고, a그 반복에서 변경되지 않습니다. a출력 배열에서 해당 위치의 값으로 사용 합니다.


3

펄 6 , 21 바이트

*.map: {$_=($^a||$_)}

용법:

# store the Whatever lambda as a subroutine
# just so that we don't have to repeat it
my &code = *.map: {$_=($^a||$_)}

say code [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)

say [-1, 0, 5, 0, 0, -7].&code;
# (-1 -1 5 5 5 -7)

say ([1, 0, 0, 0, 0, 0],[-1, 0, 5, 0, 0, -7]).map: &code;
# ((1 1 1 1 1 1) (-1 -1 5 5 5 -7))

3

R, 36 바이트

function(x)x[cummax(seq(a=x)*(!!x))]

이것을 사용하여 어떻게 작동하는지 봅시다 x=

c(1, 0, 2, 0, 7, 7, 7, 0, 5, 0, 0, 0, 9)

예로서. 다음 !!x은 논리 (참 / 거짓) 벡터입니다.

c(T, F, T, F, T, T, T, F, T, F, F, F, T)

또한 다음과 seq(a=x)같은 한 인덱스 벡터를 제공합니다 x.

c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13)

우리는 둘 다 곱하여 다음을 제공합니다.

c(1, 0, 3, 0, 5, 6, 7, 0, 9, 0, 0, 0, 13)

누적 최대 값을 가져옵니다.

c(1, 1, 3, 3, 5, 6, 7, 7, 9, 9, 9, 9, 13)

마지막으로, 마지막 벡터를 다음과 같이 추출 할 인덱스로 사용합니다 x.

c(1, 1, 2, 2, 7, 7, 7, 7, 5, 5, 5, 5, 9)

3

CJam, 11 바이트

q~{1$e|}*]p

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

작동 원리

q~             Read and evaluate all input.
  {    }*      Fold; for each element but the first:
   1$e|          Copy the previous element and take their logical OR.
         ]p   Wrap all results in an array and print it.

3

파워 쉘, 32 바이트

param($x)$x|%{($t=($_,$t)[!$_])}

$x|%{...}의 각 요소에 대해 스크립트 블록을 수행합니다 $x. ($_,$t)전류 및 소자의 배열 $t, 그리고 [!$_]우리가 사용하는 수단이 !$_배열에 인덱스가. 인덱스는 00이 아닌 요소의 1경우 (false), 현재 요소가 0 인 경우 (true)이므로 $t현재 요소 또는 $t입니다. 괄호는 대입 식을 둘러 싸서 값이 방출됩니다. parantheses가 없다면 그것은 단지 "quiet"할당 일 것이다 $t.


@TimmyD, 물론입니다. 이것을 param($x)프로그램으로 바꾸는 것을 추가했습니다 . 출력은 프로그램, 예를 들어 매개 변수로 제출할 수있는 정수의 집합입니다 $a = .\program.ps1 1,2,3,4,0,0,5.\program.ps1 $a예상대로 작동합니다.
Danko Durbić

$args|%{($p=($_,$p)[!$_])}-$ args를 사용하는 26 바이트.
TessellatingHeckler

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