금지 된 내장


52

에서 표준 허점 , 다음이됩니다 금지 :

귀하의 답변이 "MyOwnLanguage"로 작성되었다고 주장합니다. 여기서 명령 x은 "일련의 숫자를 읽고 세 그룹으로 나누고 두 번째 숫자가 첫 번째보다 작은 해당 그룹의 마지막 숫자를 인쇄합니다"를 의미합니다.

여기서 우리는 똑같은 일을 할 것입니다.

태스크

길이가 3으로 나눌 수있는 양의 정수 시퀀스가 ​​주어지면, 그것들을 3 개의 그룹으로 나누고 두 번째 숫자가 첫 번째보다 작은 그룹의 마지막 숫자를 인쇄하십시오.

테스트 케이스

Input               Output
[]                  []
[1,2,3,4,5,6,7,8,9] []
[2,1,3,5,4,6,8,7,9] [3,6,9]
[3,1,4,1,5,9,2,6,5] [4]
[100,99,123]        [123]
[123,123,456]       []
[456,123,789]       [789]

채점

이것은 입니다. 바이트 단위의 최단 답변이 이깁니다.

표준 허점이 적용 되므로이x 작업을 수행 하는 기본 제공 명령 이 없어야합니다.


31
흠 ... 이제 명령 을 만들고 MyOwnLanguage추가하고 x
싶습니다

6
* 내장되어 있지 않아야 함 *‽ 이미 가지고 있다면 사용할 수 있습니까?
Adám

2
@ Adám 표준 허점에 x따라 해당 기능을 수행하는 내장 언어가 포함 된 언어를 사용할 수 없습니다 .
Leaky Nun

34
@LeakyNun 그렇습니다 . 도전 때문에 그러한 언어를 만들 수는 없습니다 . 당신의 언어가 도전에 앞서 있다면, 그것은 받아 들일 만합니다.
Adám

9
내장을 호출하면 p사용할 수 있습니까?
Mindwin

답변:



13

젤리 , 9 8 바이트

>Ḋm3T×3ị

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

작동 원리

>Ḋm3T×3ị  Main link. Argument: A (array)

 Ḋ        Dequeue; yield A without its first element.
>         Compare the elements of A with the elements of the result.
  m3      Select each third element, starting with the first.
    T     Truth; get all indices of truthy elements.
     ×3   Multiply those indices by 3.
       ị  Unindex; retrieve the elements at the redulting indices.

12

하스켈, 30 29 바이트

x(a:b:c:l)=[c|b<a]++x l
x d=d

Haskell에서 골프를 타는 첫 번째 시도입니다.

@JulianWolf 덕분에 -1 바이트


4
좋은 대답입니다! 관련 팁 은 codegolf.stackexchange.com/a/60884/66904 를 참조하십시오 . 특히, 두 개의 정의를 x d=d
Julian Wolf

영리한! 나는 그 대답을 미리 찾아 보았지만 정의가 변수를 재사용 한 부분을 놓 쳤어 야한다

11

수학, 37 바이트

이것이 사양을 만족한다고 가정하면, ngenisis는이 방법으로 1 바이트를 절약 할 수 있습니다.

