개구리처럼 건너 뛰세요!


12

음이 아닌 정수 배열이 주어지면 아래 설명과 같이 특정 요소 만 유지해야합니다.

  • 배열이라고 가정 해 봅시다 [1, 3, 2, 4, 11, 5, 2, 0, 13, 10, 1].

  • 먼저 배열의 첫 번째 요소를 얻습니다 n. 첫 번째 n요소를 유지하고 다음 요소를 버립니다 ( 일차 폐기 n+1). 새로운 배열은 [1, 2, 4, 11, 5, 2, 0, 13, 10, 1]입니다.

  • 그런 다음 제거 된 요소를 따르는 요소를 잡고 똑같은 작업을 수행합니다. 프로세스를 다시 적용하면[1, 2, 11, 5, 2, 0, 13, 10, 1]

  • 배열의 범위를 벗어나거나 배열에 남아있는 요소가 없을 때까지 프로세스를 반복합니다. 우리 11는 배열의 길이보다 길기 때문에 멈 춥니 다 .

  • 이제 결과를 출력해야합니다.

입력 / 출력은 표준 형식으로 가져 오거나 제공 될 수 있습니다. 배열은 절대 비어 있지 않으며 음이 아닌 정수만 포함합니다. 모든 표준 허점은 금지되어 있습니다.

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다!


테스트 사례

입력-> 출력

[1, 2, 3, 4, 5]-> [1, 3, 4]

[6, 1, 0, 5, 6]-> [6, 1, 0, 5, 6]

[1, 3, 2, 4, 11, 5, 2, 0, 13, 10, 1]-> [1, 2, 11, 5, 2, 0, 13, 10, 1]

[2, 2, 2, 2, 2, 2]-> [2, 2]

[1, 2, 3, 1, 2, 3, 1, 2, 3]-> [1, 2]

[3, 1, 2, 4, 0]-> [] *

* 마지막 테스트 케이스는을 포함 0하므로 프로세스를 더 명확하게 게시하기로 결정했습니다.

[3, 1, 2, 4, 0] --> [3, 1, 2, 0] --> [1, 2, 0] --> [1, 0] --> [0] --> [] )

( 본 과제에서 영감 의해 에릭 Outgolfer )


모든 테스트 사례를 직접 작성했으며 실수가 있다고 생각되면 알려주십시오!

1
2첫 번째 단계에서 제거되지 3않습니까?
Leaky Nun

@LeakyNun 내 실수. 수정. 다른 실수를 한 경우 Ping

제안 된 테스트 사례 :[1, 2, 3, 1, 2, 3, 1, 2, 3]
Rod

1
명확히하기 위해, 새로운 " n" 로 옮길 때 , 항상 배열의 시작부터 시작하여 n요소 를 유지 합니까? 첫눈 에 평가 n하고있는 요소를 ( 첫눈에 생각한대로) 유지하지 n않습니까?
Brian J

답변:


1

Pyth, 18 바이트

#IgZlQB .(Q=Z@QZ)Q

여기에서 시도하십시오.



@LeakyNun 그리고 나는 그것을 충분히 테스트했다고 생각했습니다! darn
Outgolfer Erik

주어진 테스트 케이스를 확인하십시오.
Leaky Nun

@LeakyNun 때로는 코드가 실제와는 다른 결과를 제공한다고 생각합니다 ... 고정 ... 고정 (오, btw 나는 테스트 케이스 tbf에서 서식을 제거하는 것이 조금 게으르다)
Erik the Outgolfer

5

자바 스크립트 (ES6), 45 바이트

f=(a,k=0,x=a[k])=>1/x?f(a.splice(x,1)&&a,x):a

테스트 사례


4

하스켈 , 50 바이트

g.pure.(0:)의 목록을 가져 와서 반환하는 익명 함수 입니다.로 Int사용하십시오 (g.pure.(0:))[1,2,3,4,5].

g.pure.(0:)
g(a,_:b:c)=g$splitAt b$a++b:c
g(a,_)=a

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

작동 원리

  • 이 함수 g는 분할 목록을 나타내는 튜플 인수를 사용합니다. a는 이전 단계에서 유지 된 초기 요소의 목록이고, _버릴 b요소이며, 길이로 사용될 다음 요소 c이며 나머지 요소입니다.
    • 튜플의 두 번째 부분에을 선택하기에 충분한 요소가 있으면 b새 분할이 수행되고 g재귀됩니다. 그렇지 않으면 a결과적으로 중지됩니다 .
  • 익명 함수 는 tuple g.pure.(0:)을 호출 g하여 모든 것을 시작합니다 ([],0:l). 여기 l에서 입력이 있고 0즉시 폐기됩니다 g.
    • pure여기서는 Applicative(이진) 튜플 의 인스턴스를 사용하고 결과 유형을 ([Int],[Int])사용 []하면 첫 번째 요소가있는 튜플의 두 번째 요소로 인수를 편리하게 넣습니다 .



2

자바 8, 68 바이트

