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


17

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


บทนำ

MATL มีหลายคลิปบอร์ดซึ่งคุณสามารถจัดเก็บค่า (คัดลอก) เพื่อเรียกคืนได้ในภายหลัง (วาง) บางคลิปบอร์ดเป็นแบบอัตโนมัติซึ่งหมายความว่าการคัดลอกจะถูกทริกเกอร์โดยอัตโนมัติจากเหตุการณ์บางอย่าง ความท้าทายนี้จะเน้นที่หนึ่งใน clipbards อัตโนมัติที่เรียกว่าคลิปบอร์ดฟังก์ชั่นอินพุตหรือเพียงฟังก์ชั่นคลิปบอร์ด

คลิปบอร์ดนี้จัดเก็บอินพุตไปยังการโทรล่าสุดทั้งสี่ไปยังฟังก์ชั่นถ่ายภาพปกติ ฟังก์ชั่นปกติเป็นประเภทที่พบมากที่สุดของฟังก์ชั่นใน MATL การรับข้อมูลหมายความว่าฟังก์ชั่นรับอินพุตอย่างน้อยหนึ่งฟังก์ชั่น (ฟังก์ชั่นที่ไม่มีการป้อนข้อมูลใด ๆ จะไม่ได้รับการพิจารณาโดยคลิปบอร์ดฟังก์ชั่น)

นี่เป็นการอธิบายที่ดีที่สุดด้วยตัวอย่างต่อไปนี้ซึ่งใช้สองฟังก์ชั่นปกติ:

  • +ซึ่งปรากฏตัวเลขสองตัวจากสแต็กและเพิ่มผลรวมของพวกเขา
  • Uซึ่งจะปรากฏตัวเลขหนึ่งและผลักสแควร์ของมัน

ตัวอย่างที่ 1 :

3 2 + 6 + 12 4 U + +

ก่อ39ผล รหัสถูกตีความดังนี้:

  • จำนวนตัวอักษรเช่น3หรือ12ถูกผลักไปที่สแต็ก
  • ฟังก์ชั่นเช่น+ป๊อปอินพุทและดันเอาต์พุตไปยังสแต็ก

การเรียกใช้ฟังก์ชันตามลำดับเวลาคือ:

  1. 3 2 + จะช่วยให้ 5
  2. 5 6 + จะช่วยให้ 11
  3. 4 U จะช่วยให้ 16
  4. 12 16 + 28
  5. 11 28 +39จะช่วยให้

คลิปบอร์ดสามารถดูได้ในรายการสี่รายการ รายการภายในแต่ละคนมีปัจจัยการผลิตเพื่อการเรียกฟังก์ชั่นที่มีการโทรล่าสุดก่อน ภายในรายการภายในแต่ละปัจจัยการผลิตที่อยู่ในคำสั่งเดิมของพวกเขา

ดังนั้นหลังจากรันโค้ดเนื้อหาของคลิปบอร์ดคือ (ในรูปแบบของ Python):

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

ตัวอย่างที่ 2 :

10 20 U 30 +

ปล่อยตัวเลข10และ430บนสแต็ก สแต็กจะแสดงด้านล่างขึ้นบนในตอนท้ายของโปรแกรม

การเรียกฟังก์ชั่นคือ

  1. 20 U จะช่วยให้ 400
  2. 400 30 + จะช่วยให้ 430

เนื่องจากมีเพียงสองฟังก์ชั่นการโทรบางรายการภายในกำหนดคลิปบอร์ดจะเป็นที่ว่างเปล่า โปรดทราบว่าวิธีการที่10ไม่ใช้เป็นอินพุตไปยังฟังก์ชันใด ๆ

ดังนั้นเนื้อหาคลิปบอร์ดหลังจากเรียกใช้รหัสคือ:

[[400, 30], [20], [], []]

ตัวอย่างที่ 3 (ไม่ถูกต้อง):

10 20 + +

ถือว่าไม่ถูกต้องเนื่องจากอินพุตที่สอง+หายไป (ใน MATL สิ่งนี้จะทริกเกอร์อินพุตของผู้ใช้โดยปริยาย)

