테이크 업 구현


30

소개 및 크레딧

멋진 전주가없는 오늘날 : 구현하십시오 takewhile.

이것의 변형 (사소한 데이터 구조에서)은 대학 기능 프로그래밍 과정에서 과제였습니다. 이 과제는 이제 마감되었으며 수업 시간에 논의되었으며 교수님이 여기에 게시 할 수있는 권한이 있습니다 (명백하게 요청했습니다).

사양

입력

입력은 양의 정수 목록 (또는 언어의 동등한 개념)이됩니다.

산출

출력은 양의 정수로 된 목록 (또는 언어의 동등한 개념)이어야합니다.

무엇을해야합니까?

당신의 임무는 takewhile고려중인 숫자가 짝수라는 것을 전제 로 구현하는 것입니다 (언어 내장 허용).

따라서 목록을 처음부터 끝까지 반복하고 조건 (짝수)이 유지되는 동안 출력 목록에 복사하고 조건을 충족시키지 않는 요소에 도달하자마자 작업과 출력을 중단합니다. (단계별 예제는 다음과 같습니다). 이 고차 기능을 takeWhile ( takewhile) 이라고도 합니다.

잠재적 코너 케이스

입력 목록과 비교하여 출력 목록의 순서는 변경되지 않을 수 있습니다 (예 : [14,42,2]되지 않음) [42,14].

빈 목록은 유효한 입출력입니다.

누가 이겼어?

이것은 코드 골프이므로 바이트 단위의 최단 답변이 이깁니다!

물론 표준 규칙이 적용됩니다.

테스트 벡터

[14, 42, 2324, 97090, 4080622, 171480372] -> [14, 42, 2324, 97090, 4080622, 171480372]
[42, 14, 42, 2324] -> [42, 14, 42, 2324]
[7,14,42] -> []
[] -> []
[171480372, 13, 14, 42] -> [171480372]
[42, 14, 42, 43, 41, 4080622, 171480372] -> [42, 14, 42]

단계별 예

Example Input: [42, 14, 42, 43, 41, 4080622, 171480372]

Consider first element: 42
42 is even (21*2)
Put 42 into output list, output list is now [42]

Consider second element: 14
14 is even (7*2)
Put 14 into output list, output list is now [42,14]

Consider third element: 42
42 is even (21*2)
Put 42 into output list, output list is now [42,14,42]

Consider fourth element: 43
43 is not even (2*21+1)
Drop 43 and return the current output list

return [42,14,42]

2
목록이 아닌 반복자를 반환해도 괜찮습니까?
DJMcMayhem

2
@ DrGreenEggsandIronMan 함수가 출력을 입력으로 가져 와서 동일한 형식으로 유지해야한다고 생각합니다.
mbomb007

@ DrGreenEggsandIronMan, 하위 목록을 반환하는 것이 출력 형식으로 활용되어야한다고 생각하지 않습니다. (하지만이 코드에서 이것을 악용하면 여전히 당신에게 달려 있습니다). Mbomb의 기준은 가장 적절하고 현재 과제와 호환되므로 "최소한 출력은 유효한 입력이어야합니다".
SEJPM

답변:


28

매스 매 티카, 18 바이트

#~TakeWhile~EvenQ&

빌트인 기능이없는 골프 언어로 3 배나되는 또 하나의 영광스러운 빌트인.


3
Mathematica에는 몇 개의 빌트인이 있습니까? 거의 모든 것이있는 것처럼 보입니다.
Emigna

35
@Emigna 나는 세지 않았지만 인터넷의 규칙 # 110은 "만약 존재한다면 Mathematica가 내장되어 있습니다."입니다.
마틴 엔더

3
@MartinEnder 인터넷의 규칙 # 110.5가 " 어떤 식 으로든 문자열을 포함하는 경우 규칙 # 110의 목적을 위해 존재하는 것으로 간주되지 않습니다."
LegionMammal978

@ LegionMammal978 해결책은 문자열을 표현의 머리로 만드는 것입니다. :)
LLlAMnYP

26

하스켈, 13 바이트

fst.span even

span술어 (-> even)가 false 인 첫 번째 요소 바로 앞에 입력 목록을 한 쌍의 목록으로 분할합니다 . fst쌍의 첫 번째 요소를 가져옵니다.

대체 버전, 13 바이트 :

fst.break odd

break는 반대입니다 span. 즉 술어가 true 인 첫 번째 요소에서 목록을 분할합니다.

