คลิปบอร์ดฟังก์ชั่น: วาง


20

ความท้าทายนี้จะเกี่ยวข้องกับบางส่วนของคุณสมบัติภาษา MATL ที่เป็นส่วนหนึ่งของพฤษภาคม 2018 ภาษาของเดือนเหตุการณ์ ความท้าทายที่เกี่ยวข้อง: คลิปบอร์ดฟังก์ชั่น: สำเนา


บทนำ

ฟังก์ชั่นคลิปบอร์ดของ MATL จัดเก็บ ("คัดลอก") อินพุตไปยังการโทรล่าสุดทั้งสี่ไปยังฟังก์ชั่นการบันทึกปกติ ฟังก์ชั่นปกติเป็นฟังก์ชั่นที่ใช้กันมากที่สุดใน 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ส่งคืนอินพุตทั้งหมดไปยังการเรียกใช้ฟังก์ชันล่าสุด ดังนั้นสำหรับตัวอย่างการพิจารณาจะให้,1128
  • ในทำนองเดียวกัน2M, 3Mและ4Mกลับปัจจัยการผลิตทั้งหมดที่สองสามและสี่ฟังก์ชั่นการโทรล่าสุด ดังนั้น2Mให้12, 16; 3Mให้4; และ4Mให้5, 6.
  • ตัวเลขที่นอกเหนือจากการ4เลือกแต่ละอินพุตเพื่อใช้งานการโทรที่ใช้มากกว่าหนึ่งอินพุต ดังนั้น5Mจะคืนค่าอินพุตสุดท้ายให้กับการเรียกล่าสุดดังกล่าว 28ในกรณีของเรานี้จะช่วยให้ 6Mส่งกลับก่อน11การป้อนข้อมูลของแต่ละบุคคลซึ่งเป็น 7Mผลตอบแทนการป้อนข้อมูลสุดท้ายของสายที่สองสุดท้าย, ที่อยู่, 16และช่วยให้8M 12ตอนนี้จะช่วยให้9M 6สังเกตว่าการ4ข้ามอินพุตนั้นเป็นเพียงอินพุตเดียวในการเรียกใช้ฟังก์ชัน สุดท้ายให้10M5

สำหรับสถานะคลิปบอร์ดในตัวอย่าง 3:

[[3], [2, 40, 34], [7, 8, 15], []]
  • 1M3จะช่วยให้ 2Mให้2, ,40 ให้, ,343M7815
  • 4Mมีพฤติกรรมที่ไม่ได้กำหนด (สำหรับวัตถุประสงค์ของการท้าทายนี้) เนื่องจากมีการเรียกใช้ฟังก์ชันเพียงสามครั้ง
  • 5M34จะช่วยให้ จะช่วยให้6M จะช่วยให้ จะช่วยให้ ให้, ให้407M28M159M810M7
  • 11M, 12M... ยังมีพฤติกรรมที่ไม่ได้กำหนด

ความท้าทาย

อินพุต :

  • สถานะคลิปบอร์ดเป็นรายการของรายการหรือรูปแบบที่เหมาะสมอื่น ๆ
  • เป็นจำนวนเต็มบวกn

เอาท์พุท : ผลลัพธ์ของฟังก์ชั่นการโทรMโดยมีnเป็นอินพุต ผลลัพธ์จะเป็นตัวเลขหนึ่งหรือหลายตัวที่มีตัวคั่นชัดเจนหรือในรูปแบบที่สมเหตุสมผลเช่นรายการหรืออาร์เรย์

ชี้แจง:

  • สถานะคลิปบอร์ดประกอบด้วยตัวเลขสี่รายการ รายการต่อท้ายบางรายการอาจว่างเปล่าเช่นในตัวอย่างที่ 2 และ 3 หากต้องการคุณสามารถป้อนคลิปบอร์ดโดยไม่ต้องมีรายการว่างต่อท้าย ดังนั้นตัวอย่างที่ 3 [[3], [2, 40, 34], [7, 8, 15]]จะกลายเป็น
  • ตัวเลขทั้งหมดในคลิปบอร์ดจะเป็นจำนวนเต็มบวกอาจมีมากกว่าหนึ่งหลัก
  • หมายเลขnรับประกันว่าถูกต้อง ดังนั้นสำหรับตัวอย่างที่ 3 ข้างต้นnไม่สามารถหรือ411