ความท้าทาย

อินพุต : สตริงS ที่มีตัวอักษรตัวเลข+และUคั่นด้วยช่องว่าง

เอาท์พุท : เนื้อหาของคลิปบอร์ดฟังก์ชั่นหลังจากการประเมินสตริงS S

ชี้แจง:

  • คุณสามารถใช้สัญลักษณ์ที่สอดคล้องกันสองสัญลักษณ์เพื่อแสดงถึงฟังก์ชั่นเหล่านั้นนอกเหนือจากตัวเลข นอกจากนี้คุณสามารถใช้สัญลักษณ์ที่สอดคล้องกันเป็นตัวคั่นแทนการเว้นวรรค
  • จะมีการพิจารณาฟังก์ชันที่ระบุทั้งสองเท่านั้น
  • สตริงอินพุตจะมีตัวอักษรอย่างน้อยหนึ่งตัวและอย่างน้อยหนึ่งฟังก์ชั่น
  • ตัวเลขทั้งหมดจะเป็นจำนวนเต็มบวกอาจมีมากกว่าหนึ่งหลัก
  • เป็นไปได้ว่าฟังก์ชันบางตัวไม่ใช้ตัวอักษรตัวเลขบางตัวดังที่แสดงในตัวอย่างที่ 2
  • อินพุตรับประกันว่าเป็นรหัสที่ถูกต้องโดยไม่ต้องใช้หมายเลขเพิ่มเติม ดังนั้นสตริงในตัวอย่าง 3 จะไม่เกิดขึ้น
  • รายการด้านในว่างในผลลัพธ์สามารถเป็น ommited ดังนั้นผลลัพธ์ในตัวอย่างที่ 2 จึงเป็นได้[[400, 30], [20]]
  • รูปแบบเอาต์พุตที่สมเหตุสมผลและชัดเจนใด ๆ นั้นเป็นที่ยอมรับ 400,30;20;;ยกตัวอย่างเช่นสตริงด้วยเครื่องหมายจุลภาคเป็นตัวคั่นภายในและอัฒภาคเป็นตัวคั่นนอก:

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

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

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

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

กรณีทดสอบ

Input
Output

3 2 + 6 + 12 4 U + +
[[11, 28], [12, 16], [4], [5, 6]]

15 3 4 + 2 U 8 + U +
[[7, 144], [12], [4, 8], [2]]

3 6 9 12 + + 10 8 U 6
[[8], [6, 21], [9, 12], []]

8 41 12 25 4 5 33 7 9 10 + + + + + + + +
[[41, 105], [12, 93], [25, 68], [4, 64]]

10 1 1 + U U U U U
[[65536], [256], [16], [4]]

คือ[[28, 11], [16, 12], [4], [6, 5]]การส่งออกที่ถูกต้องสำหรับตัวอย่างแรก?
ovs

@ ไม่ได้อินพุตในแต่ละรายการภายในจะต้องอยู่ในลำดับเดิมนั่นคือในการเรียกใช้ฟังก์ชัน
Luis Mendo

อืมพวกเราหมดกำลังใจใช่มั้ยแค่แก้ปัญหานี้ใน MATL? : P
Erik the Outgolfer

1
เป็นคลิปบอร์ดนี้Mไหม
Giuseppe

1
@Giussepe ตรง! Mผมไม่ได้กล่าวถึงชื่อที่นี่เพราะเราไม่ได้ใช้ฟังก์ชั่น ฉันจะทำมันในความท้าทาย“ แปะ”
หลุยส์เมนโด

คำตอบ:


3

05AB1E , 20 ไบต์

A"D¸ˆn‚DˆO"4ô‡.V¯R4£

ลองออนไลน์!

-4 ต้องขอบคุณEmigna (รวมถึง -8 ด้วยขอบคุณที่เขาอัพเดทฉันเกี่ยวกับกฎ)

  • ยู: a
  • +: b