BlockMap[If[#>#2,Print@#3]&@@#&,#,3]&

순수한 기능. BlockMap[...,#,3]&입력 목록을 길이가 3 인 하위 목록으로 나누고 함수를 사용하여 각 하위 목록에서 작동 If[#>#2,Print@#3]&@@#&합니다. 결과적으로 각 적격 마지막 번호가 인쇄됩니다. 이 함수는 값을 반환합니다 (즉, 입력 목록 인 경우 Nullsa 세 번째 목록). 이는 동작이 허용되는 것으로 보입니다.

매스 매 티카, 42 38 바이트

4 바이트를 절약 한 Martin Ender에게 감사합니다!

Cases[#~Partition~3,{a__,b_}/;a>0:>b]&

순수한 기능. #~Partition~3당신이 생각하는 것을합니다. pattern 과 일치하는 Cases[X,P:>Q]모든 요소를 ​​선택 하고 각 인스턴스에 적용된 변환 규칙의 결과를 반환합니다 . 여기서, 매칭되는 패턴이다 : 목록의 마지막 요소와 일치 하는 모든 다른 요소들 (이 경우, 제 2 개씩); 그 전화 와 지금을. 부적 절한은 다음에 확장 우리는 (사양은 모든 양의 정수가 될 것이라고 밝혔다 때문에 유효) 적용 할 시험이다. 그리고 변환 규칙은입니다 . 이는 순서대로 정렬 된 각 트리플을 마지막 요소로 간단히 바꿉니다.XP:>Q{a__,b_}/;a>0b_a__yza>0y>z>0:>b

원본 제출 :

Last/@Select[#~Partition~3,#.{1,-1,0}>0&]&

순수한 기능; #.{1,-1,0}각 3 요소 하위 목록의 첫 번째 요소와 두 번째 요소 사이의 차이를 계산하는 것 이외의 간단한 구현 입니다.


3
내적은 단정하지만 #>#2&@@#&짧습니다. 그러나 전반적 으로 사용하는 것이 여전히 짧습니다 .CasesSelectCases[#~Partition~3,{a__,b_}/;a>0:>b]&
Martin Ender

a>0:>그 안에 두 종류의 마법이 있습니다!
Greg Martin

BlockMap여기에 감탄하고 있습니다.
ngenisis

BlockMap[If[#>#2,#3,Nothing]&@@#&,#,3]&작동하고 39 바이트입니다 ... 우리는 몇 바이트를 저장할 수 있습니까?
Greg Martin

1
BlockMap[If[#>#2,Print@#3]&@@#&,#,3]&논란의 여지없이 사양
ngenisis를

8

Pyth, 10 바이트

eMf>FPTcQ3

테스트 스위트

eMf>FPTcQ3
       cQ3    Chop the input into groups of size 3
  f           Filter on
     PT       All but the last element
   >F         Apply the greater than function
eM            Map to the last element


5

Brachylog (2), 14 바이트

~c{Ṫ}ᵐ{k>₁&t}ˢ

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

Brachylog는 오히려 이런 종류의 문제로 어려움을 겪고 있습니다. 이 프로그램은 입력을 3 개의 그룹으로 나눠서 ( "그룹으로 분리"되어 있지 않음) 무차별 계산 복잡성을가집니다. 4 개의 그룹으로 빠르게 실행되지만 5 개로 매우 느리게 실행됩니다.

설명

~c{Ṫ}ᵐ{k>₁&t}ˢ
~c              Split into groups
  { }ᵐ          such that each group
   Ṫ            has three elements
      {     }ˢ  then on each element, skipping that element on error:
       k          with the list minus its last element
        >₁        assert that it's strictly decreasing
          &       and with the original list
           t      keep only its last element

l÷₃;?ḍ₍더 빠른 대안 이라고 언급 할 가치가 있습니다 .
Leaky Nun

나는 이전의 시도에서 그것을 가지고 있었지만 ( 여기서는 동등 /하지 않습니다 ÷.) 바이트가 길어 골프를 치면서 버렸습니다.

4

J , 14 바이트

_3&(>`[/\#]/\)

이것은 모나 딕 동사로 평가됩니다. 온라인으로 사용해보십시오!

설명

_3&(>`[/\#]/\)  Input is y.
_3&(    \    )  For each non-overlapping 3-element chunk of y,
    >`[/        check if first element is greater than second.
                Call the resulting array x.
_3&(        \)  For each non-overlapping 3-element chunk of y,
          ]/    take the last element.
         #      Keep those where the corresponding element of x is 1.

4

Alice , 12 11 바이트

1 바이트를 절약 해 준 Leo에게 감사합니다.

I.h%I-rI~$O

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

문자열코드 포인트를 입력 목록으로 사용 하고 유지해야하는 출력에 해당하는 문자를 출력합니다.

설명

I      Read x. Pushes -1 on EOF.
.h%    Compute x%(x+1). This terminates the program due to division by zero at EOF,
       but does nothing for non-negative x.
I      Read y.
-      Compute x-y. We only want to output z is this is positive.
r      Range. Pushes 0 1 ... n for positive n, and -n ... 1 0 for negative n
       (and simply 0 for n = 0). So this results in a positive number on top
       of the stack iff x-y is positive.
I      Read z.
~      Swap it with x-y > 0.
$O     Output z iff x-y > 0.
       Then the IP wraps to the beginning of the program to process the next triplet.

r대신을 사용하여 1 바이트를 골프화 할 수 있습니다 ex. TIO
Leo

@ 레오, 그거 정말 고마워요!
Martin Ender


3

dc , 30 바이트

[???sAz1[[lAps.]s.<.dx]s.<.]dx

I / O : 라인 당 하나의 숫자.



3

CJam , 15 바이트

{3/{)\:>{;}|}%}

스택에서 인수를 예상하고 결과를 스택에 남겨 두는 익명 블록.

온라인으로 사용해보십시오! (모든 테스트 사례를 실행)

설명

3/             e# Split the list into length-3 chunks.
  {            e# For each chunk:
   )           e#  Remove the last element.
    \:>        e#  Reduce the first 2 elements by greater than.
       {;}|    e#  If the first is not larger than the second, delete the third.
           }%  e# (end for)

3

Brain-Flak , 82 바이트

{([({}[{}()]<(())>)](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}{{}((<({}<>)<>>))}{}{}}<>

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

# Until the stack is empty (input is guaranteed to not contain 0)
{

  # Push 1 for greater than or equal to 0
  ([({}[{}()]<(())>)](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}
  #  ^------^  This part is Top - (Second + 1)

  # If the second number was less than the first...
  {{}

     # Get ready to push 2 zeros
     ((<

       # Move the next number to the other stack
       ({}<>)<>

     # Push those 2 zeros
     >))}

     # Pop 2 values.
     # This is either 2 zeros, or a 0 and a "last number" that shouldn't be printed
     {}{}

# End loop
}

# Switch to the stack where we stored the numbers to be printed
<>

3

젤리 , 10 바이트

s3µṪWx>/µ€

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

또는

테스트 사례 확인

@LeakyNun 덕분에 -3 바이트

설명

s3µṪWx>/µ€
s3         - split into groups of three
  µ     µ€ - on each group, do:
   ṪW      - return the third element as the only element of a list
     x     - repeat each element in that list the number of times
      >/   - corresponding to 1 if the second element of the group is greater than the first; 0 otherwise.


10 바이트 :s3µṪWx>/µ€
Leaky Nun

3

R, 37 바이트

scan()내가 싫어하는 버전 이지만 더 짧아집니다.

x=scan();x[(i<--1:1)>0][x[!i]<x[i<0]]

function()테스트하기 쉬운 버전 (41 바이트)

f=function(x)x[(i<--1:1)>0][x[!i]<x[i<0]]

@Giuseppe에게 감사합니다! 인덱스 재활용을 사용하는 것이 좋습니다.

테스트:

f(c())
f(c(1,2,3,4,5,6,7,8,9))
f(c(2,1,3,5,4,6,8,7,9))
f(c(3,1,4,1,5,9,2,6,5))
f(c(100,99,123))
f(c(123,123,456))
f(c(456,123,789))

산출:

> f(c())
NULL
> f(c(1,2,3,4,5,6,7,8,9))
numeric(0)
> f(c(2,1,3,5,4,6,8,7,9))
[1] 3 6 9
> f(c(3,1,4,1,5,9,2,6,5))
[1] 4
> f(c(100,99,123))
[1] 123
> f(c(123,123,456))
numeric(0)
> f(c(456,123,789))
[1] 789

함수를 정의하는 대신 처음 x에 사용하여 stdin에서 읽습니다 . 논리 인덱스가 재활용되기 때문에 x=scan()간단히 설정할 수도 있습니다 i=c(1,2,0).x=scan();i=c(1,2,0);x[!i][x[i>1]<x[i==1]]
Giuseppe


감사합니다 @ 주세페! x=scan()입력이 매우 번거로워서이 접근법을 좋아하지 않습니다 . 그리고 나는 그것을 반복 가능하게 만들 수 없습니다.
djhurio

2
그러나 목표는 가능한 한 짧은 코드를 생성하는 것입니다. 불행히도 우리 둘 다에게 다른 누군가가 더 나은 해결책을 찾았습니다!
주세페

Heh, 나는 잘 사용할 생각이 matrix()있었지만 어떻게 든 그렇게 짧게 만들 수 있다고 믿지 않았습니다.
djhurio

3

JavaScript (ES6), 46 44 42 41 39 바이트

a=>a.filter((_,y)=>y%3>1&a[y-1]<a[y-2])
  • Neil 덕분에 2 바이트를 절약했습니다 .

시도 해봐

공백없이 쉼표로 구분 된 숫자 목록을 입력하십시오.

f=
a=>a.filter((_,y)=>y%3>1&a[y-1]<a[y-2])
i.oninput=_=>o.innerText=JSON.stringify(f(i.value.split`,`.map(eval)))
console.log(JSON.stringify(f([])))                  // []
console.log(JSON.stringify(f([1,2,3,4,5,6,7,8,9]))) // []
console.log(JSON.stringify(f([2,1,3,5,4,6,8,7,9]))) // [3,6,9]
console.log(JSON.stringify(f([3,1,4,1,5,9,2,6,5]))) // [4]
console.log(JSON.stringify(f([100,99,123])))        // [123]
console.log(JSON.stringify(f([123,123,456])))       // []
console.log(JSON.stringify(f([456,123,789])))       // [789]
<input id=i><pre id=o>


설명

a=>              :Anonymous function taking the input array as an argument via parameter a
a.filter((_,y)=> :Filter the array by executing a callback function on each element,
                  with the index of the current element passed through parameter y.
                  If the function returns 0 for any element, remove it from the array.
y%3>1            :Check if the modulo of the current index is greater than 1.
                  (JS uses 0 indexing, therefore the index of the 3rd element is 2; 2%3=2)
&                :Bitwise AND.
a[y-1]<a[y-2]    :Check if the element at index y-1 in array a
                  is less than the element at index y-2
)                :End filtering method

1
않는 y%3>1&a[y-1]<a[y-2]일을?
Neil

교차 44 44 여전히 44
Roman Gräf

@ RomanGräf은 무슨 뜻인가요?
얽히고 설킨


"Arial,"Helvetica Neue ", Helvetica, sans-serif"의 버그
@Roman

3

껍질 , 8 바이트

ṁΓȯΓ↑<C3

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

설명

이 프로그램은 약간 관련되어 있으므로 나와 함께하십시오.

ṁΓȯΓ↑<C3  Implicit input (list of integers).
      C3  Split into slices of length 3.
ṁ         Map over slices and concatenate results
 ΓȯΓ↑<    of this function, explained below.

이 함수 ΓȯΓ↑<는 길이 3,의 목록을 취합니다 x = [a,b,c]. 첫 번째 는 and 로 Γ분할 하여 함수에 인수로 제공합니다 . 이 동등해야 하지만, 때문에 인터프리터의 버그 / 기능으로, 실제로 동등의 (A)의 조성물로서 해석 하고 . 이제, 일부 응용 프로그램을 사용하여 후자의 기능에 공급되고, 생성 된 함수 에 주어진다 해체하는 로 하고 . 그런 다음 로 공급되어 목록에서 첫 번째 요소 를 가져 오는 함수가 생성됩니다 . 이 기능은 최종적으로 ; 결과는 if 이며xa[b,c]ȯΓ↑<((Γ↑)<)(Γ(↑<))Γ↑<a↑<aΓ[b,c]b[c]b↑<ab<a[c][c]a>b[]그렇지 않으면. 이 목록은 최종 결과를 형성하기 위해 연결되어 암시 적으로 인쇄됩니다.

"기능"이 없으면 9 바이트가됩니다.

ṁΓoΓo↑<C3


2

MATL , 10 바이트

IeI&Y)d0<)

결과는 공백으로 구분 된 숫자로 표시됩니다.

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

또는 모든 테스트 사례를 확인하십시오 . 빈 배열이 실제로로 표시되도록 출력의 문자열 표현을 표시합니다 []. MATL에서 숫자는 싱글 톤 배열과 동일하므로 [4]로 표시됩니다 4.

설명

Ie    % Implicit input. Reshape as a 3-row matrix (column-major order)
I&Y)  % Split into the third row and a submatrix with the other two rows
d     % Consecutive difference along each column of the submatrix
0<    % True for negative values
)     % Use as logical index into the original third row. Implicitly display

2

로다 , 15 바이트

{[_3]if[_2<_1]}

로다는 골프 언어만큼이나 짧습니다 ...

스트림에서 세 개의 값을 가져 와서 _3두 번째 ( _2)가 첫 번째 ( _1) 보다 작은 경우 세 번째 ( )를 뒤로 푸시합니다 .

밑줄은 for루프 용 구문 설탕 이므로 프로그램을 {{[a]if[b<c]}for a,b,c}또는 로 작성할 수 있습니다 {[a]for a,b,c if[b<c]}.

어떤 이유로 TIO에서 작동하지 않기 때문에 TIO 링크가 없습니다 (도전 이전의 최신 Röda 버전에서 작동하지만).


2

자바 7, 86 85 바이트

void c(int[]a){for(int i=-1;++i<a.length;)if(a[i++]>a[i++])System.out.println(a[i]);}

@ PunPun1000 덕분에 -1 바이트

설명:

여기에서 시도하십시오.

void c(int[]a){                  // Method with integer-array parameter and no return
  for(int i=-1;++i<a.length;)    //  Loop over the array in steps of three at a time
    if(a[i++]>a[i++])            //   If the value of the current index is larger than the next:
      System.out.println(a[i]);  //    Print the value on the third index
                                 //  End of loop (implicit / single-line body)
}                                // End of method

@ PunPun1000 이제 3 대신 2만큼 반복을 증가 시켰으므로 ( 3,91,2,3,4,5,6,7,8,9대신 테스트 사례 와 같이) 잘못된 결과가 나타납니다 3,6,9.
Kevin Cruijssen

1
@Kevin_Cruijssen 죄송합니다. 증가 연산자를 사용하여 바이트를 계속 저장할 수 있습니다. -1에서 시작 하면됩니다. 온라인으로 사용해보십시오!
PunPun1000

@ PunPun1000 아, 맞아요. 감사!
Kevin Cruijssen

2

C #, 126 바이트

using System.Linq;i=>Enumerable.Range(0,i.Length/3).Select(u=>3*u).Where(u=>i[u]>i[u+1]).Select(u=>i[u+2]);

이 방법으로 전체 프로그램을 원한다면 175 바이트입니다 .

using System.Linq;namespace S{class P{static System.Collections.IEnumerable X(int[]i)=>Enumerable.Range(0,i.Length/3).Select(u=>3*u).Where(u=>i[u]>i[u+1]).Select(u=>i[u+2]);}}

TheLethalCoder의 도움으로 7 바이트 절약


당신은 단지 그것들을 인쇄 할 수 있습니다 ...
Leaky Nun

물론 @LeakyNun 할 수는 있지만 왜해야합니까? 나는 그것이 필요한지 묻지 않았고 더 많은 바이트가 될 것이라고 생각합니다.
MetaColon

(int[]i)단지 수 없다 i유형에 대한 필요.
TheLethalCoder

@TheLethalCoder 업데이트했습니다.
MetaColon

@MetaColon 중괄호도 필요하지 않습니다 (i).
TheLethalCoder


1

CJam , 16 바이트

q~3/{~@@>S{;}?}%

출력은 공백으로 구분 된 숫자로 표시됩니다.

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

설명

q~               e# Read input list
  3/             e# List of sublists of length 3
   {         }%  e# Apply this to each sublist
    ~            e# Push sublist contents: 3 numbers
     @@          e# Rotate twice. This moves first two numbers to top
       >         e# Greater than?
        S{;}?    e# If so: push space (used as separator). Else: pop the third number
                 e# Implicitly display


1

자바 스크립트, 108 (107) 108 바이트

이것은 유효한 JS 익명 (lambda) 함수입니다. x=시작 부분에 추가 하고처럼 호출하십시오 x([5,4,9,10,5,13]). 함수로 출력합니다 return.

a=>(y=[],a.map((c,i)=>(i+1)%3?0:y.push(a.slice(i-2,i+1))),y.map(v=>v[1]<v[0]?v[2]:null).filter(c=>c|c==0))

스 니펫은 입력을 쉼표로 구분 된 정수 목록으로 가져옵니다.

x=a=>(y=[],a.map((c,i)=>(i+1)%3?0:y.push(a.slice(i-2,i+1))),y.map(v=>v[1]<v[0]?v[2]:null).filter(c=>c|c==0))
martin.oninput = e => { dennis.innerHTML = x(martin.value.split`,`.map(c=>parseInt(c,10))) }
<input type=text id=martin><pre id=dennis>


더 긴 솔루션을 게시하고 martinand dennis를 id로 사용하는 요점은 무엇입니까 ?
Leaky Nun

@LeakyNun Shaggy는 내가 작업하는 동안 자신의 솔루션을 게시했습니다. 그러나 이것이 내 솔루션을 게시하지 않은 이유는 아닙니다. 이름을 id로 사용하는 것에 관해서는 재미있을 것이라고 생각했습니다.
Arjun

이 기능은 작동하지 않습니다 [5,4,9,10,5,13].
Shaggy

@Shaggy 테스트 케이스 스 니펫 구현에 문제가있었습니다. 솔루션에 아무런 문제가 없습니다. 실제로 입력 요소의 값은 항상 문자열입니다. 따라서 문자열을 분할하면 ,숫자가 아닌 문자열 배열이되었습니다! 해결책은 완벽합니다. 테스트 사례 스 니펫 만 잘못되었습니다. 나는 지금 그것을 고쳤다. 지적 해 주셔서 감사합니다! :)
Arjun

아, 그래, 그게 문제를 설명해! 감사 합니다 , @Arjun.
Shaggy

1

Perl5.8.9, 73 60 바이트

while(@F){@b=splice@F,0,3;$b[1]<$b[0]&&print$b[2]}print"-"

( 'n'플래그가 전체 파일을 읽고 a를 자동 분리하는 경우 58 + 2). 입력이 공백으로 구분 된 줄이라고 가정합니다.

Dada 덕분에 감소. 가시성을 위해 끝에 인쇄를 포함하면 8 바이트를 절약 할 수 있습니다.


좋은 것! 당신의 가치가 +1 되세요!
Arjun

출력 형식은 매우 유연하므로 마지막에 출력 형식을 넣을 필요는 없습니다 print"\n". 또한 $b[1]<$b[0]&&print"$b[2] "while@b=splice@a,0,37 바이트를 절약 할 수 있습니다 . 마지막으로, -a대신에 플래그를 사용할 수 있습니다 @a=split(자동으로 동일하게 수행하고 결과 @F대신에 저장 @a). Perl 5.8.9를 사용하면 -na최근 Perls를 사용하는 동안 -a충분합니다. 47-48 바이트가됩니다.
Dada

아, 난 몰랐어 나는 여전히 입력 라인 당 하나의 출력 라인을 수행해야한다고 생각합니다. 출력은 그렇지 않으면 이해할 수 없습니다.
Tom Tanner

1

클로저, 43 바이트

#(for[[a b c](partition 3 %):when(< b a)]c)

지루한 : /


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