एपीएल में गोल्फ के लिए टिप्स


28

मैंने हाल ही में एक कोड गोल्फ चुनौती शुरू की है और ऐसा लगता है कि विजेता गोल्फस्क्रिप्ट (आश्चर्य, आश्चर्य!) है। मजे की बात यह है कि एक और बहुत मजबूत प्रतियोगी था जिसके पास गोल्फस्क्रिप्ट पर जीतने के सभी मौके थे। इसका नाम एपीएल है। मुझे यहाँ एपीएल में लिखे गए बहुत सारे उत्तर दिखाई देते हैं। ऐसा लगता है कि यह भाषा कोड गोल्फिंग के लिए काफी कुशल है, इसलिए मैं एपीएल कार्यक्रमों के लिए आपके द्वारा जाने वाले किसी भी कोड गोल्फ टिप्स के लिए पूछने का निर्णय लेता हूं। कुछ कोड उदाहरण पोस्ट करने के लिए स्वतंत्र महसूस करें। आमतौर पर कार्रवाई में भाषा को देखना बहुत दिलचस्प है।

जवाबों:


23

संपादित करें : इसे पढ़ने वाले लोगों के लिए जो एपीएल को बिल्कुल नहीं जानते हैं, लेकिन इसे उठाना चाहते हैं, मास्टेरिंग डायलाग एपीएल एक बहुत अच्छा संसाधन है।

  1. मूल्यांकन सख्ती से दाएं-बाएं है। इसमें सेटिंग चर शामिल हैं, इसलिए इसका लाभ उठाएं।

    2+a, 1+a←1 -> 3 4

    aके लिए सेट है 1, 1+aमूल्यांकन करता है करने के लिए 2, a,2करने के लिए मूल्यांकन करता है 1 2और 2+1 2उनका मूल्यांकन करती है 3 4

  2. सी की तरह, एक फ़ंक्शन के साथ जोड़ा जा सकता है, अर्थात a +← 3। सी के विपरीत, यह सामान्य है: foo F← barसेट fooकरने के लिए F bar। थोड़ा अनायास ही, एक अभिव्यक्ति के रूप में यह लौटता है bar, नहीं F bar

    यह अनाम कार्यों के साथ भी काम करता है:

          a←0
          a+←3 ⋄ a
    3
          a+←3 ⋄ a
    6
          a { ⍵/'!' } ←4 ⋄ a
    !!!!
    
  3. आप एक सरणी को असाइन कर सकते हैं: A[3]←8जैसे कि आप अपेक्षा करेंगे। लेकिन आप एक ही समय में कई आइटम भी असाइन कर सकते हैं: A[3 5 6]←9 1 4या यहां तक ​​कि A[3 5 6]←9उन सभी को एक ही आइटम पर सेट कर सकते हैं। आप निश्चित रूप से, यहां भी एक फ़ंक्शन जोड़ सकते हैं। फ़ंक्शन को प्रत्येक तत्व पर अलग से लागू किया जाएगा, जैसे कि आपने किया था

  4. आपका दोस्त है, भले ही वह इसके बारे में बहुत खुश नहीं दिखता है।

    1. यदि Fडायडिक है, तो डाइएडिक तर्कों को स्विच करता है: a F b<-> b F⍨ a। यह काम आता है जब गोल्फ क्योंकि यह ब्रेसिज़ का उपयोग करने से बचा सकता है:

      (F G H x) K y      <->     y K⍨ F G H x
      

      इससे मूल्यांकन क्रम बदल जाता है, क्योंकि दाहिने हाथ का मूल्यांकन हमेशा बाएं हाथ से पहले किया जाता है।

    2. यदि Fडायडिक है, तो monadic फ़ंक्शन के दोनों किनारों पर एक ही तर्क लागू करता है:

            5⍴5
      5 5 5 5 5
            ⍴⍨5
      5 5 5 5 5
      

      तर्क का केवल एक बार मूल्यांकन किया जाता है। यह विशेष रूप से बाहरी उत्पादों के साथ काम में आता है, अर्थात् एक सरणी में अन्य मूल्यों के साथ एक सरणी में प्रत्येक मान की तुलना करने के लिए, आप करने के ∘.=⍨बजाय उपयोग कर सकते हैं x∘.=x←(whatever)

    3. यदि Fयह विवादास्पद है, तो कुछ भी नहीं करता है, लेकिन यह फ़ंक्शन को तर्क से अलग करता है। यदि यह जटिल है तो यह अभी भी आपको ब्रेस बचा सकता है:

            {⍵+3}⍣5 6
            ∇{⍵+3}              
           ∇ ⍣ 5 6              
            ({⍵+3}⍣5)6
      21
            {⍵+3}⍣5⍨6
      21
      
  5. मुहावरों को जानें! फिर मुहावरों को गोल्फ। उदाहरण के लिए:

    ((((1↑⍴X),⍴Y)↑X)^.=Y)⌿X
    

    यंत्रवत् में तब्दील किया जा सकता है:

    X⌿⍨Y^.=⍨X↑⍨(1↑⍴X),⍴Y
    

    और फिर आगे में:

    X⌿⍨Y^.=⍨X↑⍨(⊃⍴X),⍴Y
    

    (पहला) 1↑इस मामले में (एक) के बराबर होना । और संभवतः:

    X⌿⍨Y^.=⍨X↑⍨(≢X),⍴Y
    

    (टैली) ⊃⍴सभी लेकिन स्केलर के लिए (आकृति का पहला तत्व ) के बराबर होना ।