이 람다는 가변을 허용합니다 List<Integer>( remove(int)예 : 지원 ArrayList). 출력이 변형 된 입력입니다. 에 할당하십시오 Consumer<List<Integer>>.

l->{for(int i=0,f=0;i<l.size();f^=1)i=f>0?l.remove(i)*0+i:l.get(i);}

온라인 시도

이 문제에 대한 제어 흐름은 매우 성가신 일입니다. 반복 할 때마다 요소를 제거하고 다음 위치에서 요소를 가져와야하며이 두 작업 모두 범위 검사가 필요합니다 (또는 프로그램 완료를 트리거 할 수 있음). 한 가지 전략은 자체 범위 확인으로 인덱스 업데이트를 보호하면서 단일 루프 반복으로 두 작업을 수행하는 것입니다. 더 짧은 것으로 판명 된 또 다른 전략은 각 루프 반복 작업을 번갈아 수행하는 것입니다. 이것이이 솔루션이하는 일입니다.


1

APL (Dyalog Classic) , 32 바이트

1∘{n∇⍣(n≤≢w)⊢w←⍵/⍨(n1+⍺⊃⍵)≠⍳≢⍵}

설명

1∘{                             } bind 1 as starting left argument (⍺)
                             ⍳≢⍵  generate indexes for right argument (⍵)
                   (n1+⍺⊃⍵)      n is 1+item at position  
              w←⍵/⍨              w is  with item at n removed
   n∇⍣(n≤≢w)⊢                     recurse with n as left and w as right arg if n <= length of w

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



1

Haskell, 99 바이트 (압입없이 88 개)

f x y
 |y>=l=f x$l-1
 |e>=l=x
 |True=f (take e x ++ drop (1+e) x) e
 where e=x!!y
       l=length x

아마도 "True"대신 "1 = 1"을 사용하여 1 바이트를 절약 할 수있을 것입니다. 또한 "++"근처의 두 공백을 제거 할 수도 있습니다.
Giacomo Tecya Pigani

1

VI, 31 25 바이트

O@0kdd<C-v><C-a>Y<C-v><C-x>gg@a<Esc>"add<C-a>Y<C-x>@a

<C-?>에 해당 Control + ?하고, <Esc>Escape분명히. 이들 각각은 1 바이트로 계산됩니다 ( meta 참조 ).

입력

입력 파일은 줄당 1 개의 정수 + 끝에 1 개의 빈 줄을 포함해야합니다. 예 :

1
2
3
4
5
⁣

1 :: 2 :: 3 :: 4 :: 5 :: []일부 언어에서 와 같이 입력 파일의 각 줄을 배열 요소로 볼 수 있습니다 (예 : caml).

시작하다

다음 명령으로 vi를 시작하고 스트로크로 솔루션 스트로크를 입력 할 수 있습니다.

vi -u NONE input

이 하나의 라이너를 사용할 수도 있습니다.

vi -u NONE -c ':exec "norm O@0kdd\<C-v>\<C-a>Y\<C-v>\<C-x>gg@a\<Esc>\"add\<C-a>Y\<C-x>@a"' -c ":w output" -c ':q' input

output입력 파일에서 올바른 결과를 가진 파일이 생성 됩니다 input.

설명

솔루션을 소개하기 위해 먼저 0이없는 배열에 대해서만 작동하는 19 바이트 솔루션을 제시하겠습니다.이 솔루션은 재귀 매크로를 사용하며 최종 솔루션에서 약간의 수정 만 사용합니다.

Yqa@0ddYgg@aquggY@a

부분 솔루션 설명

Y                       # yank first line (first integer + line break) to "0 register
 qa                     # start recording a macro ("a register)
   @0                   # jump n lines, where n is the content of the "0 register
     dd                 # delete the current line (n+1th line)
       Y                # yank current line (integer after the previously deleted line)
        gg              # go back to the first line
          @a            # recurse on macro "a"
            q           # finish recording the macro
             u          # cancel modifications done by the execution of the macro
              gg        # go back to the first line
                Y@a     # apply the recorded macro with first parameter equal to the first integer

여기서의 트릭은 "0레지스터를 사용하여 현재 정수 (및 줄 바꿈, 매우 중요)를 저장하는 것입니다. 따라서이 명령을 @0사용하면 n줄 을 건너 뛸 수 있습니다 ( n의 값을 호출 하십시오 "0). 점프가 파일의 행 수를 초과하면 매크로가 실패하므로 프로그램이 중지됩니다 (필요한 경우 배열 범위를 벗어남).

그러나 입력에가 포함되어 있으면이 솔루션이 작동하지 않습니다 0. 실제로 "0레지스터 값이 0이면 원하는 @0대로가 아니라 한 줄로 이동합니다 (줄 바꿈으로 인해) 0. 따라서 다음 명령 ( dd)은 0 번째 정수를 삭제하지 않고 1 번째 (정확하지 않음)를 삭제합니다.