กฎเพิ่มเติม:

  • input และ output สามารถดำเนินการโดยวิธีการที่เหมาะสมใด

  • โปรแกรมหรือฟังก์ชั่นที่ได้รับอนุญาตในการเขียนโปรแกรมภาษา ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม

  • รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

กรณีทดสอบ

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]ค่าของผ่าน5M 8Mตอนนี้ย่อหน้าการป้อนข้อมูลเดิมในรายการนี้และดัชนีลงในรายการที่เกิดขึ้นโดยการป้อนข้อมูลอื่น⁸;⁹ị
Lynn

@ LordColus อ่าขอโทษฉันแค่เพิ่มคำอธิบายตามคำร้องขอ (เพราะนินจา) แต่ฉันหลับ Lynn อธิบายได้ค่อนข้างดี แต่ฉันต้องการเพิ่มที่Uไม่ได้ย้อนกลับผลลัพธ์ของḊƇแต่ค่อนข้างแต่ละองค์ประกอบ แต่ถ้าฉันอย่างใดสามารถลดḊƇUẎ⁸;...
เอริก Outgolfer

4

Haskell , 56 51 47 ไบต์

-5 -9 ไบต์ขอบคุณLaikoni (การจับคู่รูปแบบเพื่อให้แน่ใจว่ามีความยาว> 1 และใช้do-notation มากกว่าความเข้าใจในรายการ)!

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

ลองออนไลน์!

Pointfree, 58 55 ไบต์

-3 ไบต์ขอบคุณLaikoni (การเคลื่อนย้าย([]:)และการเปลี่ยนid)!

อีกทางเลือกหนึ่งเราสามารถใช้รุ่น pointfree นี้

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



3

JavaScript (Node.js) , 57 ไบต์

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

ลองออนไลน์!

นี่คือฟังก์ชั่นที่ไม่ระบุชื่อและ curated เรียกใช้ด้วย( 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

Java 8, 110 ไบต์

แลมบ์ดา (Curried) รับสถานะคลิปบอร์ดเป็น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];}}

ลองใช้ออนไลน์

Ungolfed

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

Huskขนาด 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]]

ลองออนไลน์!

ใช้เวลาMเป็น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 ไบต์

-11 ไบต์ (สั้นกว่า 1/3) ขอบคุณโซลูชั่นของ FrownyFrog!

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

ลองออนไลน์!

ทางออกแรกของฉัน:

J , 33 ไบต์

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

ไม่มีความสุข - ฉันค่อนข้างแน่ใจว่าสามารถตีกอล์ฟได้ไกลกว่านี้มาก

คำอธิบาย:

ฟังก์ชัน dyadic โดยใช้สถานะคลิปบอร์ดเป็นอาร์กิวเมนต์ที่เข้มงวดอาร์กิวเมนต์ซ้ายคือ n

<:@[ ลบ 1 จากอาร์กิวเมนต์ซ้าย

{เลือกiองค์ประกอบที่ (คำนวณข้างต้น) จากรายการทางด้านขวา

(...) รายการทั้งหมด

# สำเนา

] จากรายการสถานะคลิปบอร์ด

(1<#) รายการย่อยที่มีความยาวมากกว่า 1

|.&.> หมุนแต่ละรายการย่อยที่คัดลอก

<"0@; raze and box - ใส่ตัวเลขแต่ละตัวลงในกล่องแยกกัน

, ผนวกรายการใหม่เข้ากับรายการสถานะคลิปบอร์ด

@] ทำให้คำกริยาทั้งใน (... ) monadic

ลองออนไลน์!


@FrownyFrog ฉันชอบ0;มากที่สุด ขอบคุณ!
Galen Ivanov

นั่นเป็นวิธีการแก้ปัญหาของคุณทั้งหมดเพิ่งเล่นกอล์ฟ :)
FrownyFrog

2

V + coreutils , 53 45 43 42 40 ไบต์

-9 ไบต์ขอบคุณที่DJMcMayhem (ใช้VGÇ /dกว่า:,$g/^[^ ]*$/d, D@"ddมากกว่า"aDÀddและ!!มากกว่า:.!)!

ความพยายามครั้งแรกของฉันที่V (ยินดีต้อนรับเคล็ดลับ!) รหัสด้านล่างคือการใช้ตัวอักษรวงกลม (เช่นสำหรับ\xf) สำหรับการอ่าน:

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

ลองออนไลน์!

hexdump

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.