भाषा डिजाइन: 2-डी पैटर्न मिलान


49

यह पाक्षिक चुनौती # 6 है । थीम: भाषा डिजाइन

नहीं है एक chatroom इस चुनौती के लिए। आइए और हमसे जुड़ें अगर आप विचारों पर चर्चा करना चाहते हैं!

और अब पूरी तरह से अलग कुछ करने के लिए...

इस पखवाड़े, हम एक नई प्रकार की चुनौती के साथ प्रयोग करना चाहते हैं। इस चुनौती में, आप एक भाषा डिजाइन करेंगे! प्रोग्रामिंग में पैटर्न मिलान एक बहुत ही आम समस्या है, और अक्सर कोड गोल्फ के लिए बहुत उपयोगी है। उदाहरण के लिए, नियमित अभिव्यक्तियों का उपयोग पाठ की एक पंक्ति में एक पैटर्न का पता लगाने के लिए किया जा सकता है। हालांकि, दो-आयामी पैटर्न का वर्णन करने और उनका पता लगाने के लिए कोई भी स्थापित तरीके नहीं हैं।

चुनौती

आप एक पैटर्न-मिलान भाषा डिज़ाइन कर सकते हैं, जो पाठ के ब्लॉक में दो-आयामी पैटर्न का वर्णन करने की अनुमति देता है। आपरेशन के मोड (हालांकि अपनी भाषा अन्यथा regex के साथ आम में कुछ भी नहीं है) अपनी भाषा का नियमित अभिव्यक्ति के समान हो जाएगा:

  • इनपुट के रूप में, आपको टेक्स्ट का एक आयताकार ब्लॉक प्राप्त होगा। आप मान सकते हैं कि पाठ में केवल मुद्रण योग्य ASCII वर्ण (0x20 से 0x7E) और साथ ही ग्रिड की पंक्तियों को अलग करने के लिए newlines (0x0A) शामिल हैं।
  • यदि एक मैच, पैटर्न विवरण के अनुसार, पाठ के इस ब्लॉक के किसी भी सबसेट के रूप में पाया जा सकता है, तो इस मैच को लौटाया जाना चाहिए या मुद्रित किया जाना चाहिए। यदि मैच गैर-आयताकार हो सकता है, तो इसे कुछ आरक्षित चरित्र के साथ एक आयताकार क्षेत्र में पैड किया जाना चाहिए। यदि कई वैध मैच हैं, तो आप तय कर सकते हैं कि लौटा हुआ मैच कैसे चुना जाता है (सबसे बड़ा, सबसे छोटा, पहला, आदि)।

कुछ अनुप्रयोगों के लिए यह उपयोगी हो सकता है यदि आपका कार्यान्वयन मैच के बजाय एक मैच की स्थिति में वापस आ सकता है, लेकिन यह एक आवश्यकता नहीं है।

बहुत कम से कम, आपकी भाषा एक पैटर्न को उसके इनपुट के सन्निहित, आयताकार उप-भाग के रूप में मिलान करने में सक्षम होना चाहिए।

आपके उत्तर में होना चाहिए:

  • एक विवरण भाषा की।
  • एक कार्य कार्यान्वयन । यह आपकी पसंद की भाषा में एक कार्यक्रम, या फ़ंक्शन / कक्षाओं का एक सेट हो सकता है।
  • आपको अपनी भाषा प्रदर्शित करनी चाहिए कि नीचे दिए गए उदाहरणों को हल करने के लिए इसका उपयोग कैसे किया जा सकता है । आपकी भाषा को उन सभी से मेल खाने में सक्षम नहीं होना चाहिए, लेकिन आपको इनमें से कम से कम 8 का मिलान करने में सक्षम होना चाहिए । यदि आपकी भाषा कुछ फैंसी कर सकती है, जिसके बारे में हमने नहीं सोचा था, तो इसे भी शामिल करने के लिए स्वतंत्र महसूस करें।

यदि आपका जवाब मौजूदा विचारों पर बनता है, तो यह ठीक है, लेकिन कृपया क्रेडिट दें जहां यह होने वाला है।

एक्सटेंशन

उपरोक्त न्यूनतम का वर्णन करता है कि एक वैध प्रस्तुत को संतुष्ट करना है। हालांकि, कई सामान्यीकरण इस तरह के एक पैटर्न मिलान भाषा को और भी अधिक उपयोगी बना सकते हैं, जिनमें शामिल हैं:

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

स्कोरिंग

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

  • अभिव्यक्ति की। क्या इस सवाल में प्रस्तुत उदाहरणों से परे भी, भाषा कई प्रकार की समस्याओं को हल कर सकती है? क्या यह किसी भी सुझाए गए एक्सटेंशन का समर्थन करता है?
  • पठनीयता। कितना सहज ज्ञानवर्धन है (कम से कम उन लोगों को जो मूल सिंटैक्स जानते हैं)?
  • Golfitude। यह अभी भी CodeGolf.SE है। इस साइट के प्रयोजनों के लिए, यह निश्चित रूप से एक मेल खाने वाली भाषा के लिए अच्छा होगा कि एक पैटर्न का वर्णन करने के लिए बहुत कम कोड की आवश्यकता होती है।

उदाहरण समस्याएं

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

जैसा कि ऊपर कहा गया है, आपकी भाषा को इनमें से 8 समस्याओं को हल करने में सक्षम होना चाहिए। उसके ऊपर सब कुछ वैकल्पिक है, लेकिन निश्चित रूप से आपको प्राप्त होने वाले वोटों की संख्या में वृद्धि करनी चाहिए।

(नहीं, आपको उस HTML कोड को पढ़ने की आवश्यकता नहीं है। इसे अपने ब्राउज़र द्वारा अच्छी तरह से प्रस्तुत करने के लिए "रन कोड स्निपेट" बटन को हिट करें, जिसे आप तब पूर्ण स्क्रीन भी देख सकते हैं।)


क्या इन समस्याओं पर एक सामान्य समय सीमा है? मुझे इसे हल करने में बहुत दिलचस्पी है लेकिन मैं बहुत व्यस्त हूं, इसे करने में मुझे आसानी से 2 सप्ताह लग सकते हैं।
डेवोन पार्सन्स

7
@DevonParsons कोई प्रविष्टि समय सीमा नहीं है।
PhiNotPi

दिलचस्प लगता है, खासकर जब से आपने इसके लिए एक नया टैग बनाया है। मुझे लगता है कि इसके लिए 2-डी भाषा बनाने के लिए बोनस अंक होना चाहिए।
mbomb007

1
@ mbomb007 2-D भाषा बनाने के लिए बोनस अंक हैं। मुझे पूरा यकीन है कि इसे अपवित्रों का एक अच्छा हिस्सा मिलेगा। ;)
मार्टिन एंडर

@ मार्टिनबटनर मुझे यह भी पता नहीं है कि वास्तव में एक भाषा कैसे बनाई जाती है। क्या यह पायथन प्रोग्राम बनाने के रूप में (सरल?) कुछ ऐसा हो सकता है जो आपकी नई भाषा के कोड की फ़ाइल लेता है (और आपके परिभाषित सिंटैक्स के आधार पर इसे व्याख्या / निष्पादित करना) और आउटपुट का उत्पादन करता है?
mbomb007

जवाबों:


32

SnakeEx

15/16 समस्याओं का समाधान अब तक!

ऑनलाइन दुभाषिया ! - फुल लैंग्वेज स्पेस - जावास्क्रिप्ट सोर्स

दुभाषिया स्क्रीनशॉट

इस भाषा के पीछे का विचार 'सांपों' को परिभाषित करना है जो पाठ की जाँच करने वाले पात्रों के चारों ओर घूमता है, जो रेक्सक्स जैसे वाक्य रचना का उपयोग करता है।

स्नेपएक्स में एक कार्यक्रम में विभिन्न अनुक्रमों का उपयोग करके सांपों की परिभाषाओं की एक सूची शामिल है। सांप इन परिभाषाओं का उपयोग करके अन्य सांपों को पाल सकते हैं, जहां स्नेक को अपनी अधिकांश शक्ति मिलती है - हम शाखाओं की संरचनाओं का मिलान कर सकते हैं और यहां तक ​​कि पुनरावृत्ति भी कर सकते हैं (देखें पारन मिलान उदाहरण)।

प्रत्येक कार्यक्रम अनिवार्य रूप से रेगेक्स के सेट की तरह दिखाई देगा, लेकिन फार्म के दिशा आदेशों के अलावा <dir>जो सांप की दिशा बदलते हैं, और फॉर्म के आदेशों को बुलाते हैं{label<dir>params} जो अधिक सांपों को पालते हैं।

एक प्रविष्टि बिंदु के लिए, दुभाषिया पहली परिभाषा का उपयोग करके एक सांप को काटता है, दाईं ओर बढ़ता है।

यह बहुत संक्षिप्त नहीं है, लेकिन यह बहुत शक्तिशाली है और (मुझे लगता है) बहुत पठनीय है।

अपडेट

  • बदला हुआ ! मैचों को चिह्नित नहीं करने के लिए तार्किक और ~ को नहीं
  • <!>कॉलिनियर को हल करने के लिए जोड़ा गया
  • सॉल्वड मैचिंग क्रॉस
  • कम भयानक तरीके से हल की हुई बिसात
  • जोड़ा गया बंद सिंटैक्स %{min,max}
  • जोड़ा पुनरावृत्ति उदाहरण

समाधान

15 हल, 1 प्रगति में है

आप ऊपर दिए गए ऑनलाइन इंटरप्रेटर का उपयोग करके इन कार्यक्रमों को आसानी से आज़मा सकते हैं!

समस्या 1 - शतरंज की बिसात

