기능 클립 보드 : 붙여 넣기


20

이 과제는 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

우리는 0 인덱스 n을 취할 수 있습니까 ?
Arnauld

3
@Arnauld 저는 MATL의 실제 행동을 기반으로하기 때문에 아니오라고 말할 것입니다.
Luis Mendo

답변:


3

젤리 , 8 바이트

ḊƇUẎ⁸;⁹ị

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


2
설명을 추가 하시겠습니까?
LordColus

@LordColus는 ḊƇ모든 비 싱글 렛을 선택하고 U반전하고 평평하게합니다. 입력의 [[11, 28], [12, 16], [4], []]경우 [16, 12, 28, 11], 5Mthrough 의 값을 얻습니다 8M. 이제 원래 입력을이 ⁸;목록에 추가하고 다른 입력에 의해 결과 목록에 색인을 작성하십시오 ⁹ị.
Lynn

@LordColus 아 죄송합니다, 요청에 대한 설명 만 추가했습니다 (닌자 때문에). 그러나 나는 잠들었습니다. Lynn은 거의 그것을 설명했지만, U결과를 ḊƇ뒤집지 않고 오히려 각 요소 를 추가하고 싶습니다 . 내가 어떻게 든 줄일 수있는 경우에만 ḊƇUẎ⁸;...
아웃 골퍼 Erik



3

자바 스크립트 (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]
}



2

자바 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];
        }
    }

2

05AB1E , 12 바이트

Díʒg<Ā}˜«s<è

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

설명

D              # duplicate input list
 í             # reverse each
  ʒg<Ā}        # filter, keep only elements that are longer than 1
       ˜       # flatten
        «      # append to original list
         s<    # decrement the second input
           è   # get the element in the list at that index

2

껍질 , 12 바이트

