फंक्शन क्लिपबोर्ड: कॉपी


17

यह चुनौती MATL भाषा की कुछ विशेषताओं से संबंधित है, जो मई 2018 लैंग्वेज ऑफ द मंथ इवेंट के हिस्से के रूप में है । एसोसिएटेड चुनौती : फंक्शन क्लिपबोर्ड: पेस्ट


परिचय

MATL में कई क्लिपबोर्ड हैं , जहां आप बाद में (पेस्ट) प्राप्त किए जाने वाले मूल्यों (कॉपी) को स्टोर कर सकते हैं। कुछ क्लिपबोर्ड स्वचालित हैं , जिसका अर्थ है कि नकल कुछ घटनाओं द्वारा स्वचालित रूप से चालू हो जाती है। यह चुनौती स्वचालित क्लिपबोर्ड में से एक पर केंद्रित है, जिसे फ़ंक्शन-इनपुट क्लिपबोर्ड कहा जाता है , या बस फ़ंक्शन क्लिपबोर्ड

यह क्लिपबोर्ड सामान्य, इनपुट लेने वाले कार्यों के लिए चार सबसे हालिया कॉलों को इनपुट संग्रहीत करता है। 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

क्लिपबोर्ड को चार सूचियों की सूची के रूप में देखा जा सकता है। प्रत्येक आंतरिक सूची में फ़ंक्शन कॉल में इनपुट होते हैं, जिसमें सबसे हाल ही में कॉल होती हैं । प्रत्येक आंतरिक सूची के भीतर, इनपुट अपने मूल क्रम में हैं

तो कोड चलाने के बाद क्लिपबोर्ड सामग्री (पायथन संकेतन में) हैं:

[[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 में यह यूजर इनपुट को ट्रिगर करेगा)।

चुनौती

इनपुट : संख्या स्ट्रिंग के साथ एक स्ट्रिंग एस , +और U, रिक्त स्थान से अलग।

आउटपुट : स्ट्रिंग एस के मूल्यांकन के बाद फ़ंक्शन क्लिपबोर्ड की सामग्री ।

स्पष्टीकरण:

  • आप उन कार्यों का प्रतिनिधित्व करने के लिए अंकों के अलावा किसी भी दो लगातार प्रतीकों का उपयोग कर सकते हैं। इसके अलावा, आप अंतरिक्ष के बजाय विभाजक के रूप में किसी भी सुसंगत प्रतीक का उपयोग कर सकते हैं।
  • केवल दो संकेतित कार्यों पर विचार किया जाएगा।
  • इनपुट स्ट्रिंग में कम से कम एक नंबर शाब्दिक और कम से कम एक फ़ंक्शन होगा।
  • सभी नंबर सकारात्मक पूर्णांक होंगे, संभवतः एक से अधिक अंकों के साथ।
  • यह संभव है कि कुछ संख्या शाब्दिक किसी भी फ़ंक्शन द्वारा उपयोग नहीं किए जाते हैं, उदाहरण 2 में।
  • अतिरिक्त संख्या की आवश्यकता के बिना इनपुट को मान्य कोड होने की गारंटी है। इसलिए उदाहरण 3 में एक स्ट्रिंग कभी नहीं होगी।
  • आउटपुट में रिक्त आंतरिक सूचियों को अनुगामी किया जा सकता है। तो उदाहरण 2 में परिणाम हो सकता है[[400, 30], [20]]
  • कोई भी उचित, अस्पष्ट आउटपुट प्रारूप स्वीकार्य है। उदाहरण के लिए, आंतरिक विभाजक के रूप में अल्पविराम और बाहरी विभाजक के रूप में अर्धविराम के साथ एक स्ट्रिंग 400,30;20;;:।

अतिरिक्त नियम:

परीक्षण के मामलों

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]]पहला उदाहरण के लिए मान्य उत्पादन?
ओव्स

@ नहीं, प्रत्येक आंतरिक सूची के भीतर इनपुट मूल क्रम में होना चाहिए, जैसा कि फ़ंक्शन कॉल में है
लुइस मेंडो

हम्म, क्या हम ईटीएच से हतोत्साहित हैं, बस इसे MATL में हल कर रहे हैं? : पी
एरिक आउटगॉल्फ

1
क्या यह क्लिपबोर्ड है M?
ग्यूसेप

1
@Giussepe बिल्कुल! मैंने उस नाम का यहाँ उल्लेख नहीं किया है क्योंकि हम फ़ंक्शन का उपयोग नहीं कर रहे हैं M। मैं इसे "पेस्ट" चुनौती में करूंगा
लुइस मेंडो

जवाबों:


3

05AB1E , 20 बाइट्स

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

इसे ऑनलाइन आज़माएं!

-4 Emigna के लिए धन्यवाद (और साथ ही -8 मुझे नियमों के बारे में अद्यतन करने के लिए धन्यवाद)।

  • यू: a
  • +: b

