기능 클립 보드 : 붙여 넣기 일부로 일부 MATL

이 과제는 2018 년 5 월 Language of the Month 이벤트 일부로 일부 MATL 언어 기능과 관련이 있습니다 . 관련 챌린지 : 기능 클립 보드 : 복사 .


소개

MATL의 함수 클립 보드 는 일반적인 입력 기능에 대한 최근 4 개의 호출에 대한 입력을 저장합니다 ( “복사”). 정규 함수는 MATL에서 가장 일반적인 함수 유형입니다. 입력 은 기능이 하나 이상의 입력을 받음을 의미합니다. 저장된 클립 보드 내용을 스택에 밀어 넣을 수 있습니다 ( “붙여 넣기”).

이 과제는 클립 보드 내용을 입력으로받습니다. 클립 보드 상태를 생성 한 모든 함수는 하나 이상의 양의 정수를 입력으로 사용한다고 가정합니다. 따라서 클립 보드 상태는 숫자 목록으로 표시 될 수 있습니다. (클립 보드가 실제로 채워지는 방법에 대한 자세한 내용은 관련 챌린지를 참조하십시오. 그러나 현재 챌린지에는 필요하지 않습니다).

클립 보드 내용 해석

실시 예 1

번째 내부 목록은 가장 최근의 함수 호출 등을 나타냅니다 . 따라서 클립 보드 상태

[[11, 28], [12, 16], [4], [5, 6]]

마지막 함수 호출이 두 개의 입력 즉 11, 28; 두 번째 – 마지막으로 호출 입력을했다 12, 16; 등 (이 클립 보드 상태는 관련 챌린지의 첫 번째 예에서 코드로 생성됨).

실시 예 2

함수 호출이 충분하지 않은 경우 클립 보드의 일부 후행 내부 목록이 비어 있습니다.

[[7, 5], [], [], []]

(이것은 단순히 추가하는 프로그램에 의해 생성되는 75).

실시 예 3

함수 호출은 임의의 수의 입력을 가질 있지만 항상 1입력을받지 않는 함수는 클립 보드 상태를 변경하지 않습니다. 따라서 다음도 가능합니다.

[[3], [2, 40, 34], [7, 8, 15], []]

클립 보드 내용에 액세스

함수 클립 보드의 내용은 MATL의 함수를 사용하여 스택에 푸시됩니다 M(단, 일반 함수는 아니지만 클립 보드 함수). 이 함수는 양의 정수를 입력으로 취하고 다음과 같이 클립 보드 내용 중 일부를 스택으로 푸시합니다. 예제 1의 클립 보드 상태를 참조하십시오.

[[11, 28], [12, 16], [4], [5, 6]]
  • 1M모든 입력 을 가장 최근의 함수 호출로 반환 합니다 . 그래서, 고려 예를 들어, 준다 11, 28.
  • 이와 유사하게 2M, 3M그리고 4M세 번째, 두 번째로 모든 입력을 반환하고 네 번째 가장 최근의 함수 호출. 그래서 2M제공 12, 16; 3M준다 4; 및 4M제공 5, 6.
  • 하나 이상의 입력 을받은 함수 호출에 대한 개별 입력4 선택 이상의 숫자 . 따라서 가장 최근의 이러한 호출에 마지막 입력을 반환합니다 . 우리의 경우에 이것은 준다 . 이전의 개별 입력 값을 반환합니다 . 두 번째-마지막 호출의 마지막 입력 즉 , 및를 제공합니다 . 이제을 제공합니다 . 입력 이 함수 호출에서 유일한 입력 이었기 때문에 입력 을 건너 뛴 방법에 유의 하십시오. 마지막으로을 제공합니다 .5M286M117M168M129M6410M5

예제 3의 클립 보드 상태

[[3], [2, 40, 34], [7, 8, 15], []]
  • 1M제공합니다 3. 2M제공 2, 40, 34. 3M제공 7, 8, 15.
  • 4M정의되지 않은 동작이 세 개의 함수 호출이 되었기 때문에, (이 과제의 목적을).
  • 5M제공합니다 34. 6M제공합니다 40. 7M제공합니다 2. 8M제공합니다 15. 9M제공 8, 10M제공합니다 7.
  • 11M, 12M, … 또한이 정의되지 않은 동작을 .

도전

입력 :

  • 클립 보드 상태, 목록 목록 또는 기타 합리적인 형식;
  • 양의 정수 n .