!S+(m;ṁ↔f(¬ε

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

설명

Haskell의 직접적인 답변은 다음과 같습니다.

!S+(m;ṁ↔f(¬ε  -- example inputs: [[1],[2,3],[4],[5,6,7],[]] 7
 S+           -- concatenate itself with itself modified by
        f(    -- | filter
           ε  -- | | length 1
          ¬   -- | | not
              -- | : [[2,3],[5,6,7],[]]
      ṁ       -- | map and flatten
       ↔      -- | | reverse
              -- | : [3,2,7,6,5]
              -- | map
              -- | | pure
              -- | : [[3],[2],[7],[6],[5]]
              -- : [[1],[2,3],[4],[5,6,7],[],[3],[2],[7],[6],[5]]
!             -- index into it: [2]

2

R , 58 바이트

function(M,n)c(M,unlist(lapply(M[lengths(M)>1],rev)))[[n]]

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

취하고 MA와 list벡터 c(); 이렇게 치환 [[하여 list(, [c(]함께 )R 테스트 케이스에 테스트 케이스를 변환한다.

n<=4"정의되지 않은 동작"이있는 입력의 경우 반환 NULL및 기타 유효하지 않은 입력의 경우 "첨자 범위를 벗어남"오류가 발생합니다.

function(M,n)
                                        [[n]]	# take the nth element of
c(M,                                   )	# M concatenated with:
    unlist(                           )		# the individual elements of
           lapply(               ,rev)		# in-place reversals of
                  M[lengths(M)>1]		# elements of M with length > 1

[n]대신을 사용하여 벗어날 수 있습니다 [[n]].
JAD

2

Stax , 12 14 13 바이트

àJ├∙ε╝F▀ÿi☻Ia

실행 및 디버깅

설명:

vsc{%vfr$r+@]|u Full program, unpacked, implicit input
vs              Decrement the number and get the list
  c{  f         Copy and filter:
    %v            Length not equal to 1?
       r$r      Reverse, flatten, and reverse again
          +     Concat orig array and and modified array
           @]|u Index, wrap into array, uneval

Stax, 12 바이트

Å{b≈\☼╣Δ@░ ‼

포장 풀기 :

{vsc{%vfr$r+@}

이것은 블록이므로을 제거 할 수 ]|u있지만 블록을 포장 할 때 이것이 유효한지 모르겠습니다.


2

J , 33 22 바이트

FrownyFrog의 솔루션 덕분에 -11 바이트 (1/3 단축)!

{0;],|.&.>;/@;@#~1<#&>

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

내 초기 솔루션 :

J , 33 바이트

<:@[{(,[:<"0@;[:|.&.>(1<#)&>#])@]

행복하지 않다-골프를 훨씬 더 많이 할 수 있다고 확신한다.

설명:

클립 보드 상태를 rigth 인수로 사용하는 왼쪽 함수는 왼쪽 인수입니다. n

<:@[ 왼쪽 인수에서 1을 빼다

{i오른쪽 목록에서 th 요소 (위에서 계산)를 선택합니다

(...) 전체 목록

#

] 클립 보드 상태 목록에서

(1<#) 길이가 1보다 큰 하위 목록

|.&.> 복사 된 각 하위 목록 회전

<"0@; raze and box-각 숫자를 별도의 상자에 넣습니다

, 클립 보드 상태 목록에 새 목록을 추가

@] 전체 동사를 (...) 모나 딕으로 만듭니다.

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


@FrownyFrog 0;가장 좋아 합니다. 감사!
Galen Ivanov

그것은 전적으로 귀하의 솔루션입니다, 그냥 골프 :)
FrownyFrog

2

V + coreutils , 53 45 43 42 40 바이트

-9 덕분 바이트 DJMcMayhem을 (사용하는 VGÇ /d이상 :,$g/^[^ ]*$/d, D@"dd이상 "aDÀdd!!이상 :.!)!

V에 대한 첫 번째 시도 (팁 환영합니다!) 아래 코드는 가독성을 위해 동그라미 문자 (예 : for \xf)를 사용합니다.

jäGⓞVGÇ /d
ⓞò!!tr \  \\n|tac
jòHD@"ddjdG

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

육각 덤프

00000000: 6ae4 470f 5647 c720 2f64 0a0f f221 2174  j.G.VG. /d...!!t
00000010: 7220 5c20 205c 5c6e 7c74 6163 0a6a f248  r \  \\n|tac.j.H
00000020: 4440 2264 646a 6447                      D@"ddjdG

설명

첫 번째 줄은 n을 포함하고 아래 줄은 클립 보드의 항목을 포함하며, 입력이 여러 개인 경우 각 항목은 공백으로 구분됩니다.

j                        " move to the beginning of the clipboard entries
 äG                      " duplicate the clipboard
   ⓞ                    " <C-o> move cursor to the beginning of the 2nd copy
     VG                  " select everything from cursor to the end of buffer and ..
       Ç /d              " .. delete every line that doesn't contain a space

ⓞ                       " <C-o> move cursor to the beginning of the 2nd copy (now without single arguments)
  ò                   ò  " do the following until the end of buffer
   !!                    "   on the current line execute the shell command
     tr \  \\n           "   replace spaces with newlines
              |tac⮠     "   and reverse the lines
                    j    "   move to next line

H                        " go to the beginning of buffer (where n is)
 D                       " delete n (stores it in register ")
  @"                     " that many times ..
    dd                   " .. remove the line
      j                  " move cursor to next line
       dG                " delete everything from here to the end of buffer


1

C (gcc) , 176 바이트

#define p printf("%d ",
int*_,i;f(x,n)int**x;{if(n<5){for(_=x[2*n-2];_-x[2*n-1];++_)p*_);}else{n-=4;for(i=0;i<8;i+=2)if(n&&x[i]+1-x[i+1])for(_=x[i+1];_-x[i]&&n;--_,--n);p*_);}}

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

배열을 4 개의 시작 / 끝 포인터 쌍 목록으로 취한 다음 n을 취합니다.

기술:

#define p printf("%d ",  // This gives us the short-hand for printing
int*_,                   // This defines _ as a pointer to int
i;                       // This defines i as an integer
f(x,n)int**x;{           // This defines f as a function taking int **x and int n
                         // NOTE: x is {start, end, start, end, start, end, start, end}
if (n<5) {               // This is for the 1-4 case
  for(_=x[2*n-2];        // Loop _ from the 'end pointer' 
  _-x[2*n-1];++_)        // Until the 'start pointer'
  p*_);                  // Using the short-hand, print *_
}else{                   // This is for the 5+ case
  n-=4;                  // Cut n to improve indexing
  for(i=0;i<8;i+=2)      // Loop over each 'start pointer index'
    for(_=x[i+1];        // Loop _ from the 'end pointer'
        _-x[i]&&n;       // Until the 'start pointer' or n becomes 0
        --_,--n);        // Decreasing n each time
  p*_);}}                // _ now points to the 'correct' index, so print it
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.