물론 있습니다

takeWhile even

그러나 그것은 14 바이트입니다.


23

MATL , 6 바이트

toYs~)

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

설명

t    % Input array implicitly. Duplicate
o    % Parity of each entry. Gives 0 for even entries, 1 for odd
Ys   % Cumulative sum
~    % Logical negate. Gives true for the first run of even entries, and then false
)    % Use this as logical index into the original array. Implicitly display

22
이 코드가 미소로 "장난감"이라고 말하는 것이 정상입니까?
SEJPM

3
@SEJPM to~Y<)도 작동하지만 나는 이것을 좋아합니다 :-)
Luis Mendo

13

헥사 고니 , 19

2.}<@>%?<{>$"/\M!8;

읽을 수있는 :

  2 . }
 < @ > %
? < { > $
 " / \ M
  ! 8 ;

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

이것은 아마도 1 또는 2 바이트로 골프를 칠 수 있지만 실제로는 독창적 인 레이아웃이 필요할 수 있습니다.

높은 수준의 설명

프로그램은 주로이 의사 코드를 따릅니다.

while (read number is not zero) 
{
    if (number is even) 
        print number;
} 

STDIN이 비어 있으면 (0을 반환) Hexagony가 숫자를 읽으려고하는 방법을 남용합니다. 이 접근법에 대한 도움을 주신 Martin에게 감사드립니다.

전체 설명

나는 여전히 Timwi의 환상적인 난해한 IDE를 실행 하기 위해 Mono로 고민하지 않았 으므로 Martin에게 도움이되는 예쁜 그림을 제공하려고했습니다.

먼저, Hexagony의 기본 제어 흐름에 대한 작은 입문서. 이 프로그램에서 유일하게 사용되는 첫 번째 명령어 포인터 (IP)는 6 각형 소스 코드의 왼쪽 상단에서 시작하여 오른쪽으로 이동하기 시작합니다. IP가 육각형의 가장자리를 벗어날 때마다 육각형 side_length - 1의 중간 으로 행을 이동 합니다. 이 프로그램은 측면 길이가 3 각형 인 육각형을 사용하므로이 경우 IP는 항상 2 열씩 움직입니다. 현재 메모리 가장자리의 값에 따라 육각형의 맨 위 또는 맨 아래로 조건부로 이동하는 가운데 행에서 벗어나는 경우는 예외입니다.

이제 조건에 대해 조금. 제어 흐름 Hexagony 유일 조건문은 >, <상기 육각형의 중앙 가장자리. 이것들은 모두 일정한 규칙을 따릅니다. 현재 메모리 에지의 값이 0이거나 음의 제어 흐름이 왼쪽으로 이동하고 양의 경우 제어가 오른쪽으로 이동합니다. 보다 큼 및 큼 브래킷은 60도 각도로 IP를 리디렉션하는 반면 육각형의 가장자리는 IP가 점프하는 행을 제어합니다.

Hexagony에는 특수 메모리 모델이 있으며 모든 데이터는 무한 육각형 그리드의 가장자리에 저장됩니다. 이 프로그램은 세 개의 모서리 만 사용합니다. 하나는 두 개를 저장하고 다른 하나는 현재 읽은 숫자와 하나는 모듈로 2입니다. 다음과 같이 보입니다.

Mod  \ / Input
      |
      2

나는 프로그램을 설명하는 동안 각 시점에서 우리가 메모리에 어디에 있는지주의 깊게 설명하지 않을 것이므로, 우리가 메모리에 어디에 있는지 혼동되면 여기로 돌아 오십시오.

그 모든 것을 벗어나면 실제 설명이 시작할 수 있습니다. 먼저 메모리의 "2"에지를 2로 채운 다음 no-op를 실행하고 메모리 포인터를 오른쪽 ( 2.})으로 이동합니다 .