출력 : n 을 입력으로 M하여 함수 를 호출 한 결과 . 결과는 모호하지 않은 구분 기호를 사용하거나 목록 또는 배열과 같은 합리적인 형식으로 하나 또는 여러 개의 숫자가됩니다.

설명 :

  • 클립 보드 상태는 4 개의 숫자 목록으로 구성됩니다. 예 2와 3에서와 같이 일부 후행 목록이 비어있을 수 있습니다. 원하는 경우 후행 빈 목록없이 클립 보드를 입력 할 수 있습니다. 예 3이됩니다 [[3], [2, 40, 34], [7, 8, 15]].
  • 클립 보드의 모든 숫자는 양의 정수이며 두 자리 이상의 숫자 일 수 있습니다.
  • 숫자 n 은 유효합니다. 따라서 예를 들어 위의 3 n4또는 일 수 없습니다 11.

추가 규칙 :

테스트 사례

Clipboard state
Number
Output(s)

[[11, 28], [12, 16], [4], []]
2
12, 16

[[11, 28], [12, 16], [4], []]
5
28

[[7, 144], [12], [4, 8], [3, 4, 6]]
1
7, 144

[[7, 144], [12], [4, 8], [3, 4, 6]]
10
4

[[30], [40], [50, 60], [70, 80, 90]]
2
40

[[30], [40], [50, 60], [80, 90]]
7
90

[[15], [30], [2, 3, 5], [4, 5, 10]]
3
2, 3, 5

[[15], [30], [2, 3, 5], [4, 5, 10]]
7
2



답변

젤리 , 8 바이트

ḊƇUẎ⁸;⁹ị

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


답변

하스켈 , 56 51 47 바이트

Laikoni 덕분에 -5 -9 바이트 (길이가 1 do보다 길고리스트 이해에 대해 -notation을 사용하도록 패턴 일치 )!

c!n=([]:c++do l@(_:_:_)<-c;reverse$pure<$>l)!!n

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

포인트 프리, 58 55 바이트

-3 덕분 바이트 Laikoni (이동 ([]:)및 교체를 id)!

또는이 pointfree 버전을 사용할 수 있습니다

(!!).(([]:)<>map pure.(>>=reverse).filter((1<).length)).


답변

APL (Dyalog Unicode) , 17 바이트

{⍺⊃⍵⍪∊⊖¨⍵⌿⍨1<≢¨⍵}

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


답변

자바 스크립트 (Node.js) , 57 바이트

a=>n=>a.map(e=>e[1]&&a.push(...[...e].reverse()))&&a[n-1]

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

익명의 카레 기능입니다. 로 실행( function code )(clipboard)(n)

설명

a=>n=>{
    // The strategy is to append the individual clipboard inputs to the end of a,
    // after the function calls (lists). We then return a[n-1] to offset JavaScript's
    // zero indexing.
    a.map(e=>{
        e[1]&& // if this list has more than one element...
            a.push(...[...e].reverse()) // add each element to a, in reverse order.
            // reverse() modifies the original array, so we have to use [...e] to "clone" e
    })
    return a[n-1]
}


답변

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

카레 구문으로 입력을 (clipboard)(n)받습니다.

a=>m=>a[m-1]||(g=r=>(r=r|a[k][1]&&a[k].pop())?--m<5?r:g(1):g(!++k))(k=0)

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


답변

파이썬 2 , 60 56 바이트

-4 바이트의 Jonathan Allan 에게 감사 합니다.

lambda l,n:(l+sum([b[::-1]for b in l if b[1:]],[]))[n-1]

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


답변

자바 8, 110 바이트

클립 보드 상태를 int[][]숫자로 사용 int하고 반환 하는 람다 (커리 됨) int또는 int[]하나의 숫자는 두 유형을 통해 반환 될 수 있습니다.

s->n->{if(--n<4)return s[n];else{int i=0,l;for(n-=4;(l=s[i].length)<=n|l<2;i++)n-=l>1?l:0;return s[i][l+~n];}}

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

언 골프

s ->
    n -> {
        if (--n < 4)
            return s[n];
        else {
            int i = 0, l;
            for (
                n -= 4;
                (l = s[i].length) <= n | l < 2;
                i++
            )
                n -= l > 1 ? l : 0;
            return s[i][l + ~n];
        }
    }