이 과제는 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], [], [], []]
(이것은 단순히 추가하는 프로그램에 의해 생성되는 7
과 5
).
실시 예 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
선택 이상의 숫자 . 따라서 가장 최근의 이러한 호출에 마지막 입력을 반환합니다 . 우리의 경우에 이것은 준다 . 이전의 개별 입력 값을 반환합니다 . 두 번째-마지막 호출의 마지막 입력 즉 , 및를 제공합니다 . 이제을 제공합니다 . 입력 이 함수 호출에서 유일한 입력 이었기 때문에 입력 을 건너 뛴 방법에 유의 하십시오. 마지막으로을 제공합니다 .5M
28
6M
11
7M
16
8M
12
9M
6
4
10M
5
예제 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
n
은4
또는 일 수 없습니다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
답변
답변
하스켈 , 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 버전을 사용할 수 있습니다
답변
답변
자바 스크립트 (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];
}
}