다음으로 메인 프로그램 루프를 시작합니다. STDIN에서 첫 번째 숫자를 읽은 다음 조건부 ( ?<)를 누르십시오 . STDIN에 숫자가 남아 있지 않으면 현재 메모리 가장자리에 0을 읽으므로 왼쪽 @으로을 돌려 프로그램을 종료합니다. 그렇지 않으면 미러를 반사하고 메모리 포인터를 뒤로 왼쪽으로 이동하고 육각형 주위를 감싸서 입력을 2로 나눈 나머지를 계산 한 다음 다른 조건부 ( /"%>) 를 누르십시오 .

Odd Path

나머지가 하나 인 경우 (즉, 숫자가 홀수 인 경우) no-op를 다시 실행하여 위의 파란색 경로를 따라 오른쪽으로 회전 한 다음 육각형의 맨 아래로 감싸고 현재 모서리에 10을 곱한 다음 여덟, 몇 미러를 튕겨, 같은 곱셈과 덧셈을 다시, 현재 가장자리에 188을 얻고, 육각형의 상단으로 다시 감싸고, no-op를 다시 실행하고, 마지막으로 프로그램을 종료합니다 ( .8/\8.@). 이 복잡한 결과는 행복한 사고였으며, 원래는 훨씬 더 간단한 논리를 작성했지만, Hexagony의 정신에 더 가깝다고 생각한 no-op에 찬성하여 제거 할 수 있음을 알았습니다.

Even Path

나머지가 0이라면 우리는 위의 빨간색 경로를 따라 왼쪽으로 돌립니다. 이로 인해 메모리 포인터가 왼쪽으로 이동 한 다음 값 (입력 값)을 숫자로 인쇄합니다. 우리가 만나는 거울은 우리가 움직이는 방향 ( {/!) 때문에 작동하지 않는 역할을합니다 . 그런 다음 이전의 입력 값이 이미 양수로 테스트되었으므로 육각형의 가장자리를 하나의 결과로만 조건부로 작동하므로 항상 오른쪽으로 이동합니다 (IP 방향으로 향하는 경우) . 그런 다음 입력을 10으로 곱하고 두 개만 추가하여 방향을 변경하고 대문자 M, 77의 ASCII 값으로 새 값을 감싸고 덮어 씁니다. 그런 다음 거울을 치고 중간의 가장자리를 벗어나십시오. 트램폴린이있는 육각형 (2<M\>$). 77이 양수이므로 육각형의 맨 아래로 오른쪽으로 이동하고 트램펄린 때문에 첫 번째 명령 ( !)을 건너 뜁니다 . 그런 다음 현재 메모리 에지에 10을 곱하고 8을 더해 778을 얻습니다. 그런 다음이 값 mod 256 (10)을 ASCII 문자로 출력하여 줄 바꿈이됩니다. 마지막으로 육각형을 빠져 나와 ?다음 입력 값으로 778을 재정의하는 첫 번째 부분으로 돌아갑니다 .


8
읽기 가능
Taylan

10

Pyth, 13 9 7 바이트

uPWs%R2

2 (아주 까다로운) 바이트에 대한 @FryAmTheEggman의 크레딧!

설명:

u       Q    keep applying to input until invariant:
 PW          drop last element if...
   s%R2G     ...any one is odd, G is the argument originally given the value of input

여기에서 테스트하십시오 .


1
이것은 정확한 변수 소개 설명이 아닙니다. G하나는 조건을위한 s%R2G것이고 다른 하나는 함수를위한 인수로서 소개 되어야합니다 P.
isaacg


8

파이썬 2, 43 42 바이트

def f(x):
 while"1'"in`map(bin,x)`:x.pop()

이 함수 는 인수를 제자리에 수정합니다 .

정말 영리한 방식으로 바이트를 골라내는 @xnor에게 감사드립니다!

Ideone에서 테스트하십시오 .


4
이것은 미친 짓이지만, "1'"in`map(bin,x)` 파이썬 2 와 같이 이상한 요소를 확인할 수 있다고 생각합니다 .
xnor

훌륭합니다. 감사!
Dennis

8

에드, 13

/[13579]$/,$d

때문에 실제 프로그래머가 사용하는 표준 텍스트 편집기를 .

각 줄에서 하나의 정수로 입력을받습니다. 같은 형식으로 출력합니다.

이것은 단순히 첫 번째 홀수 (홀수로 끝나는 숫자)를 찾아 파일 끝까지 해당 행에서 삭제합니다.


어 hh. 그것이 그 프로그램의 목적입니다.
고양이


6

파이썬, 45 44 바이트

f=lambda x:x and~x[0]%2*x and x[:1]+f(x[1:])

Ideone에서 테스트하십시오 .


Aww man .. 그리고 현상금이길 것으로 생각되는 기회가 있습니다
DJMcMayhem

1
2015 년 7 월 22 일 이전에 게시 된 제한이없는 순수 코드 골프 질문 만 해당됩니다.
Dennis

@DrGreenEggsandIronMan Mine 은 전체 시간보다 짧았습니다. 나는 내 것을 먼저 게시했다. : P
mbomb007

2
:) 생각했던 Dennis에 의해 outgolfed
shooqie

@ mbomb007 확실 합니까?
DJMcMayhem


5

05AB1E, 8 7 바이트

[DÉO_#¨

설명

[        # infinite loop start
 DÉO     # count odd numbers
    _    # push negative bool (turning 0->1, X->0)
     #   # if true (no odd numbers exist), break out of loop and implicitly print
      ¨  # else, remove last element from list

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

이전 8 바이트 솔루션

vyÈiyˆëq

설명

v         # for each y in input
 yÈi      # if y is even
    yˆ    # push y to global array
      ëq  # else terminate program
          # implicitly print global array

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


5

Brainf ***, 263 바이트

나는 여기 에서 작은 발췌 문장을 했다

>>>>>>,[>>>>>>,]>++++[<++++++++>-]>>>>>+>>>>>>>++++[<++++++++>-]<<<<<<<[<<<<<<]>>>>>>[[>>>>>>>++++[<-------->-]<]<<<<<<[->>>+<<<]>>>[-<+<<+>>>]<>>+>+<<<[-[->]<]+>>>[>]<[-<]<[-]<-[<[<<<<<<]>>>>>>.>>>>>>[>[-]++++[<++++++++>-]<.>>>>>>]>++++[-<++++++++>]<.[-]]>>>>>>]

나는 설명을 할 것이지만 더 이상 이것이 어떻게 작동하는지 전혀 알지 못한다.

공간 구분 번호와 같은 예상 입력 (예 2 432 1)


BF에서 ._. +1
TuxCrafting

할 수 있습니다 아마 골프의 체인 +>일부 로직을 사용하고 계십니까?
Rɪᴋᴇʀ

@ EᴀsᴛᴇʀʟʏIʀᴋ 상당수의 체인이 이미 골프를 쳤습니다. (그렇지 않으면 32 '+'s 행이 많을 것입니다) 아마도 일부를 >더 효율적으로 만들 수는 있지만 지금은 충분히 이해할 수 없습니다
anOKsquirrel

그렇기 때문에 메모장에서 코드를 작성할 때 주석을 달아야합니다. : P
mbomb007


4

라켓, 22 바이트

(λ(n)(takef n even?))

λ문자는 2 바이트로 계산됩니다.

내가 본 코드 골프 답변 중 라켓이 사용 된 것을 보지 못했기 때문에 적어도 한 번은해야했습니다!


2
나는 라켓에서 골프를 쳤었다.
고양이

4

미로 , 14 바이트

?:
"`#
"@%
\!;

입력과 출력은 줄 바꿈으로 구분 된 목록입니다 (원칙적으로 입력은 숫자 이외의 구분 기호를 사용할 수 있음).

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

이것은 내가 작성한 것 중에서 가장 컴팩트 한 미로 프로그램 일 것입니다.

흥미롭게 takewhile(odd)도 훨씬 간단합니다.

?:#
" %
\!/

설명

일반적인 미로 프라이머 :

  • 메모리 모델은 스택입니다 (실제로는 2 개가 있지만이 프로그램에는 하나만 필요합니다). 이는 임의 정밀도 정수를 유지하며 처음에는 (암시 적) 무한의 0을 보유합니다.
  • 제어 흐름 명령이 없습니다. 대신, 명령 포인터 (IP)의 이동은 코드 레이아웃에 의해 결정됩니다 (공간은 "벽"으로 간주되며 IP를 통과 할 수 없음). 일반적으로 코드는 IP가 직선 복도를 따라 구부러지는 미로와 유사하지만 접합점에 도달 할 때마다 현재 상태에 따라 IP의 새 방향이 결정되는 조건부 역할을합니다. 방향을 선택하는 규칙은 다음과 같이 요약됩니다. 스택의 상단이 0이면 IP는 계속 전진합니다. 상단이 양수이면 IP가 오른쪽으로 바뀝니다. 상단이 음수이면 IP가 왼쪽으로 바뀝니다. 이 방향 중 하나가 벽에 의해 막히면 IP는 반대 방향을 취합니다. 이 방법은 프로그램 없이 깨끗한 복도는 모든 단일 명령이 접합부 역할을하기 때문에 작업하기가 매우 어렵습니다. 이것이이 경우에 효과가 있다는 사실은 약간의 기적입니다.
  • IP는 첫 번째 공백이 아닌 문자에서 읽기 순서 ( ?이 경우)로 시작하여 동쪽으로 이동합니다.

프로그램을 통한 주요 흐름은 주변을 둘러싼 단일 루프입니다.

>v
^>v
^@v
^<<

공교롭게도, 우리는 스택의 상단이 후 제로 것을 알고 !"는 IP가 중심을 향해 회전하지 않도록 보장되도록. `그리고 %는 IP가 중심이되도록쪽으로 이동할 수있는 위치 반면에 조건부로 사용 @종료 프로그램, 또는 그 주변을 돌아 다니고 유지 수 있습니다.

루프의 코드를 보자 :

?   Read decimal integer N from STDIN, or 0 at EOF.
:   Duplicate. Since this is just a corner, the IP always turns south.
`   Negate the copy of the input (i.e. multiply by 1). At EOF, the result
    is still zero and the IP keeps moving south into the @. Otherwise, the
    top of the stack is now negative, and the IP turns east.
#   Push the stack depth (i.e. 2). Again, this is a corner, and the IP
    is forced to turn south.
%   Computer (-N % 2), which is identical to (N % 2) to determine the
    parity of the input. If input was odd, this gives 1, and the IP turns
    west into the @. Otherwise, the result is 0 and the IP keeps moving
    south, continuing the loop.
;   Discard the 0. This is a corner, so the IP is forced to turn west.
!   Print (and discard) N. The top of the stack is now one of the implicit
    zeros at the bottom, so the IP keeps moving west.
\   Print a linefeed. The IP is forced to turn north in the corner.
""  Two no-ops. The top of the stack is still zero, so the IP keeps moving north.

그리고 루프가 다시 시작됩니다.

그것은 왜 takewhile(odd)그렇게 단순한 지에 대한 의문을 제기합니다 . 두 가지 이유가 있습니다.

  • EOF는 0(짝수) 로 반환되므로 별도의 EOF 검사가 필요하지 않습니다. 어쨌든 목록은 그 시점에서 잘릴 것입니다.
  • 이제 우리는 때 종료 할 N % 2것입니다 0(반대로 1대신 조건 제어 수단은 우리가 단순히 다른 사본을 나눌 수 있습니다 흐름있는) N에 의해 N % 2입력이 홀수 인 경우, 단지 잎 것을 : N그리고 우리는 심지어 없애 가지고 N % 2'우리가 돈 (그래서 t need ;), 입력이 짝수이면 (자동) 0으로 나누기 오류로 프로그램을 종료합니다.

따라서 다른 코드는 분기를 전혀 허용하지 않는 간단한 루프입니다.


3

Brachylog , 19 16 바이트

hH : 2 % 0, βb & ~ b.hH; [].

s.:Mc?,.:{:2%0}a

설명

s.                 Output is an ordered subset of Input
  :Mc?,            The concatenation of Output with a list M is Input
       .:{:2%0}a   All elements of Output are even

오늘 나는 깔끔한 트릭 (19 바이트 답변에 사용됨)을 배웠습니다 : 목록의 시작 부분에 요소를 추가하는 ~b.hH것보다 짧습니다 :[H]rc.. 첫 번째는 "출력은 시작 부분에 추가 항목이있는 결과이며, 첫 번째 출력은 H" 이며 다른 하나는 "출력은 연결 [[H], Result]"입니다.


3

J, 10 바이트

{.~2&|i.1:

설명

{.~2&|i.1:  Input: s
   2&|      Take each value in s mod 2
      i.1:  Find the index of the first 1
{.~         Take that many values from s and return

1{.2&|<;._2]흥미 롭습니다 (긴하지만)
Leaky Nun

$대신 사용{.
FrownyFrog

3

파이썬, 41 바이트

lambda l:l[:[x%2for x in l+[1]].index(1)]

l홀수의 처음 발생하는 색인까지 자릅니다 . 인덱스는 1modulo 값에서 a 를 찾아서 찾을 수 2있습니다. 홀수를 찾지 못하도록하기 위해 1끝에 a 가 표시됩니다.



3

CJam , 11 바이트

두 번의 수정과 1 바이트 오프를위한 @Dennis에 감사합니다!

{1+_2f%1#<}

이것은 스택의 입력 배열을 예상하고 출력 배열을 스택에 남겨 두는 코드 블록 (함수와 동일; 기본적으로 허용됨)입니다.

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

설명

{         }    e# define code block
 1+            e# attach 1 at the end of the array
   _           e# duplicate
    2f%        e# modulo 2 of each entry
       1#      e# find index of first occurrence of 1
         <     e# slice before

3

레티 나 , 17 바이트

 ?\d*[13579]\b.*

후행 줄 바꿈이 중요합니다. 입력과 출력은 공백으로 구분 된 목록입니다.

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

이것은 간단한 정규식 대체이며, 첫 번째 홀수 (예 : 홀수 숫자로 끝나는 숫자)와 일치하며 가능한 경우 그 앞의 공백과 그 뒤에있는 모든 것을 빈 문자열로 대체합니다. 이후 입력에서 제거됩니다.

Leaky Nun이 지적한 것처럼 바이너리로 목록을 가져 가면 6 바이트를 절약 할 수 있지만 약간 불쾌한 것처럼 보이므로 아마도 십진 버전을 계속 계산할 것입니다.

 ?\d*1\b.*


바이너리로 목록을 가져올 수 있습니까?
Leaky Nun

3

자바 스크립트 (Firefox 30-57), 30 바이트

a=>[for(x of a)if(!(a|=x&1))x]

2

V , 13 바이트

íä*[13579]¾.*

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

설명:

í              "search for, on every line
 ä*            "Any number of digits
   [13579]     "Followed by an odd digit
          ¾    "Then the end of a word,
           .*  "Followed by anything
               "(implicit) and replace it with nothing.

편리하게도 동일한 코드를 사용하여 모든 테스트 사례를 동시에 확인할 수 있습니다.


2

Dyalog APL , 11 바이트

{⍵/⍨∧\~2|⍵}

2| 나눗셈이 2로 나눈 나머지

~ 부정하다

∧\ AND 스캔 (처음 0에서 꺼짐)

/⍨ 어디를 선택


2

루비, 25 바이트

->a{a.take_while &:even?}

잃어버린 것 같아 ...


->a{a.take_while &:even?}적어도 할 수 있습니까 ->a{a.take_while(&:even?)}?
마틴 엔더

@MartinEnder 감사합니다. 나는 그런 것을 찾고 있었지만 루비 골프 구문에 정통하지 않은 것 같습니다.
MegaTom

2

파이크, 8 바이트

0+2L%fhO

통역사 고정, 다른 링크 사용

split_at 함수에 변경 사항이 포함 된 것을 제외하고 Dennis의 방법을 사용합니다.

또는 버그 수정, 7 바이트

2L%1R@<

여기 사용해보십시오!

2L%     -   map(%2, input)
   1R@  -  ^.index(1)
      < - input[:^]

또는 두 번째 버그 수정 후 6 바이트

2L%fhO

여기 사용해보십시오!

설명:

2L%    -   map(%2, input)
   f   -  split_at(input, ^)
    hO - ^[0][:-1]

2

GolfScript, 11 바이트

다음은 문자열 화 된 GolfScript 배열 리터럴 (예 :)을 읽고 [28 14 7 0]첫 번째 홀수 요소와 제거 된 후의 모든 요소를 ​​사용하여 동일한 배열을 인쇄 하는 완전한 GolfScript 프로그램입니다 .

~1\{~&.},p;

온라인으로 사용해보십시오. (또한 : 테스트 하네스가있는 확장 버전. )

주석이 포함 된 골프 골드 버전 :

~     # evaluate input
1\    # push the number 1 onto the stack and move it under then input array
{     # start of loop body
  ~   #  bitwise negate the input number (making odd numbers even and vice versa)
  &   #  take bitwise AND of input and the saved number (0 or 1) on stack 
  .   #  duplicate result; filter loop will pop off the duplicate
},    # run loop above over input array, select elements for which it returns true
p     # stringify and print filtered array
;     # pop the number 0/1 off the stack

이 솔루션은 GolfScript를 기반으로합니다. { }, 필터 연산자를 연산자는 코드 블록의 내용을 배열의 각 요소에서 실행하고 블록의 코드가 true (예 : 0이 아닌) 값을 반환하는 배열의 요소를 선택합니다. 스택 상단.

따라서 예를 들어 {1&},배열에서 모든 홀수를 선택하고 모든 짝수를 {~1&},선택합니다. 따라서 첫 번째 홀수를 찾을 때까지 짝수를 선택하는 필터를 만드는 것이 문제입니다. 선택하고 이후에 숫자를 선택하지 않는 입니다.

내가 사용한 해결책은 상수 비트 마스크 1(각 입력 번호의 가장 낮은 비트를 추출하는 데 사용)를 이전 필터 루프 반복의 결과 (0 또는 1)를 저장하는 스택의 변수 로 바꾸는 것 입니다. 루프 전 1). 따라서 필터가 0을 한 번 반환하면 비트 마스크도 0으로 설정되어 필터가 다시 1을 반환하지 못하게합니다.


2

넷째, 114 바이트

Forth에는 실제로 목록이 없습니다. Forth에서 일반적인 것처럼 매개 변수는 스택에 역순으로 푸시되어야합니다. 결과는 스택에 동일한 순서로 남습니다. 어떤 이유로 든 Ideone에서는 작동하지 않지만 repl에서는 작동합니다. 어떤 종류의 모호성을 제거하려면 새로운 줄이 필요합니까?

: D DEPTH ;
: f D IF 1 D 1 DO D 1- ROLL LOOP D 0 DO I PICK 2 MOD IF D I LEAVE THEN LOOP
DO I ROLL DROP LOOP THEN ;

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

코멘트가없는 언 골프 드 :

: f DEPTH IF                                ( if stack not empty )
        1 DEPTH 1 DO DEPTH 1- ROLL LOOP     ( put 1 on bottom of stack )
        DEPTH 0 DO                          ( loop over entire stack )
            I PICK 2 MOD IF                 ( if stack[i] is odd )
                DEPTH I LEAVE               ( put range and exit loop )
            THEN
        LOOP
        DO I ROLL                           ( roll eyes )
            DROP
        LOOP                                ( iterate that range and remove )
    THEN
;

이 프로그램 (이전의 시도)은 홀수에 도달 할 때까지 결과를 인쇄합니다. 남은 것 (취하지 않은)은 모두 스택에 남습니다.

: f DEPTH IF BEGIN DUP 2 MOD DUP 1- IF SWAP . THEN UNTIL THEN ;

정수만 경우 실패


5
이 작업을 마친 후 아침이 차갑다는 것을 깨달았습니다. :(
mbomb007

너무 자주 나는 테이블에서 골프 코드 후 저녁 식사가 추워요. 아마도 Factor 는 당신이 동시에 더 생산적이고 골퍼하게 할 수 있습니까? : D
고양이

@c 온라인 IDE를 사용하여 PPCG에 대한 코드 개발을 수행합니다. 그러나 이미 알고 있기 때문에 Forth를 사용합니다. 머릿속에서 스택을 관리하는 것은 어렵습니다. Minecraft 모드가 MineOS라는 Forth 버전을 실행하는 레드 스톤 컴퓨터를 추가했기 때문에 원래 Forth를 배웠습니다.
mbomb007

2

베 펀지, 35 바이트

이 코드는 0에서 65535 사이의 숫자를 처리합니다.

1&:v
v-1_@#:@#<
>\:&:2%|
 \+1p4\< ^

입력 형식 :

number_of_values    values(separated by a space)

다음은 프로세스 마지막에 값을 표시하는 버전입니다.

1&:v>::   v                >00g1+:4g.v
v-1_^#:>#<>$$\$1-:10p000p0-| -g01p00:<
>\:&:2%|                   @
 \+1p4\< ^

here 코드를 테스트 할 수 있지만 다음과 같이 해석 할 때 후행 공백이있는 후행 줄을 추가해야합니다.

«코드 원환 체는 초기 프로그램만큼 큽니다. 데이터가 코드 끝을 넘어서게 될 경우 더 많은 행이나 후행을 삽입하십시오.»

바이트 수
nb 에서이 후행을 세지 않았으므로 이것이 허용 가능한지 모르겠습니다 . 코드에 숫자를 저장하기 때문에 인터프리터 가이 프로그램을 두 번 올바르게 실행하지 못하게하는 것 같습니다 방법. 다시로드해야합니다.


작동 방식 : 방법 통역사가 화살표를 따라 '#'을 건너 갈 때 지시를 건너 뜁니다.

회색 점이 테스트되고 빨간색 선이 불필요한 변수를 스택에서 제거합니다.

위의 인터프리터에서 here를 사용하면 저장된 값이 표현을 사용하여 코드에 표시됩니다 (형식을 모르겠습니다). 예, Befunge는 매우 반영적인 언어입니다

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