जम्मू में गोल्फ के लिए युक्तियाँ


33

GolfScript का अपना रास्ता बहुत दूर है और मुझे लगता है कि J में गोल्फ के लिए आसान संकेत का भंडार बुरे साम्राज्य के खिलाफ लड़ाई में मदद कर सकता है। भाषा को पहले से ही छोटा बनाने के लिए आपके पास क्या सुझाव हैं?

जे सीखने के इच्छुक लोगों के लिए, शुरुआत करने के लिए स्पष्ट स्थान jsoftware साइट है और विशेष रूप से शब्दावली , लर्निंग J गाइड और C प्रोग्रामर गाइड के लिए J है


1
GolfScript gets its own way far too often2019 में पढ़ने के बारे में कुछ मजेदार है।
असंबंधित स्ट्रिंग

जवाबों:


14

जे में अंतिम कुछ पात्रों को निचोड़ने के लिए कई सूक्ष्मताएं हैं। निम्नलिखित के लिए, मान लें कि प्रत्येक पूंजी अक्षर एक आदिम क्रिया है (यानी मैं उन रिक्त स्थान को हटा रहा हूं जो अन्यथा नामों को परिसीमित करने की आवश्यकता होगी)।

  • जब आपके पास एक ट्रेन जा रही हो, और आपको एक फंक्शन को एक दूसरे पार्टवे के माध्यम से लागू करने की आवश्यकता हो, ([:FLGR)और (LF@:GR)उसमें समान वर्ण हों, लेकिन (LF@GR)एक को बचाता है। यदि G का फ्रेम F के मोनड रैंक से अधिक या बराबर है, तो यह एक वैध परिवर्तन है। विशेष रूप से, सभी ट्रेनों में अनंत रैंक होती है, जैसे कि , ,. ,: ~. /: \: [ ]और अधिकांश उपयोग #और |.

  • यदि आपको किसी सूची में से तार निकालना है, और इन तारों का कोई स्थान नहीं है, तो उपयोग करें >i{ab`cd`ef। यह गंदा है, लेकिन यह आपको प्रत्येक नए स्ट्रिंग के लिए वर्णों को बचाता है, जब तक कि आप एकल पात्रों को नहीं खींचते हैं, और तब भी चारलिस्ट को छोटा होने के लिए लंबाई 4 होनी चाहिए। क्या हो रहा है कि अपरिभाषित नामों को क्रियाओं के संदर्भ के रूप में माना जाता है, और जब आप उन क्रियाओं के gerunds लेते हैं तो आपको नाम का एक बॉक्सिंग स्ट्रिंग मिलता है। कोई भी नाम जो पहले से ही टाइप संज्ञा, क्रिया विशेषण या संयोजन के रूप में परिभाषित किया गया है, इस फैशन में उपयोग नहीं किया जा सकता है, क्योंकि वे नाम उन पर हल होने से पहले हल `हो जाते हैं।

  • यदि आप पर्याप्त रूप से भाग्यशाली हैं कि उनके साथ काम करने के लिए एक अभिव्यक्ति है और न केवल एक मौन क्रिया है, तो यह लगभग हमेशा इसके लायक है कि आप किसी भी बिट्स को चर के लिए पुन: उपयोग करें, वे संज्ञाएं, क्रिया, या क्रियाविशेषण हैं। पैरेंस कभी-कभी अपने आप को सही तरीके से फिट करके वापस भुगतान करेंगे जहां आपके पास पहले स्थान था, और ऐसी अधिकांश परिभाषाएं इसके लायक हैं यदि वे एक बार फिर से उपयोग किए जाते हैं।

  • जैसे अनुमानों (FGH)^:(u`v`w)को फिर से लिखा जा सकता है u`v`w(FGH^:)। यह ट्रेन की किसी भी लंबाई के लिए काम करता है, यहां तक ​​कि 1 भी, हालांकि आप केवल कुछ भी बचाते हैं यदि यह चाल सही तर्क से पार्न्स को हटा देती है। यह चाल केवल तभी काम करती है जब आप बाएं ऑपरेंड को प्रीलोड करते हैं। (क्या हुआ अभी कुछ पता नहीं है? 'Tacit क्रिया विशेषण' देखें, और J Dictionary के पार्सिंग और निष्पादन अनुभाग का अध्ययन करें ।)

  • उपयोग न करें a.&i., उपयोग करें u:! {&a.और 3&u:लंबाई पर बराबर हैं, हालांकि, और पूर्व एक संयोजन (संयोजन के आधार पर) में अधिक उपयोगी हो सकता है।

  • जैसी चीजें हैं (2%~F)और (F%2:)लंबाई में बराबर हैं। यह उपयोगी है क्योंकि कभी-कभी, आपकी ट्रेन के बाकी हिस्सों की तरह क्या होता है, इस पर निर्भर करते हुए, आप इसे @कुछ हताश पात्रों को बचाने के लिए पहले बिंदु में लिखे गए ट्रिक्स के साथ पुनर्गठन कर सकते हैं । (और, अगर ट्रेन Fहै ]और ट्रेन एक सनक है, %&2एक चार, डुह को बचाता है।)

  • हुक जैसी गाड़ियों के साथ ]या [बाईं ओर क्रिया के रूप में, उदाहरण के लिए (]FGH)

    • ]आपको एक dyadic एप्लिकेशन को तोड़ने और सही तर्क का उपयोग करने देता है। ( (]FGH)~कम से कम 1 वर्ण के दंड के साथ बाईं ओर स्वैप , शायद अधिक।) एक चार से अधिक बचाता है (FGH)@], और गेरुन्ड में बहुत आसान है!
    • [एक हुक में मौद्रिक रूप से आपको सही पक्ष पर दुष्प्रभावों के लिए कुछ करने की अनुमति देता है, फिर तर्क को फिर से लौटाएं। सबसे आम उपयोग 1!:2, संभवतः जंक फॉर्मेटिंग के साथ है।
  • मैं / ओ बेकार है। आप जो कुछ भी कर सकते हैं, उसमें से लूप बनाकर प्रक्रिया को गति दें। 1!:1रैंक है 0, और दोनों के 1!:2 3रैंक _ 0, उदाहरण के लिए, तो यह 1s के एरे बनाकर उपयोग और चलाने 1!:1उन पर सीधे। ध्यान दें कि ".इसमें रैंक 1 भी है, इसलिए आप आमतौर पर इसे सीधे बाद 1!:1में भी रख सकते हैं, और इसे @shenaligans के माध्यम से या रैंक करने के लिए संलग्न नहीं करना होगा ।

  • इसे लगाने के लिए जगह ढूंढना आसान नहीं है, लेकिन ::उपयोगी हो सकता है।

    • ::]^:_उदाहरण के लिए, विशेष रूप से शक्तिशाली संयोजन है, जो आपको तब तक कुछ खतरनाक करने देता है जब तक आप इसे नहीं कर सकते। (सामान्य ^:_-के-ए-लूप कैविट्स के अधीन ।)

    • यह आपको {उन सूचियों पर भी उपयोग करने देता है जिनमें वांछित सूचकांक नहीं है, क्योंकि ऐसा होने पर एक डोमेन त्रुटि फेंकता है। उदाहरण के लिए उपयोगी यदि यह मौजूद है, तो केवल एक सूची के प्रमुख को ले जाएं ( ::]खाली सूची वापस करने के लिए, या ::_1:एक त्रुटि कोड वापस करने के लिए उपयोग करें , और इसी तरह)।

  • ]`($:@u)@.vआमतौर पर की तुलना में कम किया जा सकता है u^:v^:_, विशेष रूप से की परिभाषाओं पर uऔर vइसके साथ खेला जा सकता है। इसी तरह का मामला सशर्त जैसे u^:(1-v)बनाम के लिए है ]`u@.v। अपने विकल्पों पर विचार करें, खासकर जब आपके पास बहुत सारी नामित क्रियाएं हैं जिनके बारे में तैर रहा है। यह थोड़ा और अधिक लचीला है, लेकिन याद रखें, यदि उपयोग कर रहे हैं $:, तो एक पुनरावृत्ति गहराई है जो इसके खिलाफ टक्कर देना आसान है। (आमतौर पर 1800 पुनरावृत्तियों की तरह कुछ?)


प्रतिकूल चाल वास्तव में शांत है।
फ़ूजएक्सएक्सएल

"कुछ हताश पात्रों को बचाएं" जब आप जलाए हुए अध्ययन कर रहे हैं, तो सब कुछ एक स्थानांतरित एपिथेट की तरह दिखता है! :)
सोहम चौधरी

1
" %&2एक चार का उपयोग करके बचाता है, डुह।" और -:दूसरे को बचाता है!
लिन

11

सबसे महत्वपूर्ण बात जब जे में गोल्फिंग न केवल समस्या को समझना है, बल्कि समस्या को सरणी परिवर्तनों की एक श्रृंखला में कम करना है। जे कोड के साथ किसी भी सफलता के लिए आपको सोचने के इस तरीके को समझने की आवश्यकता है।

उदाहरण के लिए, हाल ही में आई एक चुनौती ने सबसे बड़ी सबर्रे समस्या को हल करने के लिए कहा इस समस्या को हल करने के लिए स्टॉक एल्गोरिदम कडाने के एल्गोरिथ्म में निम्नलिखित अनौपचारिक विवरण हैं:

सरणी और प्रत्येक स्थिति पर जाएं और यहां समाप्त होने वाली सबसे बड़ी सबरेरी का योग खोजें, जो कि वर्तमान सूचकांक में अधिकतम 0 या मान है और पिछली स्थिति में समाप्त होने वाले सबसे बड़े सबरे का योग है। इन सबमर्स की अधिकतम गणना करें क्योंकि आप पूरे एरे में सबसे बड़े सब्रे को खोजने जाते हैं।

अनिवार्य कोड में अनुवाद सीधा है:

  1. आज्ञा देना एक इनपुट सरणी हो।
  2. मैं ← ०।
  3. अगर मैं i लेन (ए) रिटर्न एम
  4. h ← अधिकतम (0, h + A [ i ])।
  5. m m अधिकतम ( m , h )।
  6. मैंमैं + 1।
  7. गोटो ३।

यह एल्गोरिदम एक नज़र में J के लिए जटिल लगता है क्योंकि एक स्पष्ट लूप है जो पहली बार में कमी की तरह नहीं दिखता है। यदि आपको पता चलता है कि एल्गोरिथ्म क्या कर रहा है, तो आप अलग-अलग चरणों को खोल सकते हैं और देख सकते हैं कि यह वास्तव में दो सरल सरणी ऑपरेशन करता है:

  1. प्रत्येक इंडेक्स पर समाप्त होने वाले सबसे बड़े सबरेज़ की लंबाई की गणना करने के लिए सरणी के माध्यम से स्कैन करें
  2. अधिकतम खोजने के लिए अधिकतम फ़ंक्शन के साथ इन लंबाई को कम करें

अब ये दो चरण जे में लागू करना बहुत आसान है। यहाँ एक अनुवाद है:

  1. (0 >. +)/\. y , 0- यह कदम जे के प्रतिमान को बेहतर रूप से फिट करने के लिए सरणी के दूसरे छोर से संचालित होता है। 0 >. +के लिए मौन है 0 >. x + y
  2. >./ y

एक साथ रखें, हमें एल्गोरिथ्म का एक बहुत ही महत्वपूर्ण कार्यान्वयन मिलता है:

>./ (0 >. +)/\. y , 0

यदि आप एल्गोरिदम के कार्यान्वयन के दृष्टिकोण के इस तरीके को सीखते हैं, तो आपके समाधान इस कोड के समान होंगे।

यहाँ कुछ ट्रिक्स हैं जिन्हें मैंने समय के साथ संचित किया है। जे गोल्फिंग में अधिक ज्ञान प्राप्त करने के साथ ही इस सूची का विस्तार किया जाएगा।

  • शब्दकोश सीखें। यह वास्तव में अस्पष्ट क्रियाओं का एक बहुत कुछ है जो तब तक कोई मतलब नहीं है जब तक आप यह नहीं देखते कि वे कितने उपयोगी हैं। उदाहरण के लिए, =पहली बार में विचित्र है, लेकिन ASCII कला चुनौतियों में बहुत उपयोगी है।
  • &जब आप शक्ति संयोजन चाहते हैं, तो टैसिट संदर्भों में डाइएडिक का उपयोग करें । शब्दावली मैं और मैं u@[&0करने के लिए एक मौन प्रतिस्थापन के रूप में सुझाव देते 4 : 'u^:x yहैं।
  • कई मामलों में आप एक [:या @:एक अनुक्रम में से बच सकते हैं जैसे u@vकि एक संस्करण का चयन करके uएक तर्क दिया जाता है। उदाहरण के लिए, के परिणाम के पहले आइटम को छोड़ने के लिए v, 1}.vइसके बजाय का उपयोग करें [:}.vयदि }.@vकिसी कारण के लिए संभव नहीं है।
  • ] vv@]यदि आप vएक डायैडिक संदर्भ में मानदिक का उपयोग करना चाहते हैं तो अक्सर इससे कम होता है। यह विशेष रूप से तब आता है जब vक्रियाओं की एक लंबी ट्रेन होती है।
  • कभी-कभी आप m (n v w) yइसके बजाय लिख सकते हैं (n v m&w) y। इससे रिक्त स्थान और कोष्ठक से बचना संभव हो सकता है।
  • #\के बजाय >:@i.@#
  • u &. vएक उपयोगी है जब vएक अग्रभाग है। जब नहीं, तो आप उपयोग करना चाहते हैं [: vinv u & vया u & (v :. vinv)इसके बजाय कर सकते हैं ।
  • रैंक को समझें और इसका उपयोग कैसे करें। रैंक संयोजन के साथ चारों ओर फिडेलने का प्रयास करें जब तक आपको कुछ ऐसा न मिल जाए जो फिट बैठता है। यह समझने में मदद करता है कि रैंक आपके कोड को कैसे प्रभावित करता है।
  • ^:_ एल्गोरिदम के लिए बेहद उपयोगी है, जहां आप बाढ़-भराव या सिमुलेशन की तरह अभिसरण तक पहुंचना चाहते हैं।
  • अपने मानक पुस्तकालय को जानें। इसमें बहुत उपयोगी कार्य हैं जो आपको टन पात्रों को बचाते हैं।
  • कॉपुलो =.और =:एक वाक्यांश में कहीं भी एम्बेड किया जा सकता है। वन-लाइनर्स बनाने के लिए इसका उपयोग करें जहां टैसिट नोटेशन पर्याप्त नहीं है।
  • ,बहुआयामी सरणियों को कम करते समय कई कटौती के बजाय मोनैडिक का उपयोग करें ।
  • समझें कि जब विशेष रनटाइम सीमाओं को लागू करता है तो वाक्यांश विशेष कोड द्वारा समर्थित हैं। कुछ उपयोगी चीजें O- ( n 2 ) के बजाय काउंटर-सहजता से O ( n ) में संचालित होती हैं ।
  • बॉक्स पेड़ों के लिए उपयोगी होते हैं।

क्या J स्मार्ट फिर से उपयोग की गई गणनाओं को कैशिंग करके O (n) में अपना अधिकतम सबर्रे समाधान चलाने के लिए पर्याप्त है, या यह सीधी बात करेगा और इसे O (n ^ 2) में चलाएगा?
योना

@ जोनाह मुझे लगता है कि यह द्विघात समय में चलता है।
फूजएक्सएल

10

छोरों का उपयोग करने से सावधान रहें।

जम्मू ढांचे (पाशन है, वहीं for. do. end., while. do. end.और विविधता), तो आप उन्हें का उपयोग कर पाते हैं, अगर वहाँ एक संभावना है कि आपके एल्गोरिथ्म जम्मू के गोल्फ ताकत के लिए और है कि वहाँ चरित्र बचत बनाया जा रहे हैं नहीं खेल रहा है।

^:शक्ति संयोजन आपका मित्र है। एक क्रिया xसमय निष्पादित करने के लिए :

verb^:x

यदि आपको किसी सूची में प्रत्येक पुनरावृत्ति के परिणाम की आवश्यकता है:

verb^:(i.x)

आप ^:सशर्त रूप से क्रिया निष्पादित करने के लिए भी उपयोग कर सकते हैं:

  +:^:(3<])"0[ 1 2 3 4 5 6
1 2 3 8 10 12

डबल +:यदि ^:आइटम से अधिक 3 3<]( "0क्रिया के पद में परिवर्तन तो यह एक समय में एक आइटम काम करता है)।


बॉक्सेड मान (i.x)उदाहरण की तरह काम करते हैं , अर्थात f^:(<x)इसके बराबर है f^:(i.x)
फायरफली

9

इनपुट

1!:1[1 एंटर कुंजी दबाकर समाप्त किए गए इनपुट की एक पंक्ति ले जाएगा।

1!:1[3 इनपुट की कई पंक्तियाँ लेगा (मेरे मैक पर Ctrl-D द्वारा समाप्त, Windows पर Ctrl-C)।

यदि आप इनपुट संख्याओं की कोशिश कर रहे हैं, ".तो स्ट्रिंग का मूल्यांकन करने और हेरफेर किए जाने के लिए तैयार संख्याओं की सूची लौटाएगा। यदि आप एक संख्या में ले रहे हैं, लेकिन अंकों को व्यक्तिगत रूप से संचालित करने की आवश्यकता है, ".,.(इसके लिए जान ड्वोरक की टिप्पणी के लिए धन्यवाद) या "."0स्ट्रिंग को अलग-अलग अंकों में विभाजित करेगा:

   "."0[1!:1[1
12345
1 2 3 4 5

   ".,.1!:1[1
12345
1 2 3 4 5

यदि आप स्ट्रिंग्स में पढ़ रहे हैं, तो अलग स्ट्रिंग्स की बॉक्सिंग सूची प्राप्त करने का सबसे छोटा तरीका उपयोग करना है ;:। यह अंतरिक्ष से जुड़े तारों के लिए सबसे अच्छा काम करता है:

   ;:1!:1[1
hello world
┌─────┬─────┐
│hello│world│
└─────┴─────┘

जिज्ञासा से बाहर, (मैंने केवल जे के साथ थोड़ा खेला है) क्या 1!:1[2(यदि कुछ भी) के रूप में काम करेगा ?
गफ्फी जूल

मैं 1!:पेज पर क्या इकट्ठा कर सकता हूं (मैं कोई जे विशेषज्ञ नहीं हूं) 2 स्क्रीन है, इसलिए स्क्रीन से इनपुट का कोई मतलब नहीं है।
गारेथ

लिंक के लिए धन्यवाद। वहां से, यह वास्तव में ऐसा लगता 2है कि मान्य नहीं है? मेरे पास इस समय इसे आज़माने के लिए मेरा J कंप्यूटर नहीं है। जहां मैं देखता हूं 2, नोटों के बारे में नीचे 1!:1, यह है 1!:2
गफ्फी

@Gaffi इनपुट और आउटपुट के लिए फ़ाइल नंबर अनुक्रमिक प्रतीत होते हैं, इसलिए मैं अनुमान लगा रहा हूं कि ये तय हो गए हैं और यह 2, 4 और 5 केवल आउटपुट के तहत दिखाई देते हैं क्योंकि यह कोशिश करने और उनसे इनपुट करने का कोई मतलब नहीं है। वही 1 और 3 के लिए दूसरे रास्ते पर जाता है
गैरेथ

चूंकि ".रैंक 1-xx है और,. हमेशा एक 2 डी सरणी पैदा करता है, ".,' ',.(अंतरिक्ष, रेल और मूल्यांकन के साथ सिलाई; 8 अक्षर) सिर्फ ".,.(ravel आइटम और मूल्यांकन; 4 वर्ण) के साथ बदला जा सकता है ।
जॉन ड्वोरक

6

अनुक्रमों की गणना करने के लिए पुनरावृत्ति का उपयोग करना

आमतौर पर, OEIS अनुक्रम चुनौती को हल करने के लिए इसके पृष्ठ पर दिए गए किसी एक सूत्र का उपयोग करना होगा। इनमें से कुछ J के लिए अच्छी तरह से अनुकूल हैं, और अन्य इतने पर नहीं। पुनरावर्ती सूत्र सीधे-आगे हैं, हालांकि, पुनरावृत्ति सरल नहीं हो सकती है। एक पैटर्न जिसका मैंने उपयोग करना शुरू किया है, वह है

(s(]f)^:[~]) n
          ]  Gets n
 s           The first value in the sequence
         ~   Commute the argument order, n is LHS and s is RHS
        [    Gets n
      ^:     Nest n times with an initial argument s
  (]f)         Compute f s
             Returns (f^n) s

कहा पे s अनुक्रम में पहला मूल्य है, fएक क्रिया है जो पिछले शब्द को दिए गए अगले शब्द की गणना करेगा, और nउस शब्द का शून्य-आधारित सूचकांक है जिसे आप गणना करना चाहते हैं। यह विधि इस तथ्य पर निर्भर करती है कि जब एक डाईएड की शक्ति की गणना की जाती है, तो एलएचएस एक नए मोनाड बनाने के लिए डेड के लिए बाध्य होता है, और यह कि मोनाड प्रारंभिक मूल्य पर नेस्टेड है। पावर अडवरब को दिया जाने वाला रंग एक हुक है जहां एलएचएस पर (]f)सूचकांक nऔर अनुक्रम में एक शब्द का मूल्य दिया जाता है s। हुक लागू होगी fपर sएक इकाई के रूप में, और उसके बाद की उपेक्षा nका परिणाम वापस जाने के लिए f s

मानक पुस्तकालय

कभी-कभी, आप पा सकते हैं कि J को अपने मानक पुस्तकालय में एक क्रिया के लिए समर्थन मिलेगा । उदाहरण के लिए, अधिकांश बिटवाइज़ पूर्णांक ऑपरेशन उन नामों से बंधे होते हैं जो कि आदिम कॉल का उपयोग करने से कम होते हैं।

AND =: (17 b.) NB. it is actually '$:/ :(17 b.)'

दिनांक और समय के आधार भी उपलब्ध हैं।

सीमाओं

यदि आपके पास मानों का एक सेट है [a, b, c] और आप उनके उत्पाद के आधार पर एक सीमा बनाना चाहते हैं [0, 1, 2, ..., a*b*c-1], जैसे कि विशिष्ट दृष्टिकोण उनके उत्पाद को खोजने के लिए होगा और फिर एक सीमा बनाई जाएगी, [:i.*/जिसकी लागत 6 बाइट्स हो सकती है । एक छोटा रास्ता ,@i.4 बाइट्स के लिए है क्योंकि i.अभी भी गिनती करते समय बहुआयामी सरणियों का निर्माण कर सकता है, और इसे समतल करते हुए एक समतुल्य श्रेणी का उत्पादन करेगा।

लगातार मुद्रण

मूल्य छापने का एक मौन तरीका और स्पष्ट लूप के बिना इसका उपयोग जारी रखना है ([echo) एक मौद्रिक मामले के लिए है। echoमानक पुस्तकालय में एक क्रिया है जो अपनी सामग्री को stdoutदुभाषिया में उपयोग किए गए प्रारूप में प्रिंट करता है। हुक फिर एक ही इनपुट मान छोड़ देता है बाईं [क्रिया का उपयोग करके ।

पूर्णांक के आधार 10 अंक

एक पूर्णांक के आधार 10 अंकों को प्राप्त करने का मानक तरीका है 10#.inv]जिसकी लागत 8 बाइट्स है, बहुत अधिक है! एक विकल्प इसे एक स्ट्रिंग में परिवर्तित करना है और इसे रैंक 0 पर पार्स करना है "."0@":जो एक बाइट बचाता है, लेकिन एक और भी बेहतर तरीका है ,.&.":जो 8 के बजाय अंतिम बाइट 6 बाइट्स बनाने वाला एक और बाइट बचाता है।


5

टैसी क्रिया लिखने के बजाय स्पष्ट परिभाषा का उपयोग करने पर विचार करें ; सुनिश्चित करें 3 :'और '5 बाइट्स लागत, लेकिन आप का एक बहुत कुछ बचा सकते हैं @, @:और [:इस तरह से।


5

कुछ (काफी) आम चालें मैंने देखी हैं

मैं कुछ चीजें साझा कर रहा हूं जो मेरे लिए काम आई हैं। मूल रूप से ये सभी ऐसे टिप्स हैं जो मैंने खुद प्राप्त किए हैं, लेकिन मेरे पास ज्यादातर के लिए क्रेडिट नहीं है।

एक रैंक एक सरणी का योग

उपयोग +/@:(FGH)करने के बजाय (1#.FGH)। इसका मतलब आधार 1 पर डिबेट है, जिसका मतलब है कि एक सरणी को जोड़ना। यद्यपि यह इससे अधिक लंबा है +/, इसके लिए एक टोपी या संरचना की आवश्यकता नहीं होती है, जो अक्सर इसे उपयोग करने की तुलना में बहुत कम कर देती है +/

अनुगामी सत्य की गिनती

यदि आपके पास बूलियन सूची है और आप अनुगामी सत्य की संख्या की गणना करना चाहते हैं, तो उपयोग करें #.~यहाँ देखेंएपीएल जवाब यह कैसे काम करता लिए एक अच्छा विवरण उपलब्ध कराती है। दी, यह केवल दो बार मेरे लिए उपयोगी रहा है, लेकिन मुझे लगा कि मैं इसे किसी भी तरह साझा करूंगा।

के अंतर्गत (&।)

विशिष्ट चाल नहीं, बल्कि सिर्फ एक सामान्य सुझाव: क्रिया विशेषण &.अक्सर सुरुचिपूर्ण और (अधिक महत्वपूर्ण बात) लघु समाधान की ओर जाता है। जब आप गोल्फ कर रहे हों तो इसे ध्यान में रखें।

अक्सर यह और अन्य आधार रूपांतरण चुनौतियों के लिए उपयोगी होता है , उदाहरण के लिए यह कोड जो एक नंबर से सबसे महत्वपूर्ण बिट को निकालता है: }.&.#:(बाइनरी अंकों की सूची में परिवर्तित करें, पहले अंक को हटा दें, फिर द्विआधारी अंकों की सूची में रूपांतरण को पूर्ववत करें और परिवर्तित करें वापस दशमलव पर)। सीधा समाधान दो और बाइट्स है:#.@}.@#: :।

उन चुनौतियों के लिए भी मददगार है जहां आपको दशमलव अंकों के साथ काम करने की आवश्यकता है, क्योंकि आप उपयोग कर सकते हैं u&.":। उदाहरण के लिए, जिस तरह से मील की दूरी पर दशमलव अंकों का उपयोग करने के लिए विभाजित करने के लिए देता है ,.&."::।

: एक अंतिम उदाहरण एक सदिश की भयावहता की खोज कर रहा है +/&.:*:, ध्यान दें कि आप से परिणाम के सभी एकत्र करने की आवश्यकता *:के साथ -square &.:के बाद से -under *:-square रैंक शून्य है।


4

कम रैंकों के साथ गड़बड़ करने के तरीके

कभी-कभी, आपके पास कोड जैसा होगा <"0 i.3 3, जहां आप vरैंक पर एक क्रिया लागू करना चाहते हैं r। हालाँकि, यदि आप एक संज्ञा (जैसे 0) का उपयोग करते हैं , तो आपको अक्सर एक स्थान शामिल करना होगा। इससे बचने के लिए, आप uसमकक्ष रैंक की एक और क्रिया का उपयोग कर सकते हैं और u"vइसके बजाय उपयोग कर सकते हैं । उदाहरण के लिए, चूंकि +रैंक है 0 0 0, हम <"+इसके बजाय उपयोग कर सकते हैं <"0

यहाँ सभी क्रियाओं और उनके रैंकों की एक तालिका है (उपयोग करके प्राप्य v b. 0):

0 0 0     > + * - % ^ | ! ? <. <: >. >: +. +: *. *: %: ^. j. o. q: r.
0 _ _     -. -: E. i: p:
1 0 1     p..
1 0 _     { A.
1 1 0     p.
1 1 1     #.
1 1 _     C.
1 _ _     ;: ". i. I.
2 _ 2     %.
_ 0 0     = < ~. ~: {: }: ?. L.
_ 1 0     #:
_ 1 _     $ # |. |: {. }. ": {::
_ _ _     , ; [ ] _: $. $: ,. ,: /: \: [: e. s: u: x: 0:

इस तालिका का उपयोग करने के लिए, rबाएं हाथ की तरफ वांछित रैंक ढूंढें , फिर vदाहिने हाथ की तरफ से एक उपयुक्त क्रिया चुनें । उदाहरण के लिए, अगर मुझे किसी क्रिया vको गहराई से करने की आवश्यकता है 2 _ 2, तो मुझे वह रैंक बाईं ओर मिलेगी और %.दाईं ओर से चुनें । तब मैं v"%.इसके बजाय उपयोग करता हूं v"2 _ 2


3

strings पुस्तकालय: गोल्फ युक्तियाँ

स्ट्रिंग लाइब्रेरी हेरफेर के साथ कुछ भी करने के लिए काफी मददगार है। ज़रूर, यह लेता है include'strings'(जो कि जे को देखते हुए बहुत महंगा है), लेकिन आप कई बार लाभ उठा सकते हैं।

stringreplace

स्ट्रिंग की जगह का उपयोग करके खुद को खोजें? निरीक्षण करें कि A stringreplace Bजैसा है वैसा ही है B rplc A

वास्तव में, यह है कि कैसे rplcलागू किया जाता है:

   rplc
 stringreplace~

cuts

क्रिया cutsइस प्रकार प्रदान करती है:

x (संयोजन) पर y को काटें
string (क्रिया कट n) पाठ
  n = _1 तक लेकिन स्ट्रिंग सहित नहीं
  n = 1 तक और स्ट्रिंग सहित
  n = _2 के बाद लेकिन स्ट्रिंग सहित नहीं
  n = 2 के बाद और स्ट्रिंग सहित

तो यह वास्तव में एक स्ट्रिंग टुकड़ा कर रही है।


3

0 से 4 तक नंबर प्राप्त करना

यदि आपके कोड में संख्याओं के उपयोग पर प्रतिबंध है:

0 %_ : अनंत द्वारा विभाजित।
1 #_ : कितने शिशुओं?
2 #_ _ : दो शिशुओं।
3 verb : एक अंतर्निहित है।
4 dyad : एक और बिल्ट-इन।

10 से 35 तक नंबर मिल रहे हैं

बेस-inifinity शाब्दिक: 11 : _bb, 26 : _bqआदि


3

टैसिट प्रोग्रामिंग

मूल बातें

डायैडिक क्रिया

x (F G H) y == (x F y) G (x H y)
x (F G) y == x F (G y)
x ([: G H) y == G (x H y)  NB. G is called monadically

NB. Verbs are grouped from the right by units of 3.
NB. For the following, think like G, I, K are replaced by the results of (x G y) etc.
NB. and then the sentence is run as usual.
x (F G H I J K) y == x (F (G H (I J K))) y
                  == x F ((x G y) H ((x I y) J (x K y)))

NB. Using conjunctions for dyadic verb
x F@G y == F (x G y)  NB. Atop; Same as x ([: F G) y; Consider as golfing alternatives
x F&G y == (G x) F (G y)  NB. Compose; G is applied monadically to both arguments

मोनाडिक क्रिया

(F G H) y == (F y) G (H y)
(G H) y == y G (H y)  NB. Note that this is different from APL
([: G H) y == G (H y)
(F G H I J K) y == (F (G H (I J K))) y
                == y F ((G y) H ((I y) J (K y)))
F@G y == F (G y)

विविध

x&F y == x F y
F&y x == x F y
y F~ x == x F y
F~ y == y F y

ट्रिक्स

(F x) G (H y)

टैसिट समाधान (G~F)~H:; वास्तविक क्रियाओं के आधार पर, हटाने के लिए बाएं और दाएं तर्कों को पुन: व्यवस्थित करने पर विचार करें ~

x ((G~F)~H) y
x (G~F)~ (H y)
(H y) (G~F) x
(H y) G~ (F x)
(F x) G (H y)

मोनाडिक-डायैडिक प्रतिस्थापन

>:y == 1+y
<:y == 1-~y or _1+y
+:y == 2*y
-.y == 1-y
-:y == 2%~y
*:y == 2^~y
#.y == 2#.y
#.inv y == 2#.inv y  NB. #: doesn't work this way
{.y == 0{y
{:y == _1{y
}.y == 1}.y
+/y == 1#.y

1
(G~F)~Hशुद्ध चुलबुलापन है!
जोनाह

2

& आपका दोस्त है, इसे बुद्धिमानी से उपयोग करें

vक्रिया है, nसंज्ञा है,x औरy क्रमशः बाएं और दाएं तर्क हैं।

इकाई & : परिचय~ क्रिया विशेषण / संयोजन श्रृंखला के अंदर

एक क्रिया विशेषण / संयोजन श्रृंखला बाईं ओर से मूल्यांकन करती है। तो कुछ ऐसा है_2&+/\&.> काम नहीं करेगा क्योंकि यह पसंद है (_2&+)/\&.>जबकि हम चाहते हैं _2&(+/\)&.>। इस मामले में, बाएं / दाएं को स्वैप करने से +/\बाइट बच सकती है, +/\~&_2&.>क्योंकि यह एक के रूप में पार्स करता है ((+/\)~)&_2&.>। यह देखने के लिए कि यह क्यों काम करता है:

+/\~&_2 y
is equivalent to
y +/\~ _2
is equivalent to
_2 +/\ y
is equivalent to
_2&(+/\) y

दयद &: xबार बार

क्या आप यह जानते थे यदि आप एक बाएं तर्क xदेते हैं &, तो फ़ंक्शन इसे xकई बार लागू करता हैy ? काफी कुछ चुनौतियां आपको कुछ निश्चित ऑपरेशन xसमय करने के लिए कहती हैं । यह मुख्य रूप से दो तरीकों से प्राप्त करने योग्य है:

  • ^:सही ऑपरेटर के बिना बिजली ऑपरेटर का उपयोग करें

यदि ऑपरेशन होता है v, तो v^:एक विशेषण ट्रेन बन जाता है, जब एक बाएं ऑपरेंड दिया जाता है, एक मोनडिक क्रिया बन जाती है। इसलिएvy , xसमय पर लागू किया जाता है।

x(v^:)y
is equivalent to
(v^:x)y
  • &सबसे बाहरी संयोजन के रूप में डाईएडिक का उपयोग करें

इसका उपयोग करने के लिए, आपको एक स्थिर nऔर एक रंग क्रिया की पहचान करने की आवश्यकता है u, ताकि n u yया तो याy u n इसके बराबर हो v। फिर आप पूरे कार्य को लिख सकते हैं n&uया u&nहल कर सकते हैं । यह फ़ॉर्म सबसे प्रभावी होता है जब स्थिर की पसंद स्पष्ट होती है, जैसे 3 इन3 u: (ASCII मूल्यों के लिए चार्ट बदलें)।

इसके अलावा, जब बाहरी संरचना u&nको थोड़ा अधिक पसंद किया जाता n&uहैu एक संयोजन या क्रिया विशेषण है (जिस स्थिति में n&uहोना चाहिए n&(u); आप u~&nइसके बजाय कर सकते हैं )।

ध्यान दें कि आप &डायनामिक तर्क को मनमाने ढंग से कार्य को प्राप्त करने के लिए ट्रेन में कहीं भी रख सकते हैं , समान अर्थों में गतिशील ^:

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