를 처리하는 유효한 솔루션 0은 항상 양수하기 전에 정수를 증가시키고 직후에 감소시키는 것입니다. 따라서 @0명령은 n+1행 을 점프 합니다 ( n증가 된 현재 정수). k명령 줄로 이동 한 후 필요하다 n(이전 행). 이 트릭을 사용 n+1하면 이전 줄로 점프하기 전에 항상 줄을 점프하기 때문에 배열 외부로의 점프를 피하기 위해 입력 파일의 끝에 빈 줄이 필요합니다 (따라서 프로그램 종료) .

최종 솔루션 설명

O                                                       # insert a new line at the beginning of the file, enter insert mode to write the macro content
 @0                                                     # jump n lines                                                       
   k                                                    # go to the previous line
    dd                                                  # delete this line
      <C-v><C-a>                                        # type Control+A (C-v is needed because we are in insert mode) to increment the current integer
                Y                                       # yank the incremented integer
                 <C-v><C-x>                             # decrement the current integer
                           gg                           # go to the first line
                             @a                         # recurse on macro "a"
                               <Esc>                    # exit insert mode : at this step, the first line of the file contains the macro content @0kdd^AY^Xgg@a
                                    "add                # copy @0kdd^AY^Xgg@a line to the register "a and delete the line
                                        <C-a>           # increment the first integer
                                             Y          # yank it (into "0)
                                              <C-x>     # decrement the first integer
                                                   @a   # apply macro in a" (initial @0 will jump n+1 lines, since we incremented the first integer before calling the macro)

등록하기 전에 파일 안에 매크로 내용을 쓰면 몇 바이트를 절약 할 수 있습니다.

  • qa...q등록 후 모든 변경 사항 을 쓰거나 실행 취소 하지 않습니다.
  • 피한다 :let @a="...")

편집

#1

  • 첫 줄에 매크로 내용을 쓰십시오 (마지막 줄 대신)
  • 입력 변경 (끝에 빈 줄 1 개)
  • 명령 줄에서 테스트 할 1 개의 라이너 추가

0

Pyth, 32 바이트

VlQIgNlQBK@QNI!K=QYBIgKlQB.(QK;Q

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


Pyth는 :)이보다 훨씬 더 우아 할 수있다 #VlQ.(Q@QN;Q12 바이트의 작업을 수행, 나는 확신은 더욱 golfed 할 수있어
데이브

구식 Pythonic 접근 방식을 유지하면 할 수 있습니다 W<Zl=Q+<Q@QZ>Qh@QZ=Z@QZ)Q(25). pizzakingme의 접근 방식이 훨씬 좋습니다.

4
@KaranElangovan은 사과 할 것이 없습니다. 그들은 단지 당신을 돕기 위해 노력하고 있습니다.
Leaky Nun

1
최종 테스트 사례에서 수정 된 결과는 15 바이트 #VlQ .(Q@QN)%;Q입니다. Pyth 골퍼의 의견은 환영받을 것입니다. 나는 여전히 배우고 있습니다!
Dave

2
이 접근법은 유효하지 않습니다. 결과 만 인쇄 할뿐만 아니라 테스트 사례 (최소한 마지막 것)도 실패합니다. 이 답변을 삭제 / 수정할 수 있습니까?

0

C # (. NET 코어) , 74 바이트

n=>{for(int i=n[0];i<n.Count;){n.RemoveAt(i);i=i<n.Count?n[i]:n.Count+1;}}

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

이것은 정수 목록을 가져 와서 수정합니다. Lambda 인수 정의에서 정규화 된 이름을 사용하여 가져 오기를 둘러싼 Java 답변을 보았습니다. 이것이 허용되지 않으면이 답변을 제거 할 수 있습니다.


람다 정의에서 매개 변수 유형 생략을 언급하는 경우 허용 됩니다.
Jakob

@Jakob 이해합니다. System.Collections.Generic.List<int>대신 using System.Collections.Generic바이트 수에 추가하는 대신 약간 더럽습니다 . 그러나 배열을 사용하는 것과 다르지 않습니다.
jkelm

아, 알겠습니다 using원하는 경우 사용할 수 있습니다 . 람다 자체가 명령문에 의존하지 않는 한 바이트 수에 포함시킬 필요는 없습니다. 개인적으로 나는 항상 람다가 사용하는 것을 명확하고 쉽게 확인할 수 있도록 테스트 코드에서 정규화 된 이름을 사용합니다.
Jakob

0

R , 64 53 바이트

f=function(a,i=1,d=a[i]+1)"if"(is.na(d),a,f(a[-d],d))

재귀 기능. a건너 뛸 목록 인 필수 입력 이 있습니다. i는 건너 뛸 항목 수의 색인이며 (기본값은 1) d필요한 값이 제거 된 후 다음 항목의 색인이며 제거 할 항목의 색인이기도합니다. numeric(0)빈 출력을위한 빈 벡터를 반환 합니다.

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

언 골프 드 :

f <- function(a, i = 1, d = a[i] + 1) {
  if(is.na(d)) {   # d is NA if and only if a[i] is out of bounds
    a
  } else {
    f( a[-d], d, a[d] + 1 )   # a[-d] is a with the item at index d removed
  }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.