वहाँ रास्पबेरी पाई संस्करण होने के बगल में एक मुफ्त लाइसेंस प्राप्त करने का एक तरीका है?
फेनबाउट

स्पष्ट रूप से इसे प्राप्त करने का कानूनी तरीका।
फेनबौट

2
@ फैनआउट: dyalog.com पर आप एक मुफ्त विंडोज संस्करण डाउनलोड कर सकते हैं। "डाउनलोड ज़ोन" पर क्लिक करें और फिर "अनरजिस्टर्ड डाउनलोड" पर क्लिक करें। यह आपको पंजीकृत करने के लिए नाग होगा लेकिन अन्यथा यह पूरी तरह कार्यात्मक और स्वतंत्र और कानूनी है। यदि आप एक छात्र हैं, तो आप एक फॉर्म भरकर सामान्य संस्करण को मुफ्त में प्राप्त कर सकते हैं। यदि आप किसी ऐसे देश में नहीं रहते हैं जहाँ वे आपके जीवन को पायरेटिंग के लिए बर्बाद करते हैं, तो, आप जानते हैं कि क्या करना है।
marinus

Nars2000 भी है, एक खुला स्रोत कार्यान्वयन जिसमें डायलाग (और कुछ बग) की तुलना में कई अधिक विशेषताएं हैं। इसकी कुछ विशेषताएं गोल्फ के लिए काम में आती हैं, जैसे कि प्राइम नंबर फ़ंक्शन या मल्टीसेट्स।
टोबिया

1
जीएनयू एपीएल है।
एम। अलागन

14

ट्रेनें

A(f g h)B      ←→  (A f B)g A h B  ⍝ fork
 (f g h)B      ←→  (  f B)g   h B  ⍝ fork
A(  g h)B      ←→         g A h B  ⍝ atop
 (  g h)B      ←→         g   h B  ⍝ atop
 (A g h)       ←→  ({A} g h)       ⍝ "Agh" fork
 (f g h k)     ←→  (f (g h k))     ⍝ 4-train
 (f g h k l)   ←→  (f g (h k l))   ⍝ 5-train, etc
 (f g h k l m) ←→  (f(g h(k l m))) ⍝ groups of 3 from the right, last could be 2
  f∘g B        ←→    f g B         ⍝ "compose" operator, useful in trains
A f∘g B        ←→  A f g B

इसका मतलब यह है कि भविष्य के पाठकों के लिए, हमें ओबेरॉन को यह नहीं बताना चाहिए कि इसे कैसे छोटा किया जाए?
आदम

