कश्मीर में गोल्फ के लिए युक्तियाँ


17

K आर्थर व्हिटनी द्वारा डिजाइन किए गए एपीएल परिवार में एक प्रोग्रामिंग भाषा है। जबकि आधिकारिक दुभाषिया बंद-स्रोत और वाणिज्यिक है, एक परीक्षण संस्करण जिसमें अंतरिक्ष को संबोधित करने की 32 बिट्स की कार्यक्षेत्र सीमा (जो कोड गोल्फ के लिए समस्याएं पैदा नहीं करनी चाहिए) केएक्स सिस्टम वेबसाइट पर पाई जा सकती है । इस संस्करण को kdb + डेटाबेस के भाग के रूप में बंडल किया गया है जिसे बोलचाल की भाषा में "K4" के रूप में जाना जाता है। वहाँ भी खुले स्रोत K कार्यान्वयन उपलब्ध हैं, जिसमें Kona भी शामिल है , जो K3 पर आधारित है, और मेरे स्वयं के दुभाषिया को ओके कहा जाता है , जो K5 पर आधारित है और इसमें ब्राउज़र आधारित REPL है

Kx सिस्टम्स में K4 / kdb + / Q जानकारी के साथ एक विकी है , और Kona GitHub पेज पर संदर्भ सामग्री का एक उत्कृष्ट संग्रह भी है । मैंने oK / k5 के लिए एक मैनुअल लिखना शुरू कर दिया है जो एक उपयोगी संदर्भ हो सकता है।

जैसा जम्मू और एपीएल, कश्मीर एक बहुत ही संक्षिप्त और शक्तिशाली भाषा है, और अक्सर एक अच्छा कोड गोल्फ में दिखा कर सकते हैं। कृपया आपके द्वारा खोजे गए टिप्स, ट्रिक्स और मुहावरों को साझा करें और यदि आपने इसे स्पिन देने से पहले K की कोशिश नहीं की है! कृपया प्रति उत्तर एक टिप दें!

जवाबों:


5

एक दयद को पुकारना

मान लें कि आपके पास एक dyadic (2-तर्क) फ़ंक्शन है f:

f: {x+2*y}

आप आमतौर पर इसे ऐसे ही कहेंगे:

f[3;47]

आप पहले तर्क में क्यूरिंग करने के बजाय किसी चरित्र को सहेज सकते हैं और फिर परिणामस्वरूप परिणाम को दूसरे तर्क को juxtaposition द्वारा लागू कर सकते हैं:

f[3]47

समान रूप से सरणी अनुक्रमण के लिए स्वाभाविक रूप से काम करता है:

  z: (12 17 98;90 91 92)
(12 17 98
 90 91 92)

  z[1;2]
92

  z[1]2
92

5

मुद्रण नईं

यदि आपके आउटपुट में एक नई लाइन होनी चाहिए , तो आपको ऐसा करने के लिए लुभाया जा सकता है:

`0:whatever,"\n"

नहीं है । K2 (और संभावित रूप से अन्य संस्करणों) में एक साफ़ सुथरी विशेषता है जहाँ आप लाइनों की सूची प्रिंट कर सकते हैं:

  `0:("abc";"def")
abc
def

इसलिए, यदि आपको आउटपुट के लिए एक नई लाइन संलग्न करने की आवश्यकता है, तो बस करें:

`0:,whatever

3

सीमाओं

आम तौर पर यदि आप अनुक्रमिक संख्याओं का एक वेक्टर बनाना चाहते हैं, जिसका आप उपयोग करते हैं !:

  !5
0 1 2 3 4

यदि आप एक ऐसी सीमा बनाना चाहते हैं जो शून्य से भिन्न संख्या में शुरू हो, तो आप परिणामी वेक्टर में एक ऑफसेट जोड़ेंगे:

  10+!5
10 11 12 13 14

कुछ असामान्य दृष्टिकोण हैं जो किसी विशेष स्थिति के लिए बेहतर काम कर सकते हैं। उदाहरण के लिए, यदि आपका आधार और ऑफसेट पहले से ही किसी सूची के सदस्य हैं, तो आप "जहां" का उपयोग दो बार कर सकते हैं:

  &10 5
0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
  &&10 5
10 11 12 13 14

धीमी गति से बढ़ने वाले दृश्यों के लिए, "जहां" को "टेक" के साथ संयोजित करने पर विचार करें:

  5#2
2 2 2 2 2
  &5#2
0 0 1 1 2 2 3 3 4 4

यदि आप एक से अधिक गुणक बनाना चाहते हैं, तो आप परिणाम को गुणा कर सकते हैं !या आप स्कैन कर सकते हैं ( \) चरण की प्रतियों की एक सूची:

  2*!5
0 2 4 6 8
  +\5#2
2 4 6 8 10

यदि आप कोष्ठक से बचने की कोशिश कर रहे हैं, तो पूर्व बेहतर है यदि अनुक्रम की लंबाई परिवर्तनशील है और चरण आकार निर्धारित है, जबकि उत्तरार्द्ध बेहतर है यदि चरण का आकार भिन्न होता है। सही भिन्नता चुनने से 1 या 2 वर्णों को बचाया जा सकता है। ऑफ-बाय-वन अंतर भी आपके पक्ष में काम कर सकता है।


2

तार से कास्ट महंगे हैं। बस eval का उपयोग करें। इस:

0.0$a

बस यह बन सकता है:

. a

K5 में, यह एक बाइट छोटा है:

.a

2

प्रत्येक अधिकार

कभी-कभी आप अपने आप को लेखन (या सरलीकरण पर पहुंचते हुए) देख सकते हैं जो प्रत्येक-मोनाद के माध्यम से लागू किया गया एक संक्षिप्त अभिव्यक्ति है:

  (2#)'3 4 5
(3 3
 4 4
 5 5)

इस पैटर्न को प्रत्येक-दाईं के अनुप्रयोग में बदलने के लिए एक वर्ण छोटा है:

  2#/:3 4 5
(3 3
 4 4
 5 5)

1

चक्रीय क्रमपरिवर्तन

!K3 / K4 में डायडिक है "घुमाएँ":

  2!"abcd"
"cdab"
  -1!"abcd"
"dabc"

जब "स्कैन" ( \) एक मोनडिक क्रिया के साथ प्रदान किया जाता है, तो यह एक निश्चित-बिंदु ऑपरेटर के रूप में कार्य करता है। K में, फिक्स्ड पॉइंट ऑपरेटर बार-बार अपनी क्रिया को एक मूल्य पर लागू करते हैं जब तक कि प्रारंभिक मूल्य फिर से जारी नहीं किया जाता है या मूल्य बदलना बंद हो जाता है। फिक्स्ड-पॉइंट स्कैन के साथ कंबाइन रोटेटिंग एक सूची के चक्रीय क्रमपरिवर्तन के सेट को गणना करने का एक बहुत ही सुविधाजनक तरीका प्रदान करता है:

  ![1]\1 2 4 8
(1 2 4 8
 2 4 8 1
 4 8 1 2
 8 1 2 4)

आप या तो !कोष्ठक के माध्यम से करी कर सकते हैं या क्रिया को बनाने के लिए कोष्ठक कर सकते हैं (1!):

![1]\
(1!)\

(ध्यान दें कि 1!\ एक पूरी तरह से अलग व्यवहार है!) इनमें से प्रत्येक लंबाई में बराबर है, लेकिन पूर्ववर्ती अधिक वांछनीय हो सकता है अगर रोटेशन स्ट्राइड 1 के अलावा कुछ है; इस मामले में कोष्ठक "मुक्त करने के लिए" एक कोष्ठक उपसमिति को परिसीमित करते हैं।

एक उदाहरण के रूप में, यहां एक संक्षिप्त कार्यक्रम है जो जानवर बल के माध्यम से परीक्षण करता है कि क्या स्ट्रिंग x में विकल्प वाई (चक्रीय रूप से!) है:

{|/(y~(#y)#)'![1]\x}

K5 उपयोगकर्ता सावधान! K5 ने डायडिक का अर्थ बदल दिया है !, इसलिए यह तकनीक इतनी आसान नहीं है। यह अपेक्षा के अनुरूप काम करेगा Kona।


1

कंडीशन्स से बचें

K में एक सशर्त निर्माण ( :[) है जो एक लिस्प-शैली के बराबर है cond:

:[cond1;result1; cond2;result2; cond3;result3; default]

आपके पास जितनी चाहें उतनी शर्तें हो सकती हैं, और यदि कोई भी मिलान नहीं करता है तो डिफ़ॉल्ट मान लौटाया जाता है।

कभी-कभी (पुनरावर्ती कार्यक्रमों या कार्यक्रमों के रूप में जो अन्यथा साइड इफेक्ट के एक क्रम पर निर्भर करते हैं), इनमें से किसी एक का उपयोग करने के आसपास कोई नहीं मिल रहा है। हालांकि, ऐसी स्थितियों में जहां आप थोड़ा अतिरिक्त काम कर सकते हैं, आप अक्सर सूची इंडेक्सिंग के साथ "कॉन्ड" को बदल सकते हैं।

कुख्यात फ़िज़बज़ कार्यक्रम पर विचार करें । एक पारंपरिक अनिवार्य प्रोग्रामिंग शैली में लिखा गया है, हम इसके साथ जा सकते हैं:

{:[~x!15;"FizzBuzz";~x!3;"Fizz";~x!5;"Buzz";x]}'1+!100

विभाज्यता परीक्षणों में यहाँ काफी दोहराव है। एक अलग दृष्टिकोण मानता है कि 4 मामले हैं (एक संख्या, केवल 3 से विभाज्यता, केवल 5 से विभाज्यता, 3 और 5 से विभाज्यता) और एक सूचकांक को सीधे गणना करने का प्रयास करता है जो इनमें से एक मामले को सूची से चुनता है:

{(x;"Fizz";"Buzz";"FizzBuzz")@+/1 2*~x!/:3 5}'1+!100

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

{(x;4#t;4_ t;t:"FizzBuzz")@+/1 2*~x!/:3 5}'1+!100

अब हमने कुल 5 वर्ण सहेज लिए हैं। संयोग से, यह विशेष उदाहरण k5 में भी अच्छे से काम करता है, क्योंकि हमारे पास /गुणांक और योग के वेक्टर द्वारा गुणा करने के चरण को संभालने के लिए "पैक" अधिभार है :

{(x;4_t;4#t;t:"FizzBuzz")@2 2/~3 5!\:x}'1+!100

यह भी ध्यान दें कि "खोज" ( ?) का व्यवहार , जो कुंजी सूची के अंत में एक सूचकांक का उत्पादन करता है यदि आइटम नहीं मिला है, विशेष रूप से इस तरह के अनुक्रमण में "डिफ़ॉल्ट" मामले को संभालने के समर्थन के लिए डिज़ाइन किया गया है। स्वरों को अपरकेस में बदलने के लिए इस टुकड़े पर विचार करें:

{("AEIOU",x)"aeiou"?x}'

इनमें से एक बनाम:

{t:"aeiou"?x;:[t<5;"AEIOU"t;x]}'
{:[~4<t:"aeiou"?x;"AEIOU"t;x]}'

(मुझे पता है कि जो मैंने पढ़ा था, वह भी!)

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