4
:( ... ऐसा क्यों?
लुइस

@LuisMendo यह स्कोर इतना पाउंड है। :(
एरिक आउटोलॉफ़र


5

बैश , 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, एक स्टैक-आधारित भाषा में पास किया जाए, जैसे कि आवश्यक स्टैक आइटम मुद्रित किए जाएंगे।

इनपुट को सीड करने के लिए पाइप किया जाता है, जहां हर +को बदल दिया जाता है rdnFPrp+, जो dc में स्टैक पर दूसरे नंबर को प्रिंट करता है और उसके बाद प्रदर्शन करने से पहले टॉप नंबर को फिर से सेट करता है। भी sed हर की जगह Uके साथ p2^, शीर्ष ढेर तत्व प्रिंट और यह वर्ग।

पहला प्रतिस्थापन कमांड sसभी को प्रतिस्थापित करता है, जैसा कि g lobal flag द्वारा दर्शाया गया है g, के +साथ है rdnFPrp+। डीसी में,r शीर्ष दो स्टैक आइटम को स्वैप करता है, शीर्ष आइटम को dडुप्लिकेट करता है, nइसे एक नई Fरेखा के बिना प्रिंट करता है, 15 को स्टैक पर धकेलता है और Pइसे एक चरित्र (जो सीमांकक) के रूप में प्रिंट करता है r, फिर से स्वैप करता है, pशीर्ष आइटम को प्रिंट +करता है और फिर प्रदर्शन करता है शीर्ष दो स्टैक आइटम के अलावा।

हमारे पास एक और कमांड है, और सेड में, कमांड को या तो अर्धविराम या नईलाइन द्वारा अलग किया जाता है, जिनमें से पहला विकल्प चुना जाता है। बस होने ;बैश व्याख्या कर देगा कि sed कमांड के अंत के रूप में, इसलिए यह ए के साथ बच गया है\

अंतिम प्रतिस्थापन आदेश में, U विश्व स्तर पर प्रतिस्थापित किया जाता है p2^। डीसी में, pप्रिंट करता है, और 2^इसे दूसरी शक्ति तक बढ़ाता है।

सीड के परिणाम को dc कोड के रूप में eval'ed किया जाता है, संपूर्ण क्लिपबोर्ड को प्रिंट करता है।

डीसी को पाइप डीसी कोड के रूप में व्याख्या करता है। अब, सबसे हाल ही में कॉल नीचे और पुराने शीर्ष पर हैं।

चूँकि लाइनें उल्टे क्रम में होती हैं, tac( catइसे ठीक करने के लिए रिवर्स ) का उपयोग किया जाता है।

और अंत में, sed टैक से पहले 4 लाइनों को चुनता है।

यह करने का एक छोटा तरीका है head -4। sed एक समय में इनपुट की हर लाइन पर कमांड करता है। यदि कोई कमांड नहीं हैं, तो इनपुट के लिए कुछ भी नहीं किया जाता है, और इसे वैसे ही लौटा दिया जाता है। 4qsed को qलाइन पर कमांड करने के लिए कहता है । 4. जब sed इनपुट की लाइन 4 को प्रोसेस करता है, तो पहले तीन इनपुट पहले ही प्रिंट हो चुके होते हैं। कमांड qप्रोग्राम को क्विट करता है, इसलिए यह चौथी लाइन को प्रिंट करता है और क्विट करता है, इस प्रकार के बराबर परफॉर्म करता है head -4



4

हास्केल , 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

क्लीन , 140 बाइट्स

import StdEnv,Text
k[a,b:n]["+":s]=k[a+b:n]s++[[b,a]]
k[a:n]["U":s]=k[a^2:n]s++[[a]]
k n[v:s]=k[toInt v:n]s
k _[]=[]
$s=k[](split" "s)%(0,3)

इसे ऑनलाइन आज़माएं!

शास्त्रीय स्वच्छ शैली में, यह लगभग 50% लंबे समय को छोड़कर हास्केल समाधान है।


2

जावास्क्रिप्ट (ईएस 6), 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

ऑक्टेव , 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)

इसे ऑनलाइन आज़माएं!

यदि केवल ओक्टेव में एक popवाक्यविन्यास था। mमेमोरी क्लिपबोर्ड, tस्टैक है।


क्या आप निर्माण कर सकते हैं mऔर tरिवर्स में, अंत के बजाय सामने के तत्वों को जोड़ सकते हैं?
ग्यूसेप

ऊपर उल्लिखित रणनीति का उपयोग करते हुए 178 बाइट्स
ग्यूसेप

@ गिसेप्टी क्लीवर। मुझे हमेशा यह महसूस होता है कि आम तौर पर
जोड़


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

आर , 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

सी (जीसीसी) , 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");}

इसे ऑनलाइन आज़माएं!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.