नहीं, जैसा कि आप आम तौर पर पीपीसीजी पर करते हैं। मैं उस लाइन को हटा देता हूँ जब अभिव्यक्ति पहुँचती है (मैं जो मानता हूं) वह सबसे छोटी है। यह एक आसान व्यायाम है - मुझे नहीं लगता कि आप व्यक्तिगत रूप से इससे लाभान्वित होंगे।
ngn

मैं इसे 16 तक नीचे ला सकता हूं, लेकिन मैं आपके किसी भी सुझाव का उपयोग नहीं कर रहा हूं, इसलिए शायद मैं इसे बंद कर दूं।
अदम

@ अच्छी तरह से, आप एक ट्रेन का उपयोग कर रहे हैं :) मेरा भी ऐसा ही था लेकिन अब क्योंकि मैं 30ML
ngn

क्या यह " दायें से 3 का समूह" नहीं है ?
आदम

7

ट्रेनों में /और निपटने के लिए ट्रिक्स

जब आप गाड़ियों का उपयोग कर रहे हों तो आप कटौती f/जैसे योग का उपयोग कर सकते हैं +/या कटौती को दोहरा सकते हैं //। हालांकि, अगर आपकी ट्रेन में कटौती के बाईं ओर अधिक हिस्से हैं, तो आपको एक एटॉप बनाने के लिए कोष्ठक की आवश्यकता है। यहां बाइट्स को बचाने के लिए कुछ ट्रिक्स दी गई हैं।

1∊मोनडिक के बजाय ∨/या ∨⌿बूलियन सरणियों पर उपयोग करें

टास्क: दो समान लंबाई वाले स्ट्रिंग्स A और B को देखते हुए, A और B के किसी भी संबंधित वर्णों के बराबर होने पर 2 लौटाएं, अन्यथा 0। उदाहरण के लिए A←'abc'और B←'def'देता है 0और A←'abc'और B←'dec'देता है 2

एक dfn समाधान हो सकता है A{2×∨/⍺=⍵}Bलेकिन आप इसे टैसिट करके छोटा करना चाहते हैं। A(2×∨/=)Bकाम करने वाला नहीं है क्योंकि ट्रेन के गठन के नियम इस तरह से पार्स करते हैं 2 (× ∨/ =)लेकिन आप चाहते हैं 2 × (∨/=)

निरीक्षण करें कि ∨/या ∨⌿बूलियन वेक्टर पर ( ∨/,या ∨⌿,उच्च रैंक सरणियों के लिए) पूछता है कि क्या कोई 1 मौजूद है, अर्थात 1∊, इसलिए हम अपनी ट्रेन को इस रूप में लिख सकते हैं 2×1∊=

ध्यान दें कि इसका सही तर्क है, इसलिए आप इसका उपयोग प्रत्येक पंक्ति या स्तंभ को अलग से कम करने के लिए नहीं कर सकते।

1⊥मोनैडिक +/या के बजाय का उपयोग करें+⌿

कार्य: सूचियों L और एक सूचकांक N की सूची को देखते हुए, Nth सूची का योग तीन बार लौटाएं। जैसे L←(3 1 4)(2 7)और N←1देता है 24

एक dfn समाधान हो सकता है N{3×+/⍺⊃⍵}Lलेकिन आप इसे टैसिट करके छोटा करना चाहते हैं। N(3×+/⊃)Lकाम करने वाला नहीं है क्योंकि ट्रेन के गठन के नियम इस तरह से पार्स करते हैं 3(× +/ ⊃)लेकिन आप चाहते हैं 3 × (+/⊃)

ध्यान रखें कि एकात्मक (आधार -1) में संख्याओं की सूची का मूल्यांकन करना सूची के समतुल्य है क्योंकि a { a , b , c , d } =  a + b + c + d  = ( a × 1³) + ( b × 1²) ) + ( c × 1¹) + ( d × 1।)। इसलिए +/a b c dजैसा है वैसा ही है 1⊥a b c d, और हम अपनी ट्रेन को इस प्रकार लिख सकते हैं 3×1⊥⊃