m:{v<R>2}{h<>1}
v:{c<L>A1}+
h:{c<R>A2}+
c:_?(#_)+#?

एक विस्तृत परिचय के लिए, समस्या 3 पर शुरू करें।

समस्या 2 - शतरंज की बिसात का सत्यापन

m:{v<R>2}{h<>1}
v:${c<L>A1}+$
h:${c<R>A2}+$
c:$_?(#_)+#?$

आउट-ऑफ-बाउंड्स प्रतीक के साथ उपयुक्त सांपों को बुक-एंड $करना एक प्रोग्राम है जो केवल पूरे इनपुट से मेल खाता है।

समस्या 3 - अंकों के एक आयत का पता लगाएं

m:{c<R>A1}%{2,}
c:[0-9]%{2,}

mसाँप चाल ठीक है, कम से कम 2 सांप पर उत्पन्न करने वाला ( %{2,}परिभाषा ग (का उपयोग कर एक बंद "2 अनंत को" अर्थ है) c) और सही चलती ( <R>), या बल्कि इस मामले में नीचे है, क्योंकि सभी दिशाओं वर्तमान साँप के सापेक्ष हैं। Aपरम चीनी कि सिर्फ यह बताता है कि स्पॉन साँप कॉल के बाद बढ़ना चाहिए है। 1पैरामीटर है कि किस प्रकार हम आयतों को मैचों प्रतिबंधित - नंबर पैरामीटर "समूह" में सांप डाल दिया। एक मैच की गिनती तब तक नहीं होती जब तक कि एक ही समूह के सभी सांप एक ही दूरी की यात्रा न करें।

समस्या 4 - एक शब्द खोज में एक शब्द ढूँढना

m:<*>GOLF

दिशा निर्देश <*>निर्दिष्ट करता है कि सांप किसी भी विकर्ण या रूढ़िवादी दिशा में मुड़ना चाहिए। फिर, यह साधारण रेगेक्स की तलाश करता है।

समस्या 5 - स्क्वायर इनपुट का पता लगाएं

m:{v<R>1}{h<>1}
v:${c<L>A1}+$
h:${c<R>A1}+$
c:$.+$

यहां कुंजी विशेष चरित्र है $, जो केवल तभी मेल खाती है जब सांप बाहर हो गया हो। हम एक क्षैतिज सांप और एक ऊर्ध्वाधर एक को स्पॉन करते हैं; उनमें से प्रत्येक अधिक सांपों को काटता है क्योंकि यह किनारे पर चलता है, और वे सभी एक ही समूह में हैं और उनकी लंबाई समान होनी चाहिए।

समस्या 6 - जीवन के एक खेल में ग्लाइडर्स का पता लगाएं

m:<+>[({l1<R>A}{l2<R>A}{l3<R>})({l1<L>A}{l2<L>A}{l3<L>})]
l1:##\.
l2:[(#\.)(\.#)]#
l3:#\.\.

m<+>रोटेशन प्राप्त करने वाले चार ऑर्थोगोनल दिशाओं ( ) में से किसी में शुरू होता है । फिर, यह प्रतिबिंब को प्राप्त करने के लिए तीन पंक्तियों के लिए बाएं या दाएं दिखता है।

(ध्यान दें कि मैंने रिक्त स्थान को केवल पीरियड्स से बदल दिया है क्योंकि मेरे दुभाषिया में उपयोग किए जाने वाले एचटीएमएल टेक्स्टारियस एक पंक्ति में कई स्थान होने पर बेवकूफ चीजें करते हैं)

समस्या 7 - मैच नीदरलैंड पोर्टल्स

m:{e<R>A1}{d<R>A1}%{2,22}{e<R>1}
e:~.X%{3,22}~.
d:X\.+X

mसाँप सही चलता रहता है, एक साँप को उत्पन्न करने के बाएँ किनारे बीच कॉलम की जाँच करने के दाहिने किनारे की जांच करने के एक साँप की जाँच करने, 2-22 सांप, और अंत में। ~ऑपरेटर इंगित करता है कि जो कुछ भी इस प्रकार जाँच की जानी चाहिए, लेकिन समाधान का हिस्सा के रूप में चिह्नित नहीं किया जाना चाहिए।

बंधे हुए बंद अब हमें इस समस्या को पूरी तरह से और ठीक से हल करने की अनुमति देते हैं!

समस्या 8 - Minecraft चेस्ट प्लेसमेंट

m:~{s<>}~!{d<+>}\.
s:<+>.<BR>([$\.]<R>)%{3}
d:.<+>CC

यहां हम एक तार्किक नहीं ( !) का उपयोग करते हैं , जो मेल खाता है यदि और केवल यदि निम्न टोकन कुछ भी मेल नहीं खाता है। घोषणा dएक विशेष दिशा में एक डबल छाती का पता लगाती है, इसलिए !{d<+>}यह सुनिश्चित करती है कि किसी भी रूढ़िवादी दिशा में कोई दोहरी छाती नहीं है। sवर्तमान वर्ग के चारों ओर एक छोटे से हीरे में ले जाता है, उन स्थानों में से कम से कम 3 की पुष्टि करता है कि वे खाली हैं या बोर्ड से दूर हैं। अनुगामी \.अंत में वर्ग से मेल खाता है, पूर्ववर्ती सभी स्थितियों को सफल मानते हुए।

समस्या 9 - क्षैतिज और ऊर्ध्वाधर संरेखण

m:<R>?#~.*#

अनुक्रम से मेल खाने से पहले सांप mवैकल्पिक रूप से दाएं मुड़ता है <R>?.एक वाइल्डकार्ड है, जैसे रेगेक्स में।

समस्या 10 - कोलिनियर पॉइंट्स

m:<!>#~.*#~.*#

के अलावा के साथ <!>दिशा, अब हम इस का समाधान कर सकते हैं! <!>यह <+>चार दिशाओं में शाखा करने के बजाय हर संभव दिशा में शाखाओं की तरह है।

समस्या 12 - अक्षर Q से बचें

m:{h<R>A}%{4}
h:[^Qq]%{4}

बस 4 सांपों को देखा जाता है, जिनमें से प्रत्येक चार वर्णों की तलाश करता है जो अक्षर Q नहीं हैं।

समस्या 13 - हीरा खनन

m:{tl<RB>1}{tr<RF>1}
tl:X/*{bl<L>1}X
tr:X\\*{br<R>1}X
bl:X\\*X
br:X/*X

यह बहुत साफ है। mदो सांपों को पकड़ता है, एक उसके दाहिने तरफ जाता है, और दूसरा उसके आगे दाहिने तरफ। उनमें से प्रत्येक एक X के लिए स्लैश का अनुसरण करता है, फिर दूसरे सांप को उसकी वर्तमान दिशा में एक समकोण पर जन्म देता है, जो स्लैश से नीचे X तक जाता है।

समस्या 14 - क्रॉसिंग का मिलान

m:{a<R>A}+{b<R>A}+{a<R>A}+
a:{e<>P1}{c<>P2}{e<>P3}
b:{c<>P1}{c<>P2}{c<>P3}
e:\.+
c:#+

यहां पहली बार मैंने Piggyback पैरामीटर का उपयोग किया है । आम तौर पर सांप स्वतंत्र होते हैं, लेकिन यदि आप इस पैरामीटर के साथ कॉल करते हैं, तो कॉलिंग स्नेक को कैली के साथ स्थानांतरित किया जाएगा। तो e2'का एक क्रम देख सकते हैं।' फिर '#' का एक क्रम, फिर 'का एक और क्रम'। ' , उनकी लंबाई मैच के लिए मजबूर करने के लिए।

समस्या 15 - एक बोगल बोर्ड में एक शब्द का मिलान करें

m{I}:<*>p<*>a<*>n<*>a<*>m<*>a

सरल, अगर चिंता है। Iपैरामीटर केस-असंवेदनशीलता को निर्दिष्ट करता है (हम परिभाषाओं के साथ-साथ कॉल में भी पैरामीटर निर्दिष्ट कर सकते हैं)। सांप किसी भी दिशा में मुड़ता है, चरित्र से मेल खाता है, फिर से मुड़ता है, और आगे।

m{EI}:<*>p<*>a<*>n<*>a<*>m<*>a

यह नो-रीयूज़-वर्ण संस्करण है। EXclusive पैरामीटर किसी भी चरित्र है कि पहले से ही चिह्नित किया गया है ज्यादा feersum के कीचड़ ट्रेल्स तरह से मेल खाते से साँप की मनाही है।

समस्या 16 - किनारों के चारों ओर लपेटें

m{W}:{c<R>WA}%{3}
c:###

Wपैरामीटर रैप करने के लिए जब यह बाहर के सीमा चलाता साँप अनुमति देता है। हम यह भी है Hऔर Vकेवल क्षैतिज या लम्बवत रैपिंग अनुमति देने के लिए।

अतिरिक्त - भूलभुलैया सॉल्वर

m{E}:$(<P>\.)+$

एक ASCII भूलभुलैया को हल करता है जहां चलने योग्य मंजिल अवधि है। <P>दिशा का मतलब है आगे, बाएँ, या सही (के लिए चीनी [<F><L><R>])।

अतिरिक्त - Paren मिलान

m:\(~{r<>P}\)
r:[^\(\)]*(\({r<>P}\))?[^\(\)]*

पता नहीं कैसे अभी तक प्रस्तावना करना है, लेकिन यहाँ एक पहला कदम है! यहाँ मैं rसाँप का उपयोग करके समान कोष्ठक के मिलान के लिए जाँचता हूँ कि उनके बीच कोई बेजोड़ कोष्ठक नहीं हैं।

अतिरिक्त - ASCII टोपोलॉजी: गिनती लूप्स


क्या आप वाक्य रचना को जोड़ने पर विचार करेंगे ताकि यह भाषा केवल मिलान के बजाय प्रतिस्थापन कर सके? मैं इस चुनौती के लिए कुछ समाधान का उपयोग करना चाहता हूं ताकि codegolf.stackexchange.com/questions/51231/… के लिए एक प्रविष्टि लिख सकें लेकिन यहां एक भी समाधान खोज-और-प्रतिस्थापित नहीं होता है। (मुझे पता है कि मेरा जवाब भाषा के विशेष समय नियमों के कारण मान्य नहीं होगा)
स्पार्ट

@Sparr। एक बुरा विचार नहीं है, यह निश्चित रूप से कोड गोल्फ के लिए अधिक उपयोगी होगा। निश्चित नहीं है कि मेरे पास इसे करने का समय कब होगा, लेकिन मैं इसे ध्यान में रखूंगा।
BMac

3
अलग से: दिशा परिवर्तन के लिए वाक्य रचना भ्रामक है। क्योंकि सांप एक चरित्र से मेल खाने के बाद आगे बढ़ता है, मुझे लगता है कि मेरी दिशा में एक चरित्र को पहले से ही बदल देना चाहिए जहां यह मेरे लिए समझ में आता है। उदाहरण: स्ट्रिंग "एबीसी \ nDEF" और मैं एबीसीएफ द्वारा परिभाषित एल के आकार के टेट्रिस टुकड़े से मेल खाना चाहता हूं, मैं अपने सांप को "एम: एबीसी <आर> एफ" के रूप में लिखना चाहता हूं, लेकिन मुझे "एम: एबी <आर> लिखना होगा सीएफ ”के बजाय। मैं समझता हूं कि यह कल्पना से मेल खाता है, लेकिन मुझे यह बहुत ही उचित लगता है।
शुक्राणु

मेरे पास प्रस्तावना सिंटैक्स के लिए एक आंशिक समाधान है। केवल समस्या यह है कि अगर यह पूरे इनपुट से मेल नहीं खाता है, तो मैं इसे प्राप्त नहीं कर सकता: m:{a<>} a:[({n<R>A})({n<R>A}*{l<R>A}{a<>P}{r<R>A})]*{n<R>A}* l:$[^\(\)]*\([^\(\)]*$ r:$[^\(\)]*\)[^\(\)]*$ n:$[^\(\)]+$
TheNumberOne

21

स्लिप, पायथन 3.4 ( गिथब विकी , ऑनलाइन दुभाषिया )

फ़ेरसम की सबमिशन की तरह यह भी ग्रिड को ट्रेस करने पर आधारित है, लेकिन कारपेटपाइथन की तरह यह रेगेक्स पर आधारित है। किसी तरह यह लग रहा है कि मैं बीच का रास्ता निकालने में कामयाब रहा।

वहाँ बहुत सारी अनइम्प्लीमेंट की गई सुविधाएँ हैं, जिन्हें मैं जोड़ना चाहता हूँ, इसलिए जहाँ मैंने नोट किया है कि मुझे समय मिलने पर क्या करने का इरादा है।


अपडेट

(विस्तृत खबर के लिए जीतूब पेज देखें)

  • अप्रैल 5 2015 : स्लिप में अब एक ऑनलाइन दुभाषिया है ! यह अभी भी अपने शुरुआती चरण में है, इसलिए कुछ कीड़े हो सकते हैं।

  • 5 अप्रैल 2015 : दक्षता अपडेट! अब nether बड़े इनपुट को बहुत तेजी से बढ़ाता है (2s)। इसके अलावा कई सिंटैक्स परिवर्तन हुए हैं, इसलिए विकी की जांच करना सुनिश्चित करें। ग्रुप नंबरिंग भी तय।


स्लिप में एक मैच पॉइंटर होता है जो एक विशेष वर्ग में शुरू होता है और शुरू में सही सलामत सामने आता है। जब एक चार्ट का मिलान किया जाता है, तो पॉइंटर चालू दिशा में आगे बढ़ता है (हालांकि कार्यान्वयन उस क्रम में चीजों को बिल्कुल नहीं करता है)।

मैच सूचक के निर्देशन के साथ एक विशेष दिशा के लिए सेट किया जा सकता ^<digit>है, जहां ^0, ^1, ^2, ..., ^7, एन, पूर्वोत्तर, ई करने के लिए सूचक सेट ..., एनडब्ल्यू क्रमशः (दक्षिणावर्त जा रहा)।

निम्नलिखित शॉर्टकट भी उपलब्ध हैं:

  • ^* सभी 8 ऑर्थोगोनल या विकर्ण दिशाओं की जाँच करता है,
  • ^+ सभी 4 ऑर्थोगोनल दिशाओं की जाँच करता है।

(भविष्य की योजना: (1, 2)शूरवीर के कदम के लिए , मनमानी दिशाओं की स्थापना की अनुमति दें )

उदाहरण के लिए ( समस्या 4 - शब्द खोज में एक शब्द खोजना ),

^*GOLF

शब्द "GOLF" की तलाश में सभी 8 ऑर्थोगोनल या विकर्ण दिशाओं की कोशिश करता है। डिफ़ॉल्ट रूप से, स्लिप सभी संभावित शुरुआती चौकों की कोशिश करता है और प्रत्येक से एक परिणाम देता है, डुप्लिकेट को फ़िल्टर करता है, इसलिए एक ग्रिड की तरह

GOLF
O
L
FLOG

मैचों के रूप में केवल शीर्ष पंक्ति और निचला पंक्ति देता है (शीर्ष पंक्ति और बाएं स्तंभ "GOLF" एक ही वर्ग से शुरू होता है)। सभी मैचों को प्राप्त करने के लिए, oओवरलैपिंग मैच मोड का उपयोग किया जा सकता है।

इसी तरह ( समस्या 15 - एक बोगल बोर्ड में एक शब्द का मिलान करें ),

p^*a^*n^*a^*m^*a

panamaहर बार एक अलग दिशा की कोशिश करके मेल खाता है। iकेस असंवेदनशीलता के लिए ध्वज का उपयोग करें । स्लिप डिफ़ॉल्ट रूप से वर्णों का पुन: उपयोग करता है, लेकिन यह rनो-रिपीट ध्वज के साथ टॉगल किया जा सकता है ।

(भविष्य की योजना: एक खोज मोड संशोधक जो प्रत्येक चाल के बाद स्वचालित रूप से दिशाओं के सेटों की जांच करता है ताकि पुनरावृत्ति ^*अनावश्यक हो)

मैच पॉइंटर की दिशा को क्रमशः <या इसके साथ बाएँ या दाएँ 90 डिग्री घुमाया जा सकता >है। उदाहरण के लिए,

 `#`#< `#<  <`#<`#

पैटर्न के लिए लग रहा है

  #
## 
 ##

निम्नलिखित क्रम में देख कर:

765
894
123

यह हमें समस्या 6 को हल करने की अनुमति देता है - साथ ग्लाइडर ढूँढना

^+(`#`# >`# > `#>`#> |`#`# <`# < `#<`#< | `#`#> `#>  >`#>`#| `#`#< `#<  <`#<`#)

जहां भाग 1 और 2 में ग्लाइडर आकृतियों को सांकेतिक शब्दों में बदलना है, और भाग 3 और 4 उनके परिलक्षित समकक्षों को कूटबद्ध करते हैं।

ध्यान दें कि स्लिप `भागने के लिए बैकटिक का उपयोग करता है । ऐसा इसलिए है क्योंकि स्लिप में आंदोलन का एक और रूप है जो भाषा को अपना नाम देता है - स्लिप कमांड। /मैच पॉइंटर को बायीं ओर खिसका देता है, जबकि दायें ओर \मैच पॉइंटर को ऑर्थोगोनली से खिसका देता है।

उदाहरण के लिए,

abc   ghi
   def

द्वारा मिलान किया जा सकता है abc\def/ghi

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

उदाहरण के लिए,

abc
def
ghi

के साथ मिलान किया जा सकता है (?|abc)\(?|def)\(?|ghi)

इसी तरह, समस्या 12 - अक्षर से बचें क्यू के साथ हल किया जा सकता है

%(\(?|[^qQ]{4})){4}

जहाँ %पहले \से सक्रिय होने से रोकने के लिए एक नो-स्लिप कमांड है ।

स्लिप में एक लंबाई मुखर है (?_(<group num>) <regex> ), जो केवल रेगेक्स से मेल खाता है यदि इसकी मैच की लंबाई दी गई समूह की संख्या के समान लंबाई है।

उदाहरण के लिए, समस्या 13 - हीरा खनन के साथ आसानी से हल किया जा सकता है

^1X(`/*)X>(?_(1)`\*)X>(?_(1)`/*)X>(?_(1)`\*)

जो पहले हीरे के शीर्ष बाईं ओर मिलान करने की कोशिश करता है, फिर दावा करता है कि अन्य तीन पक्ष समान लंबाई के हैं।

( vवर्बोज़ आउटपुट के लिए ध्वज के साथ चलाएँ )

Match found in rectangle: (8, 0), (12, 4)
  X
 / \
X   X
 \ /
  X

Match found in rectangle: (0, 0), (6, 6)
   X
  / \
 /   \
X     X
 \   /
  \ /
   X

Match found in rectangle: (2, 2), (4, 4)
 X
X X
 X

Match found in rectangle: (10, 2), (14, 6)
  X
 / \
X   X
 \ /
  X

Match found in rectangle: (5, 3), (9, 7)
  X
 / \
X   X
 \ /
  X

Match found in rectangle: (0, 6), (2, 8)
 X
X X
 X

एक गोल्फर विकल्प है

^1X(`/*)(X>(?_(1)`\*)X>(?_(1)`/*)){2}

जो पहले पक्ष से दो बार मेल खाता है।

अन्य समस्याओं में से कई का उपयोग कर हल किया जा सकता है, स्थिर समूहों और लंबाई का दावा:

समस्या 14 - क्रॉसिंग का मिलान:

(?|(`.+)(`#+)(`.+))(\(?|(?_(2)`.+)(?_(3)`#+)(?_(4)`.+)))*(\(?|(?_(2)`#+)(?_(3)`#+)(?_(4)`#+)))+(\(?|(?_(2)`.+)(?_(3)`#+)(?_(4)`.+)))+

एक बार जब आप पहली पंक्ति में .s और #s की चौड़ाई पर कब्जा कर लेते हैं , तो यह सभी तरह से नीचे खिसक जाता है।

आउटपुट:

Match found in rectangle: (0, 1), (5, 5)
.###..
######
######
.###..
.###..

Match found in rectangle: (4, 6), (6, 8)
.#.
###
.#.

यह एक बार मैं थोड़ी सी बग़ावत के साथ गोल्फ हो सकता हूं, एक बार मुझे कुछ कीड़े मिल जाएंगे।

समस्या 3 - अंकों की एक आयत का पता लगाएं:

(?|`d`d+)(\(?|(?_(1)`d+)))+

दो या दो से अधिक अंकों की शीर्ष पंक्ति का मिलान करें, फिर सुनिश्चित करें कि नीचे की प्रत्येक पंक्ति समान लंबाई है। `dके बराबर एक पूर्वनिर्धारित चरित्र वर्ग है [0-9]

ध्यान दें कि यह सभी मैचों को ढूंढता है ।

समस्या 7 - मैच नाॅदर पोर्टल्स:

(?|.X{2,22}.)\((?|(?_(1)X`.+X))\){3,22}(?_(1).X+.)

जो मूल धागे में शीर्ष उदाहरण के लिए आउटपुट ,:

Match found in rectangle: (2, 1), (5, 5)
XXXX
X..X
X..X
X..X
XXXX

Match found in rectangle: (9, 1), (14, 5)
.XXXX.
X....X
X....X
X....X
.XXXX.

Match found in rectangle: (13, 4), (17, 8)
.XXXX
X...X
X...X
X...X
.XXX.

अंत में, स्लिप की कुछ अन्य विशेषताओं में शामिल हैं:

  • $0, $1, $2, ..., $7उत्तरी किनारे, उत्तर-पूर्व कोने, पूर्वी किनारे, आदि $+किसी भी किनारे $*लंगर और किसी भी कोने लंगर।
  • $एक लोअरकेस वर्ण के बाद वर्तमान स्थिति में एक एंकर सेट करता है, जिसे बाद $में संबंधित अपरकेस वर्ण, जैसे $aऔर द्वारा मिलान किया जा सकता है $A
  • # नो-मूव फ्लैग को टॉगल करता है, जो अगले मैच के बाद मैच पॉइंटर को आगे बढ़ने से रोकता है।
  • ,एक चार्ट की तरह मैच .करता है, लेकिन इसे आउटपुट में नहीं जोड़ता है, जबकि गैर-संक्रामक मैच के लिए अनुमति देता है जबकि द्वारा पहचाना जा सकता है (?_())

... और अधिक। इस पृष्ठ पर सूचीबद्ध करने के लिए वास्तव में बहुत सारे हैं।

दूसरी समस्याएं

समस्या 1 - चेसबोर्ड ढूंढना:

(?|`#?(`_`#)+`_?)(?_(1)(?|...+))(\(?_(1)(?|`#?(`_`#)+`_?$a)))+<(?|`#?(`_`#)+`_?)(?_(9)(?|...+))(\(?_(9)(?|`#?(`_`#)+`_?)))+$A

दो शतरंज की समस्याएं निश्चित रूप से स्लिप के लिए नहीं हैं। हम शीर्ष पंक्ति से मेल खाते हैं और सुनिश्चित करें कि यह कम से कम लंबाई 3 है और इसके बीच #और _फिर बारी-बारी से पंक्तियों को मिलाएं। अंत तक, $aएंकर को शतरंज के बॉटम के नीचे दाईं ओर होना चाहिए।

हम फिर बाएं मुड़ते हैं और कॉलम के लिए दोहराते हैं, जिससे यह सुनिश्चित होता है कि हम $Aअंत में मेल खाते हैं ।

समस्या 2 - शतरंज की जाँच करना:

$7%(\(?|`_?(`#`_)*`#?$2))+$5<%(\(?|`_?(`#`_)*`#?$0))+$3

पिछली समस्या की तरह, हम जाँचते हैं कि प्रत्येक पंक्ति सही है, फिर बाएँ घुमाएँ और स्तंभों के लिए भी ऐसा ही करें। एंकर का उपयोग यह सुनिश्चित करने के लिए किया जाता है कि केवल पूरे बोर्ड का मिलान हो।

समस्या 9 - क्षैतिज और ऊर्ध्वाधर संरेखण:

>?`#,*`#

हम वैकल्पिक लागू करते हैं? क्वांटिफायर टू >रोटेट कमांड ताकि हम या तो राइट या डाउनवर्ड से मेल खाते हैं। हम साथ उदाहरण में सभी 5 को खोजने oमोड ओवरलैपिंग, लेकिन केवल 4 इसके बिना के बाद से #.,##और #.,#एक ही स्थिति से शुरू करते हैं।

समस्या 10 - कोलिनियर अंक

^+`#(?|(,*)<(,*))(((?_(2),*)<(?_(3),*),>)+#`#){2}

#फिर कुछ क्षैतिज वर्णों और कुछ ऊर्ध्वाधर वर्णों का मिलान करें , फिर दूसरे #तक दोहराएं, और तीसरे तक दोहराएं #

समस्या 5 - वर्ग इनपुट का पता लगाना:

$7.(.*)>(?_(1).*)$3>((?|.*)\)*

शीर्ष बाएं कोने को एंकर करें, और जांच लें कि ऊपरी किनारे दाएं किनारे के समान लंबाई है, नीचे दाएं कोने को लंगर डालने से पहले। यदि इनपुट इसे पास करता है, तो हम पूरे इनपुट से मिलान करने के लिए पीछे की ओर जाते हैं।

समस्या 8 - Minecraft छाती प्लेसमेंट:

`.^+(($^|(?|`.))>){3}($^|`.|C<(($^|(?|`.))>){3})

pप्रत्येक मैच के स्थान पाने के लिए ध्वज के साथ दौड़ें। $^एक एंकर है, जो अगर मैच में चलता है तो मैच पॉइंटर को सीमा से बाहर कर देगा।

पहले हम एक मैच करते हैं ., फिर जांचते हैं कि हम तीन .एस / सीमाओं से घिरे हैं, फिर यह सुनिश्चित करता है कि चौथा आसपास का वर्ग भी एक ./ सीमा है या एक छाती है ( इसके आस-पास के वर्गों की जांच करके )।

समस्या 11 - सत्यापित सिंटैक्स की पुष्टि करें :

$7>%(/(?|[^()]+$4)(?1)?|/(?|[^()]*`([^()]*$4)(?1)?/(?|[^()]*`)[^()]*$4)(?1)?)$1

कुछ प्रयास किए, लेकिन मुझे लगता है कि यह सही है। यहां हम पुनरावर्तन का उपयोग करते हैं, जिसमें पीसीआरई के समान सिंटैक्स होता है।

इस दृष्टिकोण के लिए आवश्यक है कि इनपुट आयताकार हो, लेकिन एक बार जब मैं गैर-आयताकार मिलान कर लेता हूं तो यह धारणा आवश्यक नहीं होगी।

यहाँ एक ही दृष्टिकोण है, अधिक पुनरावृत्ति के साथ गोल्फ:

$7>%((/(?|([^()]*)$4)|/(?|(?4)`((?3))(?1)?/(?|(?4)`)(?3)))*)$1

समस्या 16 - किनारों के चारों ओर लपेटें:

%(\(?|`#{3})){3}

(नोट: रैपिंग अभी तक ऑनलाइन दुभाषिया तक नहीं पहुंचाई गई है)

इसके लिए रैपिंग फ्लैग की आवश्यकता होती है w। तकनीकी रूप से %नो-स्लिप के लिए प्रारंभिक आवश्यक नहीं है, लेकिन तब मैच को एक वर्ग उच्च से शुरू करने के रूप में गिना जाएगा।

समस्या EX 1 - भूलभुलैया सॉल्वर:

S(^+`.)*^+E

चैट में BMac की टिप्पणी से समस्या । rबिना किसी दोहराने मोड के लिए ध्वज का उपयोग करें ताकि मैच पॉइंटर आगे और पीछे अटक न जाए।

समस्या EX 2 - चेहरे की पहचान :

(?|O(,*),(?_(2),*)O)(?_(2)(\(?|,))*)\(?|,(?_(2),*)O)(?_(2)(\(?|,))*)\`\(?_(2)`_*)`_(?_(2)`_*)`/

ध्यान दें कि मैं केवल चेहरे का मिलान कर रहा हूं, कोई समाशोधन नहीं कर रहा हूं। ध्यान दें कि प्रश्न में यूरो प्रतीक शामिल हैं, जिन्हें काम करने के लिए कुछ मुद्रण योग्य ASCII द्वारा प्रतिस्थापित करना होगा।


हैश पैटर्न एक कॉनवे ग्लाइडर है
हेमडाल

17

PMA / घोंघे (C ++)

मैं भाषा को एक ग्रिड के चारों ओर घूमते हुए और आदेशों को निष्पादित करने के रूप में कल्पना करता हूं। घोंघे प्रत्येक वर्ग पर कीचड़ का एक निशान छोड़ते हैं जो वे आगे बढ़ते हैं, जो डिफ़ॉल्ट रूप से वर्ग को बाद में पहुंच से बाहर होने का कारण बनता है। यदि आदेशों की सूची समाप्त हो जाती है तो एक मैच सफल होता है।

अब पर्याप्त परिचालक हैं कि हमें उन पर नज़र रखने के लिए एक पूर्ववर्ती सूची की आवश्यकता होगी। संचालन निम्न क्रम में हल किए गए हैं:

  1. समूहों के अंदर ( ) [ ]
  2. प्रत्यावर्तन चरित्र के साथ विभाजित करें |
  3. `एक समूह के रूप में बाईं ओर सब कुछ का मूल्यांकन करें
  4. क्वांटिफायर [m],[n]औरn
  5. इस प्रकार के दावे = !
  6. कड़ी

दुभाषिया C ++ में लिखा गया है। Abysmal स्रोत कोड यहां पाया जा सकता है

समस्या 4: शब्द खोज

कार्यक्रम

z\G\O\L\F

शब्द मिला है या नहीं, इसके लिए एक सत्य या गलत मूल्य प्राप्त करने के लिए पर्याप्त है। z(15 निरपेक्ष या सापेक्ष दिशात्मक आदेशों में से एक) किसी भी ऑक्टिनियर दिशा में मेल खाता है। कई लगातार दिशा निर्देश एक साथ Ored हैं। उदाहरण के लिए ruldyलगभग बराबर होगा z, क्योंकि वे दाएं, ऊपर, बाएं, नीचे और किसी भी विकर्ण दिशा के लिए आदेश हैं। हालांकि, निर्देशों का परीक्षण एक अलग क्रम में किया जाएगा। पहला चरित्र जो हमेशा मेल खाता है, वह दिशा की परवाह किए बिना, घोंघा शुरू होता है। \<चरित्र> एकल शाब्दिक चरित्र से मेल खाता है।

डिफ़ॉल्ट रणनीति, बाएं-उचित इनपुट के बाउंडिंग बॉक्स में हर वर्ग पर पैटर्न की कोशिश करना है, और मैचों की संख्या को आउटपुट करना है। यदि एक बूलियन मूल्य 1या 0आवश्यक है, तो निम्न कार्यक्रम का उपयोग किया जा सकता है:

?
z\G\O\L\F

यदि स्रोत फ़ाइल में कम से कम एक नई पंक्ति है, तो पहली पंक्ति को एक आयताकार रूप में इनपुट के प्रारंभिक रूपांतरण के लिए विकल्प के रूप में माना जाता है। ?विकल्प प्रिंट 0 या 1 है कि क्या वहाँ कहीं भी एक मैच है पर निर्भर करता है।

समस्या 15: बोगल

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

\p|\P)z(\a|\A)z{\n|\N)z{\a|\A}z(\m|\M)z(\a|\A

|1-आयामी रेगेक्स के समान कार्य करता है। समूहन के लिए सीमांकक के दो मिलान जोड़े हैं, अर्थात् ()और {}। एक बंद ब्रैकेट विपरीत प्रकार के किसी भी खुले समूहों को बंद कर देगा जो इसके और उसी प्रकार के निकटतम के बीच खड़े होते हैं। उदाहरण के लिए, निम्नलिखित {({{), केवल सबसे बाएं समूह खुला रहता है। जैसा कि आप देख सकते हैं, किनारों पर बेजोड़ समूहीकरण प्रतीक स्पष्ट रूप से बंद हैं। एक और ग्रुपिंग कमांड है `जो अब मैं नहीं जाऊँगा।

समस्या 8: Minecraft चेस्ट

कार्यक्रम मान्य छाती प्लेसमेंट की संख्या को प्रिंट करता है। यह वह पहला था जिसे मैंने वास्तव में गोल्फ में लिया था, और मेरी बाइट की संख्या (17) को कुछ गुना कम कर दिया था।

\.!(o\C)2o(!\Cw)3
  • \. मैच के शुरुआती बिंदु पर एक डॉट का शाब्दिक अर्थ होता है।
  • !(o\C)2!((o\C)2)मात्रा के बराबर है, क्योंकि मूल्यांकन की तुलना में इसकी मात्रा अधिक है। बिल्कुल समय <atom> <number>दोहराने का मतलब है । घोंघे को किसी भी रूढ़िवादी दिशा में बदल देता है। एक नकारात्मक दावा है। इस प्रकार यह हिस्सा आसन्न डबल चेस्ट की अनुपस्थिति की जांच करता है।<atom><number>o!
  • o कुछ रूढ़िवादी दिशा में बदल जाता है।
    • (!\Cw)3दावा करता है कि Cघोंघा के सामने कोई नहीं है, और फिर वामावर्त 3 ​​बार मुड़ता है।

समस्या 2: शतरंज की बिसात सत्यापित करना

&
\#!(o^_)|\_!(o^#

&विकल्प के रूप में कार्यक्रम के उत्पादन सेट 1मैच सभी पदों पर सफल होता है, और यदि 0नहीं तो। ^cएक चरित्र से मेल खाता है c, [^c]जो रेगेक्स में नहीं है। एक पूरे के रूप में, प्रोग्राम का अर्थ है: 1 प्रिंट करें यदि इनपुट की आयताकार सीमा में हर स्थिति में, या तो एक ऐसा है #जो एक चरित्र के निकट orthogonally नहीं है जो कि नहीं है _, या _जो orthogonally नहीं है एक चरित्र के निकट है नहीं #; अन्यथा ०।



यह बोगल समस्या के लिए एक अच्छा समाधान है। मैं अपने दृष्टिकोण से इसे हल नहीं कर सकता।
लॉजिक नाइट

14

द रे 2 डी क्लास, पायथन 2

अद्यतन: जोड़ा गया "9. संरेखण" समस्या।

मेरा दृष्टिकोण खोज और मिलान करने के लिए पायथन री मॉड्यूल का उपयोग करना है। Re2d वर्ग प्रसंस्करण के लिए पाठ तैयार करता है, पुनः फ़ंक्शंस निष्पादित करता है, और आउटपुट के परिणामों को प्रारूपित करता है।

ध्यान दें कि यह एक पूरी नई भाषा नहीं है - यह अतिरिक्त 2 डी मोड के लिए जोड़े गए झंडे के साथ 2 आयामों में अनुमानित मानक नियमित अभिव्यक्ति भाषा है।

कक्षा में निम्नलिखित उपयोग हैं:

re2dobject = Re2d(<horizontal pattern>, [<vertical pattern>], [<flags>])

दोनों पैटर्न मानक रैखिक पाठ आरई पैटर्न हैं। यदि एक ऊर्ध्वाधर पैटर्न की आपूर्ति नहीं की जाती है, तो वर्ग क्षैतिज रूप से मिलान के लिए क्षैतिज पैटर्न का भी उपयोग करेगा। झंडे कुछ 2D एक्सटेंशन के साथ मानक आरई झंडे हैं।

परिक्षण

1. Finding chessboards
Chessboard pattern at (2, 1, 4, 3)

print '\n1. Finding chessboards'
reob1 = Re2d('#(_#)+_?|_(#_)+#?')
found = reob1.search('~______~\n~##_#_#~\n~#_#_##~\n~##_#_#~\n~______~')
print 'Chessboard pattern at', found
assert not reob1.search('#_##\n_#_#\n__#_\n#_#_\n#_#_')

खोज विधि में एक शतरंजबोर्ड पैटर्न पाया गया और 4-टपल स्थिति देता है। टपल में x,yमैच के पहले अक्षर की स्थिति होती है, और width, heightक्षेत्र का मिलान होता है। केवल एक पैटर्न दिया जाता है, इसलिए इसे क्षैतिज और ऊर्ध्वाधर मिलान के लिए उपयोग किया जाएगा ।

2. Verifying chessboards
Is chess? True

print '\n2. Verifying chessboards'
reob2 = Re2d('^#(_#)*_?|_(#_)*#?$')
print 'Is chess?', reob2.match('_#_#_#_#\n#_#_#_#_\n_#_#_#_#')
assert not reob2.match('_#_#_#__\n__#_#_#_\n_#_#_#__')

बिसात को मैच विधि से सत्यापित किया गया था जो एक बूलियन देता है। ध्यान दें कि ^और $आरंभ और समाप्ति वर्णों का मिलान करने के लिए आवश्यक हैं पूरे पाठ।

3. Rectangle of digits
Found: [(0, 1, 5, 3), (1, 1, 4, 3), (2, 1, 3, 3), (3, 1, 2, 3), (0, 2, 5, 2), (1, 2, 4, 2), (2, 2, 3, 2), (3, 2, 2, 2), (6, 3, 2, 2)]
Not found: None

print '\n3. Rectangle of digits'
reob3 = Re2d(r'\d\d+', flags=MULTIFIND)
print 'Found:', reob3.search('hbrewvgr\n18774gwe\n84502vgv\n19844f22\ncrfegc77')
print 'Not found:', reob3.search('uv88wn000\nvgr88vg0w\nv888wrvg7\nvvg88wv77')

अब हम MULTIFIND2+ अंक ब्लॉक के लिए सभी संभावित मैचों को वापस करने के लिए ध्वज का उपयोग करते हैं । विधि 9 संभावित मैचों को ढूंढती है। ध्यान दें कि वे अतिव्यापी हो सकते हैं।

4. Word search (orthogonal only)
Words: [(0, 0, 4, 1), (0, 3, 4, 1), (3, 3, -4, -1), (3, 2, -4, -1), (3, 0, -4, -1)] [(0, 0, 1, 4), (3, 0, 1, 4), (3, 3, -1, -4), (0, 3, -1, -4)]
Words: ['SNUG', 'WOLF', 'FLOW', 'LORE', 'GUNS'] ['S\nT\nE\nW', 'G\nO\nL\nF', 'F\nL\nO\nG', 'W\nE\nT\nS']
No words: [] []

print '\n4. Word search (orthogonal only)'
words = 'GOLF|GUNS|WOLF|FLOW|LORE|WETS|STEW|FLOG|SNUG'
flags = HORFLIP | VERFLIP | MULTIFIND
reob4a, reob4b = Re2d(words, '.', flags), Re2d('.', words, flags)
matching = 'SNUG\nTEQO\nEROL\nWOLF'
nomatch = 'ABCD\nEFGH\nIJKL\nMNOP'
print 'Words:', reob4a.search(matching), reob4b.search(matching)
print 'Words:', reob4a.findall(matching), reob4b.findall(matching)
print 'No words:', reob4a.findall(nomatch), reob4b.findall(nomatch)

यह परीक्षण ऊर्ध्वाधर और क्षैतिज फ्लिपिंग के उपयोग को दर्शाता है। यह उन शब्दों को मिलाने की अनुमति देता है जो उलटे होते हैं। विकर्ण शब्द समर्थित नहीं हैं। MULTIFINDझंडा सभी 4 दिशाओं में एकाधिक अतिव्यापी मैचों अनुमति देता है। खोज विधि मिलान बॉक्स को खोजने के लिए खोज का उपयोग करती है फिर पाठ के मिलान ब्लॉकों को निकालती है। ध्यान दें कि खोज कैसे रिवर्स दिशा में मैचों के लिए नकारात्मक चौड़ाई और / या ऊंचाई का उपयोग करती है। ऊर्ध्वाधर दिशा में शब्दों में नई लाइन वर्ण हैं - यह 2 डी चरित्र ब्लॉक की अवधारणा के अनुरूप है।

7. Calvins portals
Portals found: [(3, 1, 5, 6)]
Portal not found None

print '\n7. Calvins portals'
reob7 = Re2d(r'X\.{2,22}X|.X{2,22}.', r'X\.{3,22}X|.X{3,22}.', MULTIFIND)
yes = '....X......\n.XXXXXX.XX.\n...X...X...\n.X.X...XXX.\n...X...X.X.\n.XXX...X.X.\nX..XXXXX.X.'
no = 'XX..XXXX\nXX..X..X\nXX..X..X\n..X.X..X\n.X..X.XX'
print 'Portals found:', reob7.search(yes)
print 'Portal not found', reob7.search(no)

इस खोज को प्रत्येक आयाम के लिए अलग-अलग पैटर्न की आवश्यकता थी क्योंकि न्यूनतम आकार प्रत्येक के लिए अलग है।

9. Alignment
Found: ['#.,##', '##'] ['#\n.\n,\n.\n#', '#\n,\n.\n#']
Found: [(3, 4, 5, 1), (6, 4, 2, 1)] [(7, 0, 1, 5), (3, 1, 1, 4)]
Not found: None None

print '\n9. Alignment'
reob9a = Re2d(r'#.*#', r'.', MULTIFIND)
reob9b = Re2d(r'.', r'#.*#', MULTIFIND)
matching = '.,.,.,.#.,\n,.,#,.,.,.\n.,.,.,.,.,\n,.,.,.,.,.\n.,.#.,##.,\n,.,.,.,.,.'
nomatch = '.,.#.,.,\n,.,.,.#.\n.,#,.,.,\n,.,.,.,#\n.#.,.,.,\n,.,.#.,.\n#,.,.,.,\n,.,.,#,.'
print 'Found:', reob9a.findall(matching), reob9b.findall(matching)
print 'Found:', reob9a.search(matching), reob9b.search(matching)
print 'Not found:', reob9a.search(nomatch), reob9b.search(nomatch)

2 खोजों के इस सेट में 2 ऊर्ध्वाधर और 2 क्षैतिज मैच मिलते हैं, लेकिन एम्बेडेड #.,#स्ट्रिंग नहीं मिल सकती है ।

10. Collinear Points (orthogonal only)
Found: [(0, 1, 7, 1)] [(3, 1, 1, 4)]
Not found: None None

print '\n10. Collinear Points (orthogonal only)'
matching = '........\n#..#..#.\n...#....\n#.......\n...#....'
nomatch = '.#..#\n#..#.\n#....\n..#.#'
reob10h = Re2d(r'#.*#.*#', '.')
reob10v = Re2d('.', r'#.*#.*#')
flags = MULTIFIND
print 'Found:', reob10h.search(matching, flags), reob10v.search(matching, flags)
print 'Not found:', reob10h.search(nomatch, flags), reob10v.search(nomatch, flags)

यहां हम दोनों दिशाओं में मैच खोजने के लिए 2 खोजों का उपयोग करते हैं। यह कई ऑर्थोगोनल मैच खोजने में सक्षम है लेकिन यह दृष्टिकोण विकर्ण मैचों का समर्थन नहीं करता है।

12. Avoid qQ
Found: (2, 2, 4, 4)
Not found: None

print '\n12. Avoid qQ'
reob12 = Re2d('[^qQ]{4,4}')
print 'Found:', reob12.search('bhtklkwt\nqlwQklqw\nvtvlwktv\nkQtwkvkl\nvtwlkvQk\nvnvevwvx')
print 'Not found:', reob12.search('zxvcmn\nxcvncn\nmnQxcv\nxcvmnx\nazvmne')

यह खोज पहला मैच ढूंढती है।

13. Diamond Mining
.X.
X.X
.X.

.X.
X.X
.X.

..X..
./.\.
X...X
.\./.
\.X..

..X..
./.\.
X...X
.\./.
..X..

.XX.\
//.\.
X...X
.\./.
..X..

...X...
../.\..
./.X.\.
X.X.X.X
.\.X.//
..\./X.
.X.X..\

Diamonds: [(2, 2, 3, 3), (0, 6, 3, 3)] [(8, 0, 5, 5), (10, 2, 5, 5), (5, 3, 5, 5)] [(0, 0, 7, 7)]
Not found: None None None

print '\n13. Diamond Mining'
reob13a = Re2d(r'.X.|X.X', flags=MULTIFIND)
reob13b = Re2d(r'..X..|./.\\.|X...X|.\\./.', flags=MULTIFIND)
reob13c = Re2d(r'...X...|../.\\..|./...\\.|X.....X|.\\.../.|..\\./..', flags=MULTIFIND)
match = '''
...X......X....
../.\..../.\...
./.X.\..X...X..
X.X.X.XX.\./.\.
.\.X.//.\.X...X
..\./X...X.\./.
.X.X..\./...X..
X.X....X.......
.X.............
'''.strip().replace(' ', '')
nomatch = '''
.X......./....
.\....X.......
...X.\.\...X..
..X.\...\.X.\.
...X.X...X.\.X
../X\...\...X.
.X...\.\..X...
..\./.X....X..
...X..../.....
'''.strip().replace(' ', '')
for diamond in reob13a.findall(match)+reob13b.findall(match)+reob13c.findall(match):
    print diamond+'\n'
print 'Diamonds:', reob13a.search(match), reob13b.search(match), reob13c.search(match)
print 'Not found:', reob13a.search(nomatch), reob13b.search(nomatch), reob13c.search(nomatch)

हीरे की समस्या अधिक कठिन है। तीन आकारों के लिए तीन खोज वस्तुओं की आवश्यकता होती है। यह परीक्षण सेट में छह हीरे पा सकता है, लेकिन यह चर आकार के हीरे के पैमाने पर नहीं है। यह हीरे की समस्या का केवल एक आंशिक समाधान है।

पायथन 2 कोड

import sys
import re

DEBUG = re.DEBUG
IGNORECASE = re.IGNORECASE
LOCALE = re.LOCALE
UNICODE = re.UNICODE
VERBOSE = re.VERBOSE
MULTIFIND = 1<<11
ROTATED = 1<<12     # not implemented
HORFLIP = 1<<13
VERFLIP = 1<<14
WRAPAROUND = 1<<15  # not implemented

class Re2d(object):
    def __init__(self, horpattern, verpattern=None, flags=0):
        self.horpattern = horpattern
        self.verpattern = verpattern if verpattern != None else horpattern
        self.flags = flags

    def checkblock(self, block, flags):
        'Return a position if block matches H and V patterns'
        length = []
        for y in range(len(block)):
            match = re.match(self.horpattern, block[y], flags)
            if match:
                length.append(len(match.group(0)))
            else:
                break
        if not length:
            return None
        width = min(length)
        height = len(length)
        length = []
        for x in range(width):
            column = ''.join(row[x] for row in block[:height])
            match = re.match(self.verpattern, column, flags)
            if match:
                matchlen = len(match.group(0))
                length.append(matchlen)
            else:
                break
        if not length:
            return None
        height = min(length)
        width = len(length)
        # if smaller, verify with RECURSIVE checkblock call:
        if height != len(block) or width != len(block[0]):
            newblock = [row[:width] for row in block[:height]]
            newsize = self.checkblock(newblock, flags)
            return newsize
        return width, height

    def mkviews(self, text, flags):
        'Return views of text block from flip/rotate flags, inc inverse f()'
        # TODO add ROTATED to generate more views
        width = len(text[0])
        height = len(text)
        views = [(text, lambda x,y,w,h: (x,y,w,h))]
        if flags & HORFLIP and flags & VERFLIP:
            flip2text = [row[::-1] for row in text[::-1]]
            flip2func = lambda x,y,w,h: (width-1-x, height-1-y, -w, -h)
            views.append( (flip2text, flip2func) )
        elif flags & HORFLIP:
            hortext = [row[::-1] for row in text]
            horfunc = lambda x,y,w,h: (width-1-x, y, -w, h)
            views.append( (hortext, horfunc) )
        elif flags & VERFLIP:
            vertext = text[::-1]
            verfunc = lambda x,y,w,h: (x, height-1-y, w, -h)
            views.append( (vertext, verfunc) )
        return views

    def searchview(self, textview, flags=0):
        'Return matching textview positions or None'
        result = []
        for y in range(len(textview)):
            testtext = textview[y:]
            for x in range(len(testtext[0])):
                size = self.checkblock([row[x:] for row in testtext], flags)
                if size:
                    found = (x, y, size[0], size[1])
                    if flags & MULTIFIND:
                        result.append(found)
                    else:
                        return found
        return result if result else None

    def search(self, text, flags=0):
        'Return matching text positions or None'
        flags = self.flags | flags
        text = text.split('\n') if type(text) == str else text
        result = []
        for textview, invview in self.mkviews(text, flags):
            found = self.searchview(textview, flags)
            if found:
                if flags & MULTIFIND:
                    result.extend(invview(*f) for f in found)
                else:
                    return invview(*found)
        return result if result else None

    def findall(self, text, flags=0):
        'Return matching text blocks or None'
        flags = self.flags | flags
        strmode = (type(text) == str)
        text = text.split('\n') if type(text) == str else text
        result = []
        positions = self.search(text, flags)
        if not positions:
            return [] if flags & MULTIFIND else None
        if not flags & MULTIFIND:
            positions = [positions]
        for x0,y0,w,h in positions:
            if y0+h >= 0:
                lines = text[y0 : y0+h : cmp(h,0)]
            else:
                lines = text[y0 : : cmp(h,0)]
            if x0+w >= 0:
                block = [row[x0 : x0+w : cmp(w,0)] for row in lines]
            else:
                block = [row[x0 : : cmp(w,0)] for row in lines]
            result.append(block)
        if strmode:
            result = ['\n'.join(rows) for rows in result]
        if flags & MULTIFIND:
            return result
        else:
            return result[0]

    def match(self, text, flags=0):
        'Return True if whole text matches the patterns'
        flags = self.flags | flags
        text = text.split('\n') if type(text) == str else text
        for textview, invview in self.mkviews(text, flags):
            size = self.checkblock(textview, flags)
            if size:
                return True
        return False

यदि हीरे की समस्या स्पष्ट नहीं थी, तो हीरे किसी भी आकार के हो सकते हैं, न कि केवल 0, 1, या 2. संपादित करें: मैंने इसे और अधिक स्पष्ट करने के लिए कल्पना को संपादित किया है।
फीनोटपी

समझ गया। मैं इस जवाब में एक नोट करूंगा कि इस समस्या का आंशिक समाधान Re2d के पास है। यह चर आकार में पैमाने पर नहीं हो सकता। क्या वह ठीक है?
लॉजिक नाइट

हां यह ठीक है।
फीनोटपी

14

ग्रिम , हास्केल

परिचय

गूलर बूलियन व्याकरण पर आधारित है । मूल विचार छोटे घटकों से आयताकार पैटर्न का निर्माण करना है, और जांचना है कि क्या वे इनपुट मैट्रिक्स में पाए जाते हैं। अब तक, Grime केवल आयताकार मैचों का समर्थन करता है, और कम से कम 11 समस्याओं को कम या ज्यादा सुरुचिपूर्ण ढंग से हल करता है।

संपादित करें: क्रॉस को फिक्स्ड (बग को स्पॉट करने के लिए DLosc के लिए धन्यवाद), और हीरे के खनन को जोड़ा।

EDIT2: चरित्र वर्ग जोड़े गए, जो स्लिप से प्रेरित थे। इसके अलावा विकल्प झंडे के वाक्यविन्यास को बदल दिया, अभिव्यक्ति पार्सर में सुधार किया, और नो-क्यू समस्या को जोड़ा।

EDIT3: आकार की कमी को लागू किया, और नीदरलैंड पोर्टल्स की समस्या को जोड़ा।

प्रयोग

एक जमीनी कार्यक्रम को एक व्याकरण कहा जाता है , और एक व्याकरण के लिए सही फ़ाइल एक्सटेंशन है .gr, हालांकि यह लागू नहीं है। व्याकरण का मूल्यांकन किया जाता है

runhaskell grime.hs [options] grammarfile matrixfile

matrixfileचरित्र मैट्रिक्स वाली फाइल कहां है। उदाहरण के लिए, अंकों के व्याकरण का मूल्यांकन किया जाएगा

runhaskell grime.hs digits.gr digit-matrix

अतिरिक्त गति के लिए, मैं अनुकूलन के साथ फ़ाइल संकलित करने की सलाह देता हूं:

ghc -O2 grime.hs
./grime digits.gr digit-matrix

डिफ़ॉल्ट रूप से, दुभाषिया पहले मैच को खोजता है, लेकिन यह विकल्प झंडे का उपयोग करके नियंत्रित किया जा सकता है:

  • -e: केवल पूरे मैट्रिक्स से 1मिलान करें, मैच के लिए प्रिंट करें और 0बिना किसी मैच के।
  • -n: यदि -eदिया गया है तो माचिस की संख्या या पूरे मैट्रिक्स को भी प्रिंट करें ।
  • -a: सभी मैच प्रिंट करें।
  • -p: प्रारूप में मैचों की स्थिति को भी प्रिंट करें (x,y,w,h)
  • -s: मैचों को स्वयं न छापें।
  • -d: डिबग जानकारी प्रिंट करें।

व्याकरण के भीतर विकल्प भी निर्दिष्ट किए जा सकते हैं, उन्हें किसी भी लाइन से पहले डालने और अल्पविराम जोड़कर ,(उदाहरण के लिए नीचे देखें)।

सिंटेक्स और शब्दार्थ

एक ग्राम व्याकरण में एक या एक से अधिक परिभाषाएँ होती हैं , प्रत्येक एक अलग रेखा पर होती हैं। उनमें से प्रत्येक एक नॉनटर्मिनल के मूल्य को परिभाषित करता है , और उनमें से एक को अनाम टॉनवेलर को परिभाषित करना चाहिए । एक परिभाषा का सिंटैक्स N=Eया तो है E, जहां Nएक अपरकेस अक्षर है और Eएक अभिव्यक्ति है

भावों का निर्माण निम्नानुसार किया जाता है।

  • कोई भी चरित्र \किसी भी 1x1आयत से मेल खाता है, जिसमें वह पात्र होता है।
  • . किसी एक पात्र से मेल खाता है।
  • $1x1चरित्र मैट्रिक्स के बाहर एक आयत से मेल खाता है ।
  • _ शून्य चौड़ाई या ऊंचाई के किसी भी आयत से मेल खाता है।
  • पूर्व निर्धारित चरित्र समूह हैं digit, uppercase, lowercase, alphabetic, अल्फा numeric, और symbol।
  • नए वर्ण वर्गों को वाक्य रचना द्वारा परिभाषित किया जा सकता है [a-prt-w,d-gu]। बाईं ओर के अक्षर शामिल हैं, और दाईं ओर के लोगों को बाहर रखा गया है, इसलिए यह बिल्कुल अक्षरों से मेल खाता है abchijklmnoprtvw। यदि बाईं ओर खाली है, तो इसे सभी वर्णों को शामिल करने के लिए लिया गया है। यदि दाईं ओर खाली है तो अल्पविराम छोड़ा जा सकता है। पात्रों के [],-\साथ बच जाना चाहिए \
  • एक बिना पढ़ा हुआ अपरकेस अक्षर एक गैर-विषयक है, और इसे दी गई अभिव्यक्ति से मेल खाता है।
  • अगर Pऔर Qअभिव्यक्ति कर रहे हैं, तो PQसिर्फ अपने क्षैतिज संयोजन है, और P/Q, उनकी खड़ी संयोजन है के साथ Pशीर्ष पर।
  • P+Pक्षैतिज रूप से एक या अधिक संरेखित है, और P/+एक ही लंबवत संरेखित है।
  • बूलियन ऑपरेशन को निरूपित किया जाता है P|Q, P&Qऔर P!
  • P?के लिए आशुलिपि है P|_, P*के लिए P+|_, और P/*के लिए P/+|_
  • P#किसी भी आयत से मेल खाता है जिसमें एक मेल होता है P
  • P{a-b,c-d}, जहां abcdगैर-पूर्णांक होते हैं, एक आकार की बाधा है P। यदि Pएक वर्ण वर्ग है, तो अभिव्यक्ति किसी भी mxnआयत से मेल खाती है जिसमें केवल वे ही अक्षर होते हैं, बशर्ते कि mबीच aऔर bसमावेशी हो, और nबीच cऔर dसमावेशी हो। अन्य मामलों में, अभिव्यक्ति किसी भी आयत से मेल खाती है जिसका सही आकार है और जो Pमेल भी खाता है। तो aया cछोड़े गए हैं, वे होने के लिए लिया जाता है 0, और अगर bया dछोड़े गए हैं, वे अनंत हैं। के बीच हाइफन हैं aऔर bछोड़ दिया जाता है, तो हम अंतराल के दोनों सिरों के लिए एक ही नंबर का उपयोग करें। अगर पूराc-dभाग छोड़ा जाता है, दोनों कुल्हाड़ियों को विवश किया जाता है। स्पष्ट करने के लिए, {-b}के बराबर है {0-b,0-b}और {a-,c}के बराबर है {a-infinity,c-c}

टिप्पणियाँ

जीर्ण A=A!अनिर्धारित व्यवहार के साथ विरोधाभासी परिभाषाओं की अनुमति देता है। हालांकि, वे क्रैश या अनंत लूप का कारण नहीं बनेंगे।

जमीनी गैर-आयताकार इनपुट का समर्थन करता है; पंक्तियों को बस बाईं ओर संरेखित किया जाता है, और अंतराल का उपयोग करके मिलान किया जा सकता है $

भविष्य में, मैं निम्नलिखित को लागू करना चाहूंगा:

  • तेजी से मिलान। वर्तमान में, दुभाषिया इस तथ्य को ध्यान में नहीं रखता है कि, उदाहरण के लिए, .केवल 1x1आयतों से मेल खा सकता है । जब तक यह एक मैच नहीं पाता, तब तक यह क्रम में सभी आकारों के सभी आयतों को आज़माता है, उनमें से प्रत्येक के लिए तुरंत विफल हो जाता है।
  • शब्द खोज और ग्लाइडर चुनौतियों के लिए रोटेशन और प्रतिबिंब संचालन।
  • संदर्भों का उपयोग करते हुए गैर-आयताकार मैच , जो बोगल बोर्ड चुनौती में सहायक होगा। उदाहरण के लिए, Pv(Q>R)इसका मतलब है Pनीचे संदर्भ (साथ Qसही संदर्भ के साथ R)। यह एल-आकार के पैटर्न से मेल खाएगा

    PPP
    PPP
    QQQRRRR
    QQQRRRR
    QQQRRRR
    

कार्य

जटिलता के क्रम में मोटे तौर पर दिया गया।

अंकों का आयत

d{2-}

यह सरल है: कम से कम आकार के अंकों की एक आयत 2x2

कोई क्यू या क्यू नहीं

[,qQ]{4}

यह लगभग पहले की तरह सरल है; अब हमारे पास अधिक प्रतिबंधित आकार और एक कस्टम वर्ण वर्ग है।

क्षैतिज और ऊर्ध्वाधर संरेखण

\#.*\#|\#/./*/\#

अब हमारे पास कुछ पात्र बच गए हैं। असल में, यह #किसी भी वर्ण की किसी भी संख्या से मेल खाता है , फिर #, क्षैतिज या लंबवत रूप से।

वर्ग इनपुट का पता लगाएं

S=.|S./+/.+
e,S

यह व्याकरण बहुत सरल है, यह मूल रूप से परिभाषित करता है कि एक वर्ग या तो एक 1x1आयत है, या उसके दाहिने किनारे पर एक स्तंभ के साथ एक छोटा वर्ग है, और एक पंक्ति उसके नीचे से जुड़ी है। eटॉपलेवल नॉनटर्मिनल से पहले विकल्प भी नोट करें , जो संपूर्ण इनपुट सत्यापन को टॉगल करता है।

शब्द खोज में एक शब्द खोजना

G=\G
O=\O
L=\L
F=\F
GOLF|FLOG|G/O/L/F|F/L/O/G|G.../.O../..L./...F|...G/..O./.L../F...|F.../.L../..O./...G|...F/..L./.O../G...

यह एक भयानक है, क्योंकि Grime में रोटेशन या प्रतिबिंब के लिए कोई ऑपरेशन नहीं है। यह भी बेहद धीमा है, क्योंकि ग्रिम को नहीं पता है कि मैच केवल आकार के हो सकते हैं 4x1, 1x4या 4x4

ग्लाइडर समस्या को इसी तरह से हल किया जा सकता है, लेकिन मुझे यह लिखने के लिए बहुत आलसी होना चाहिए।

नीदरलैंड के पोर्टल

.\X+./\X/+\.{2-22,3-22}\X/+/.\X+.

आकार प्रतिबंध ऑपरेटर के साथ, यह मुश्किल नहीं है। मध्य भाग सही आकारों के \.{2-22,3-22}किसी भी आयत से मेल खाता है ., और फिर हम बस Xदोनों पक्षों पर एस के कॉलम जोड़ते हैं , और Xउस के ऊपर और नीचे के अंत में अनदेखे छोरों के साथ एस की पंक्तियों से निपटते हैं ।

मैचिंग क्रॉस

E=\.+/+
F=\#+/+
EFE/F/EFE&(E/F/E)F(E/F/E)

यहाँ हमारे पास दो भावों का एक संयोजन (तार्किक और) है। Nonterminal Eकी एक अरिक्त आयत से मेल खाता .है, और Fकी एक अरिक्त आयत #रों। संयुग्मन के बाईं ओर प्रकार के आयतों से मेल खाता है

...####..
...####..
...####..
#########
#########
.....##..
.....##..

हमारे पास EFEशीर्ष पर है, फिर F, और फिर EFEफिर से। सही पक्ष इन के पारगमन से मेल खाता है, इसलिए हम बिल्कुल पार हो जाते हैं।

हीरा खनन

C=./+
T=\X|CTC/\/.+\\
B=\X|\\.+\//CBC
CTC/\X.+\X/CBC

नॉनटर्मिनल Cकिसी भी 1xnकॉलम के लिए एक शॉर्टहैंड है । एक हीरे का शीर्ष आधा भाग मेल खाता है T: यह या तो एक एकल है X, या Tदोनों तरफ एक स्तंभ से घिरा हुआ है, और उसके /[something]\नीचे एक पंक्ति है। Bएक हीरे के नीचे उसी तरह से मेल खाता है, और टॉपवेल नॉनटर्मिनल X[something]Xशीर्ष आधे और नीचे आधे के बीच के रूप की पंक्ति है ।

शतरंज की बिसात ढूंढना

(\#\#|\#/\#|\_\_|\_/\_)#!&[#_]{3-}

राइट-हैंड साइड , s और s के [#_]{3-}किसी 3x3या बड़े आयत से मेल खाता है , जबकि लेफ्ट-हैंड साइड गारंटी देता है कि इसमें दो समीपवर्ती s या s नहीं हैं।#_#_

शतरंज की बिसात का सत्यापन

e,(\#\#|\#/\#|\_\_|\_/\_)#!&[#_]+/+

यह मूल रूप से ऊपर के समान है, सिवाय इसके कि हम किसी भी गैर-खाली आयत से मेल खा सकते हैं, लेकिन eपूरे इनपुट सत्यापन के लिए ध्वज का उपयोग करने की आवश्यकता है ।

प्रस्तावना वाक्यविन्यास सत्यापित करें

A=[,()]/*
P=A*|P(A/\(/A)P(A/\)/A)P
e,P

यह शायद अब तक का सबसे दिलचस्प व्याकरण है। Nonterminal Aयुक्त नहीं किसी भी स्तंभ से मेल खाता है (या ), और Pया तो के कुछ नंबर से मेल खाता Aहै, या दो का मिलान नहीं हुआ कोष्ठक, के बीच और जो बाहर अधिक देखते हैं Pरों।


@DLosc फिक्स्ड, बग खोजने के लिए धन्यवाद!
ज़र्गब

चाहेंगे \#(.*|./*)\#काम करते हैं?
देखिए

@ संरेखित करें संरेखण के लिए? दुर्भाग्य से नहीं, क्योंकि इसे " #बाईं ओर एक, फिर किसी भी चीज़ की एक पंक्ति या स्तंभ, फिर #दाईं ओर" के रूप में पार्स किया जाएगा । मुझे यह निर्दिष्ट करने की आवश्यकता है कि #स्लैश का उपयोग करके कॉलम को लंबवत रूप से समतल किया गया है /
जर्बर्ग

10

TMARL

खाका मिलान और मान्यता भाषा

विवरण

मेरा दुभाषिया 24K वर्ण लेता है ( कोड स्निपेट पात्रों को लेता है ? ), इसलिए पूरा विवरण यहां पाया जा सकता है

सबसे अच्छा हिस्सा: दुभाषिया जावास्क्रिप्ट में है, जिसका अर्थ है कि आप इसे यहीं आज़मा सकते हैं!

और समस्याओं के लिए:

# 1 - चेसबोर्ड ढूंढना

$#_#
a
$_#_
bvacvbS5&(avcS5)G0G2P

&खोज करता है। अंत में G2 को मैच तत्व में 3 तत्व मिलता है, वास्तविक मैच। पहले 2 तत्व x और y निर्देशांक हैं (1 आधारित, 0 नहीं)।

# 3 - अंकों के एक आयत का पता लगाएं

$DD
$DD
S1G2P

मुझे लगता है कि यह बहुत सीधा है।

# 4 - एक शब्द खोज में एक शब्द ढूँढना

$GO\LF
a
$G
$*O
$**\L
$***F
S6&(aS6)G0G2P

Sयहां तक कि इतना है कि यह सब रोटेशन के लिए खोज करेंगे तर्क है। यह 4 से अधिक है क्योंकि इसे फिर अगली खोज में जोड़ा जा सकता है (व्यक्तिगत मैचों को जोड़ा नहीं जा सकता)।

# 5 - स्क्वायर इनपुट का पता लगाएं

IL-(IG0L)!P

यकीन नहीं है कि यह पूरी तरह से कानूनी है, क्योंकि यह केवल आयताकार को सही ढंग से निर्धारित करता है अगर इनपुट एक आयत है। यह ILपहली पंक्ति की लंबाई के साथ इनपुट की लंबाई की तुलना करता है IG0Lऔर इसे निष्क्रिय करता है।

# 6 - जीवन के एक खेल में ग्लाइडर्स का पता लगाएं

$## 
$# #
$# 
a
$ ##
$## 
$  #
bS6&(bMS6)&(aS6)&(aMS6)G0G2P

अंत में, दर्पण के लिए एक उपयोग!

# 12 - पत्र Q से बचें

$[^Qq]
~4*4S1G2P

S1 क्योंकि केवल 1 मैच की जरूरत है।

मैं बाद में कुछ कठिन काम करूंगा।

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