4
:( ... ทำไมต้องเป็นseRïõSเหรอ?
Luis Mendo

@LuisMendo คะแนนนี้ช่างยอดเยี่ยมมาก :(
Erik the Outgolfer

ขอให้เรายังคงอภิปรายนี้ในการแชท
Erik the Outgolfer

5

Bash , 43 ไบต์

sed s/+/rdnFPrp+/g\;s/U/p2^/g|dc|tac|sed 4q

ลองออนไลน์!

สิ่งนี้จะพิมพ์คลิปบอร์ดในรูปแบบต่อไปนี้สังเกตการใช้งานของ \ x0F เป็นตัวคั่น

item_1\x0Fitem_2
item_3
.
.
item_m\x0Fitem_n

แนวคิดหลักคือการส่งสิ่งนี้เข้าใน dc ซึ่งเป็นภาษาที่ใช้สแต็กเช่นรายการสแต็กที่ต้องการจะถูกพิมพ์

อินพุตถูกไพพ์ไปยัง sed โดยที่ทุก+ค่าถูกแทนที่ด้วยrdnFPrp+ซึ่งใน dc จะพิมพ์หมายเลขที่สองบนสแต็กตามด้วย \ x0F และจากนั้นหมายเลขด้านบนก่อนทำการเพิ่ม sed ยังแทนที่Uด้วยทุกอย่างp2^แล้วพิมพ์องค์ประกอบสแต็คด้านบนและสี่เหลี่ยมมัน

คำสั่งเปลี่ยนตัวครั้งแรกsแทนที่เป็นที่แสดงโดยกรัมธง lobal g, +S rdnFPrp+กับ ใน dc ให้rสลับไอเท็มสแต็กสองอันดับแรกdทำซ้ำไอเท็มด้านบนnพิมพ์โดยไม่มีการขึ้นบรรทัดใหม่Fกด 15 ลงบนสแต็กและPพิมพ์เป็นอักขระ (ซึ่งเป็นตัวคั่น) rสลับอีกครั้งpพิมพ์ไอเท็มสแต็กด้านบนแล้ว+ดำเนินการ นอกจากนี้ในรายการสแต็คสองอันดับแรก

เรามีคำสั่งอื่นและใน sed คำสั่งจะถูกคั่นด้วยเครื่องหมายอัฒภาคหรือบรรทัดใหม่ซึ่งเลือกตัวเลือกแรก เพียงมี;จะทำให้ทุบตีตีความว่าเป็นจุดสิ้นสุดของคำสั่ง sed \ดังนั้นมันจะหนีไปกับ

ในคำสั่งเปลี่ยนตัวที่ผ่านมาจะถูกแทนที่ทั่วโลกที่มีU p2^ใน dc ให้pพิมพ์และ2^ยกกำลังสอง

ผลลัพธ์ของ sed ถูกประเมินเป็นรหัส dc การพิมพ์คลิปบอร์ดทั้งหมด

ไปป์ที่ dc ทำให้ dc ตีความว่าเป็นรหัส dc ตอนนี้การโทรล่าสุดจะอยู่ที่ด้านล่างและโทรที่อยู่ด้านบนสุด

เนื่องจากบรรทัดอยู่ในลำดับtacย้อนกลับcatจึงใช้(ย้อนกลับ) เพื่อแก้ไขปัญหานั้น

และในที่สุด sed เลือก 4 บรรทัดแรกจาก tac

head -4นี้เป็นวิธีที่สั้นกว่าในการทำ sed ดำเนินการคำสั่งกับทุกบรรทัดของอินพุตหนึ่งครั้ง หากไม่มีคำสั่งจะไม่มีการดำเนินการใด ๆ กับอินพุตและจะถูกส่งคืนตามที่เป็นอยู่ 4qแจ้งให้ sed ดำเนินการคำสั่งqที่บรรทัดที่ 4 เมื่อ sed ประมวลผลบรรทัดที่ 4 ของอินพุตอินพุตสามรายการแรกได้ถูกพิมพ์ไปแล้ว คำสั่งจบการทำงานโปรแกรมจึงพิมพ์บรรทัดที่สี่และลาออกจึงมีประสิทธิภาพเทียบเท่าqhead -4



4

Haskell , 113 109 ไบต์

take 4.([]#).words
x:y:s#"+":r=(x+y:s#r)++[[y,x]]
x:s#"U":r=(x*x:s#r)++[[x]]
s#n:r=read n:s#r
_#_=[]
infix 4#

บรรทัดแรกกำหนดฟังก์ชั่นที่ไม่ระบุชื่อซึ่งจะใช้เวลาสตริงเช่น"3 2 + 6 + 12 4 U + +"และกลับรายการของรายชื่อของ ints [[11,28],[12,16],[4],[5,6]]นี้: ลองออนไลน์!



2

JavaScript (ES6), 107 ไบต์

จะเข้าเป็นรายการที่ประกอบด้วยจำนวนเต็มและ'+' 'U'ส่งคืนรายการอื่นที่ประกอบด้วยเลขจำนวนเต็มอาร์เรย์จำนวนเต็ม 2 จำนวนและ'_'สำหรับช่องว่าง

a=>a.map(x=>s.push(+x?x:(c=[x>[a=s.pop(),r=a*a]?a:[r=s.pop(),(r+=a,a)],...c],r)),s=[c='___'])&&c.slice(0,4)

ลองออนไลน์!

แสดงความคิดเห็น

a =>                          // a[] = input array
  a.map(x =>                  // for each entry x in a[]:
    s.push(                   //   update the stack:
      +x ?                    //     if x is a positive integer:
        x                     //       push x onto the stack
      :                       //     else:
        ( c = [               //       update the clipboard:
            x > [             //         compare x with '['
              a = s.pop(),    //         a = first operand
              r = a * a       //         use a² as the default result
            ] ?               //         if x is 'U' (greater than '['):
              a               //           save the 1st operand in the clipboard
            :                 //         else:
              [ r = s.pop(),  //           r = 2nd operand
                (r += a, a)   //           add the 1st operand
              ],              //           save both operands in the clipboard
            ...c              //         append the previous clipboard entries
          ],                  //       end of clipboard update
          r                   //       push r onto the stack
        )                     //
    ),                        //     end of stack update
    s = [c = '___']           //   initialize the stack; start with c = '___'
  ) &&                        // end of map()
  c.slice(0, 4)               // return the last 4 entries of the clipboard

2

ไป, 305 303 295 ไบต์

ลดลง 8 ไบต์ด้วย@ovs

func e(s string){b,v,w,x,r:=[][]int{{},{},{},{}},[]int{},0,0,0;for _,d:=range Split(s," "){if d=="+"{w,x,v=v[0],v[1],v[2:];r=w+x;b=append([][]int{[]int{x,w}},b...)}else if d=="U"{w,v=v[0],v[1:];r=w*w;b=append([][]int{[]int{w}},b...)}else{n,_:=Atoi(d);r=n};v=append([]int{r},v...)};Print(b[0:4])}

ลองออนไลน์!


2

ระดับเสียงคู่ , 206 ไบต์

s=strsplit(input(''));m=t=[];for z=s
if(q=str2num(p=z{1}))t=[t q];else
if(p-43)m{end+1}=(k=t(end));t(end)=k^2;else
m{end+1}=(k=t(end-1:end));t(end-1:end)=[];t(end+1)=sum(k);end
end
end
m(1:end-4)=[];flip(m)

ลองออนไลน์!

หาก Octave เท่านั้นมีpopไวยากรณ์ mเป็นคลิปบอร์ดหน่วยความจำtสแต็ค


คุณสามารถสร้างmและtย้อนกลับได้โดยเพิ่มองค์ประกอบไปยังด้านหน้าแทนที่จะเป็นส่วนท้ายหรือไม่
Giuseppe

178 bytesโดยใช้กลยุทธ์ที่ระบุไว้ข้างต้น
Giuseppe

@Genppe Clever ฉันมักจะรู้สึกว่าการต่อท้ายโดยทั่วไปจะสั้นกว่าการเตรียมตัว แต่ในกรณีนี้การ "จบ" จำนวนมากควรทำให้ฉันต้องพิจารณาอีกครั้ง
Sanchises


1

สีแดง , 335 330 ไบต์

func[s][b: copy[]foreach c split s" "[append b either c >"+"and(c <"U")[do c][c]]r: copy[]until[t: 0 until[not parse
b[to copy c[2 integer!"+"](insert/only r reduce[c/1 c/2]replace b c c/1 + c/2 t: 1)to end]]until[not parse b[to copy
c[integer!"U"](insert/only r to-block c/1 replace b c c/1 ** 2 t: 1)to end]]t = 0]take/part r 4]

ลองออนไลน์!

อ่านเพิ่มเติมได้:

f: func[s] [
    s: split s " "
    b: copy []
    foreach c s [
        append b either (c > "+") and (c < "U")[do c] [c]
    ]
    r: copy []
    until [
        t: 0
        until [
            not parse b [to copy c[2 integer! "+"]
            (insert/only r reduce[c/1 c/2]
            replace b c c/1 + c/2
            t: 1)
            to end]
        ]
        until [
            not parse b [to copy c[integer! "U"]
            (insert/only r to-block c/1
            replace b c c/1 ** 2
            t: 1)
            to end]
        ]
        t = 0
    ]
    take/part r 4  
]

1

R , 205 182 ไบต์

function(P){S=F
M=list()
for(K in el(strsplit(P," "))){if(is.na(x<-strtoi(K))){if(K>1){M=c(m<-S[1],M)
S[1]=m^2}else{M=c(list(m<-S[2:1]),M)
S=c(sum(m),S[-2:0])}}else S=c(x,S)}
M[1:4]}

ลองออนไลน์!

Mเป็นคลิปบอร์ดหน่วยความจำเป็นPโปรแกรมและSเป็นสแต็ก

ในทางเทคนิคSจะเริ่มต้นเป็นเวกเตอร์ที่มีศูนย์เดียว S={}แต่เนื่องจากเราไม่เคยได้รับการป้อนข้อมูลที่ไม่ถูกต้องก็ช่วยฉันไบต์จาก


1

C (gcc) , 264 ไบต์

ฉันใช้การสอบถามซ้ำเพื่อให้ฉันสามารถใช้ฟังก์ชั่นสแต็กเป็นสแต็กข้อมูล: รายการอินพุตถูกส่งผ่านและการดำเนินการถูกดำเนินการ: ผลลัพธ์ถูกแสดงในลำดับย้อนกลับโดยไม่มีการกดสแต็ก

กองถูกนำมาใช้เป็นรายการที่เชื่อมโยง นี่คือวิธีการทำงาน:

  • โหนดปัจจุบันถูกตั้งค่าด้วย [ตัวชี้ไปยังค่าตัวชี้ไปยังโหนดก่อนหน้า]
  • เพื่อผลักดันค่ามันจะถูกเก็บไว้และฟังก์ชั่นจะถูกเรียกอีกครั้งด้วยโหนดปัจจุบัน
  • หากต้องการแสดงค่าหรือแก้ไขค่าที่ด้านบนของสแต็กค่าของโหนดก่อนหน้านี้จะถูกแก้ไขและฟังก์ชันจะถูกเรียกอีกครั้งด้วยโหนดก่อนหน้า

เดิมทีฉันใช้โครงสร้างสำหรับโหนด แต่ฉันเปลี่ยนเป็นพอยน์เตอร์พอยต์เพื่อประหยัดพื้นที่ คุณลักษณะที่น่าสนใจของรายการที่เชื่อมโยงนี้คือมันล้างตัวเองเมื่อการเรียกซ้ำเสร็จสมบูรณ์

#define _ printf
f(char**s,int**p){int**w,v,*y[]={&v,p},m,n,t,z;w=y;z=1;return(*s?(**s-85?**s-43?(--z,t=14,v=atoi(*s)):(t=6,w=p[1],m=**w,**w+=n=**p):(t=0,w=p,**w*=m=**p),v=f(s+1,w),_(v<4?",[%d]\0,[%d,%d]\0"+t+!v:"",m,n),v+z):0);}g(char**s){_("[");f(s,0);_("]\n");}

ลองออนไลน์!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.