ध्यान दें कि उच्च-श्रेणी के तर्कों पर, 1⊥के बराबर है +⌿

स्केलर और / या वेक्टर तर्कों f.gके f/gसाथ उपयोग करें

कार्य: एक सूची एल और एक नंबर एन को देखते हुए सीमा 1 पूरी तरह से कम से कम विभाजन शेष की संख्या जब एल के तत्वों Neg से विभाजित कर रहे लौटने L←31 41 59और N←7देता है 1 2 3

एक dfn समाधान हो सकता है N{⍳⌊/⍺|⍵}Lलेकिन आप इसे टैसिट करके छोटा करना चाहते हैं। N(⍳⌊/|)Lकाम करने वाला नहीं है क्योंकि ट्रेन के गठन के नियम इस तरह से पार्स करते हैं ⍳ (⌊/) |लेकिन आप चाहते हैं ⍳ (⌊/|)

A f.g Bस्केलर दो कार्यों का आंतरिक उत्पाद जब तर्क स्केलर और / या वैक्टर समान f/ A g Bहोते हैं क्योंकि दोनों ही (A[1] g B[1]) f (A[2] g B[2]) f (A[3] g B[3])आदि होते हैं , इसलिए हम अपनी ट्रेन को इस प्रकार लिख सकते हैं ⍳⌊.|

ध्यान दें कि यह उच्च-श्रेणी के सरणियों के लिए काम नहीं करता है।

बूलियन बाएं और सरल वेक्टर सही तर्कों ∊⊆के /साथ उपयोग करें

कार्य: एक सूची L और एक संख्या N को देखते हुए, सूची को फ़िल्टर करें ताकि केवल N से अधिक संख्या बनी रहे। जैसे L←3 1 4और N←1देता है 3 4

एक dfn समाधान हो सकता है N{(⍺<⍵)/⍵}Lलेकिन आप इसे टैसीट करके छोटा करना चाहते हैं। N(</⊢)Lकाम करने वाला नहीं है क्योंकि बाध्यकारी नियम इसे पार्स करेंगे, (</) ⊢लेकिन आप ऑपरेटर को कम करने के बजाय /फ़ंक्शन प्रतिकृति बनाना चाहते हैं ।

बूलियन के साथ डायैडिक बाएं तर्क के विभाजन को बाएं तर्क में 1s के रन के अनुसार सही तर्क देता है, 0 से संकेतित तत्वों को छोड़ देता है। यह लगभग वही है जो हम चाहते हैं, अवांछित विभाजन के लिए बचाएं। हालाँकि, हम विमुद्रीकरण को लागू करके विभाजन से छुटकारा पा सकते हैं । इस प्रकार {(⍺<⍵)/⍵}बन सकता है {∊(⍺<⍵)⊆⍵}और इस प्रकार हम अपनी ट्रेन को इस प्रकार लिख सकते हैं ∊<⊆⊢

ध्यान दें कि यह उच्च-श्रेणी के सरणियों के लिए काम नहीं करता है।

0⊥इसके बजाय ⊢/या ⊢⌿संख्यात्मक तर्कों के साथ उपयोग करें

टास्क: एक सूची एल और एक नंबर एन को देखते हुए, एन को लेग के सबसे सही तत्व के साथ गुणा करें L←3 1 4और N←2देता है 8

एक dfn समाधान हो सकता है N{⍺×⊢/⍵}Lलेकिन आप इसे टैसिट करके छोटा करना चाहते हैं। N(⊣×⊢/⊢)Lकाम करने वाला नहीं है क्योंकि ट्रेन के गठन के नियम इस तरह से पार्स करते हैं ⊣ (× ⊢/ ⊢)लेकिन आप चाहते हैं ⊣ × (⊢/⊢)

इस बात 0⊥पर ध्यान दें कि एक न्यूमेरिक ऐरे के समान है ⊢⌿, इसलिए हम अपनी ट्रेन को इस प्रकार लिख सकते हैं ⊣×0⊥⊢

ध्यान दें कि यह उच्च-श्रेणी सरणियों के अंतिम प्रमुख सेल का चयन करता है।


1
हो सकता है कि आप इस चैट के जवाब को इसमें जोड़ सकते हैं ?
जे। सले

1
@ J.Sallé जोड़ा गया।
Adám

7

जोड़ के साथ गुणा का उपयोग करें

(a×b)+C  ->  a⊥b,C
(C)+a×b  ->  a⊥b,C
(a×b)-C  ->  a⊥b,-C

मान्यताओं:

  • aऔर bऐसे शब्द हैं जिन्हें वामपंथी तर्क के रूप में उपयोग करने के लिए आगे कोष्ठक की आवश्यकता नहीं है

  • C एक अभिव्यक्ति है जिसे बाएं तर्क के रूप में उपयोग करने पर कोष्ठक की आवश्यकता हो सकती है

  • a b C संख्यात्मक स्केलर्स का मूल्यांकन


5

जटिल आंकड़े

अक्सर अनदेखी की गई, वे ग्रिड, माज़, भग्न या ज्यामिति से निपटने वाले अभिव्यक्तियों को छोटा करने के अद्भुत अवसर प्रस्तुत करते हैं।

0j1⊥¨    0j1⊥   ⍝ pair(s) of reals -> complex
11 9∘○¨  11 9○  ⍝ complex -> pair(s) of reals
|z0-z1          ⍝ distance between two points
0j1×z   0j¯1×z  ⍝ rotate by ±90° around (0,0)
0j1*⍳4          ⍝ the four cardinal directions
+z       -+z    ⍝ reflect across x or y axis
+\0,z           ⍝ sequence of steps -> path
2-/z            ⍝ path -> sequence of steps
0j1⊥¨n-⍳2⍴1+2×n ⍝ lattice centred on (0,0)

4

अनुक्रमण modulo वेक्टर लंबाई

⊃i⌽aअक्सर भोले से छोटा होता है ⊃a[(≢a)|i]या a⊃⍨i|⍨≢a(जहां aएक सदिश राशि होती है और iपूर्णांक होता है, और ⎕io0 होता है)

इस पर एक उपयोगी भिन्नता (धन्यवाद इंगित करने के लिए EriktheOutgolfer) है: I↑Y⌽⍨I×Xजहां Yकुछ लंबाई- Iवैक्टर का संयोजन है और Xउदाहरण के लिए हम जिसे चुनना चाहते हैं उसका सूचकांक है:3↑'JanFeb...Dec'⌽⍨3×month


3

लगातार कार्य

=⍨और ≠⍨ngn के लिए धन्यवाद।

कभी-कभी आपको सूची के प्रत्येक तत्व के लिए केवल एक मूल्य की आवश्यकता होती है। हालाँकि, आपको उपयोग करने के लिए लुभाया जा सकता है {value}¨, यह उपयोग करने के लिए छोटा है, value⊣¨ लेकिन कुछ सामान्य मूल्यों के लिए, आप और भी कम उपयोग कर सकते हैं ⎕IO←0:

¯1के साथ है ⍬⍸list

0के साथ है ⍬⍳list

1के साथ है ⍬⍷list

ध्यान दें कि ये केवल सूचियों पर काम करते हैं (हालांकि वे नेस्टेड हो सकते हैं)। उच्च-रैंक सरणियों के लिए, आप सभी 0 और सभी 1s प्राप्त करने के लिए निम्नलिखित का उपयोग कर सकते हैं:

1के साथ है =⍨

0के साथ है ≠⍨

यदि आप सेट करते हैं ⎕ML←0, तो सभी संख्याओं को शून्य (जैसे कि ) के साथ बनाया जा सकता है :

आप केवल एक ही नंबर की आवश्यकता है, तो आप monadic उपयोग करने में सक्षम हो सकता है उपयोग करने के बजाय 1 या 0 प्राप्त करने के लिए 1⊣या 0⊣


" कभी-कभी आपको किसी सूची के प्रत्येक तत्व के लिए केवल एक मान की आवश्यकता होती है। " - यह उल्लेखनीय हो सकता है: जब वह मूल्य सूची का पहला तत्व है, तो आप उपयोग कर सकते हैं⊣\
ngn

@ मैं कहूँगा कि और साथ ही अपने खुद के एक पद के साथ /और योग्यता।
अदम

2

उपयोग

कोष्ठक से बचें

(Commute) कोष्ठकों से बचकर आप बाइट्स को बचा सकते हैं। जब भी आपके पास एक फ़ंक्शन होता है जहां बाएं तर्क को छोटा करना पड़ता है और सही तर्क नहीं होता है, तो आप एक बाइट बचा सकते हैं, जैसे (A<B)÷CC÷⍨A<B

डबल सरणियाँ

किसी सरणी की एक प्रति को उसके अंत में जोड़ना, उपयोग करना ,⍨Aया ⍪⍨A

डबल नंबर

2∘×डबल का उपयोग करने के बजाय , आप इसका उपयोग कर सकते हैं +⍨क्योंकि यह अपने आप में तर्क जोड़ता है: 1+2∘×1++⍨

वर्ग संख्या

2*⍨Yवर्ग का उपयोग करने के बजाय , आप इसका उपयोग कर सकते हैं ×⍨Yक्योंकि यह अपने आप से तर्क को गुणा करता है: 2*⍨A+B×⍨A+B

रैंडम क्रमपरिवर्तन

?⍨Nआपको लंबाई का एक यादृच्छिक क्रमांकन देगा N

स्व वर्गीकृत

प्रत्येक प्रमुख सेल की पहली घटना के सूचकांकों के साथ खोजें ⍳⍨A

एक बूलियन वेक्टर में अनुगामी 1s की गणना करें

इसके बजाय +/∧\⌽Bयह गिनने के लिए कि Nआपके द्वारा उपयोग किए जा रहे कितने अनुगामी 1s हैं ⊥⍨

रचना का उलटा

A f∘g Bहै A f g B, लेकिन अगर आप चाहते हैं (g A) f B, का उपयोग करें f⍨∘g⍨

उल्टा कम करें

f/ a1 a2 a3है a1 f (a2 f a3)। यदि आप चाहते हैं (a1 f a2) f a3, का उपयोग करें f⍨/⌽

स्कैन उल्टा

f\ A B Cहै
A (A f B) (A f (B f C))

f⍨/∘⌽¨,\ A B Cहै
A (A f B) ((A f B) f C)

f⍨\⌽ A B Cहै
((A f B) f C) (B f C) C

⌽f/∘⌽¨,\⌽ A B C। है
(A f (B f C)) (B f C) C


2

वर्णों को बिना स्ट्रिंग में संरेखित करें ⍳≢

कार्य: दो तार, एस और टी को देखते हुए, उनके संयोजन के सूचकांकों को सूचीबद्ध करें। जैसे S←'abcd'और T←'xyz'देता है 1 2 3 4 5 6 7

एक dfn समाधान हो सकता है S{⍳≢⍺,⍵}Tलेकिन आप इसे टैसीट करके छोटा करना चाहते हैं। ⍳≢,काम करने वाला नहीं है क्योंकि ट्रेन पार्सिंग नियम इस तरह से पार्स करेंगे (⍳)≢(,)लेकिन आप चाहते हैं (⍳≢),

एक खाली बाएं तर्क के साथ डायैडिक अपने वर्तमान आदेश के अनुसार सरल चरित्र सरणियों को ग्रेड करता है, जो कि जैसा है वैसा ही है ⍳≢। इस प्रकार {⍳≢⍺,⍵} बन सकता है {⍬⍋⍺,⍵}, इसलिए हम अपनी ट्रेन को इस प्रकार लिख सकते हैं ⍬⍋,

ध्यान दें कि यह संख्यात्मक या मिश्रित सरणियों के लिए काम नहीं करता है।


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