এটি স্পষ্টতই কাজের জন্য সঠিক ভাষা। : ^ ডি
s:({c<L>}{c<R>}0[(<R> <L>)(<L> <R>)_?])%{30}
c:0 *$
এটি যদি একটি বৈধ সাপ হয় তবে পুরো ইনপুটটির সাথে মেলে; এটি না হলে মিলতে ব্যর্থ। এখানে চেষ্টা করুন!
ব্যাখ্যা
স্নেকএক্স একটি 2-ডি প্যাটার্ন মেলানো ভাষা । একটি প্রোগ্রাম "সাপ" এর সংজ্ঞাগুলির একটি তালিকা নিয়ে গঠিত যা ইনপুট মিলের অক্ষরগুলির চারদিকে ক্রল করে, দিকনির্দেশ পরিবর্তন করে এবং অন্যান্য সাপকে আটকায়। আমাদের প্রোগ্রামে আমরা দুটি সাপকে সংজ্ঞায়িত করি s
এবং c
।
আমরা c
এটি শুরু করব কারণ এটি সহজ। এর সংজ্ঞাটি হ'ল 0 *$
, আপনি যদি রেজেক্স জেনে থাকেন তবে যথেষ্ট পঠনযোগ্য হওয়া উচিত: ম্যাচ 0
, শূন্য বা তার বেশি স্পেসের পরে গ্রিডের প্রান্তটি অনুসরণ করুন। এখানে মূল ধরা: এই মিলটি যে কোনও দিকে এগিয়ে যেতে পারে। আমরা প্রতিটি কলামে c
অতিরিক্ত কোনও নেই তা যাচাই করতে, সাপ থেকে উপরের এবং নীচে উভয়ই ব্যবহার করব 0
।
এখন মূল সাপের জন্য s
,। এটি ফর্মটি গ্রহণ করে (...)%{30}
যার অর্থ "30 বার বার বন্ধনীগুলির বিষয়বস্তু মেলে" - 0
সাপের প্রত্যেকটির জন্য একবার । এ পর্যন্ত সব ঠিকই. প্রথম বন্ধনীর ভিতরে কি যায়?
{c<L>}
এটি একটি নতুন c
সাপ তৈরি করেছে, 90 ডিগ্রি বাম দিকে পরিণত হয়েছে। দিকটি s
সাপের দিকের সাথে তুলনামূলক , সুতরাং নতুন সাপটি গ্রিডের শীর্ষ দিকে অগ্রসর হয় (মূল সাপটি ডানদিকে এগিয়ে চলেছে)। c
সাপ চেক বর্তমান গ্রিড সেল একটি হল 0
এবং এটা উপরে যে সেল একটি স্থান। এটি ব্যর্থ হলে পুরো ম্যাচ ব্যর্থ হয়। যদি এটি সফল হয় তবে আমরা চালিয়ে যাচ্ছি
{c<R>}
যা একই জিনিসটি করে, কেবল ডানদিকে ঘুরে (গ্রিডের নীচের দিকে)।
নোট করুন যে এই স্প্যানগুলি প্রধান সাপে ম্যাচের পয়েন্টারের অবস্থানকে প্রভাবিত করে না। তারা কিছুটা রেগেক্সে লুক হেডসের মতো। (সম্ভবত এখানে আমরা তাদের "লুক বাইসাইড" বলতে পারি?) সুতরাং আমরা একটিটিকে নির্দেশ করছি 0
এবং বাকি কলামে কেবল ফাঁকা স্থান রয়েছে তা যাচাই করার পরে, আমাদের আসলে এটির সাথে মেলে নেওয়া দরকার 0
:
0
এখন ম্যাচের পয়েন্টারটি ডানদিকে অক্ষরে রয়েছে 0
। আমাদের তিনটি পৃথক বিকল্প পরীক্ষা করতে হবে: সাপটি নীচে কোণে, সাপটি কোণে বা সাপটি সোজা হয়ে যায়। এর জন্য, আমরা একটি ওআর এক্সপ্রেশন ব্যবহার করতে পারি:
[...]
আমাদের OR এর ভিতরে আমাদের তিনটি সম্ভাবনা রয়েছে:
(<R> <L>)
ডানদিকে ঘুরুন, একটি জায়গার সাথে মিল করুন এবং আবার বাম দিকে ঘুরুন (সাপের নীচে কোণে)।
(<L> <R>)
বাম দিকে ঘুরুন, একটি জায়গার সাথে মিল করুন এবং আবার ডানদিকে ঘুরুন (সাপের কোণগুলি উপরে)।
_?
ম্যাচ শূন্য বা একটি আন্ডারস্কোর। ইনপুটটিতে যেহেতু কোনও আন্ডারস্কোর নেই, তাই এটি সর্বদা একটি খালি ম্যাচ হবে (সাপ সোজা হয়ে যায়)।
উপরোক্ত তিনটি বিকল্পের মধ্যে একটির সাথে মিলে যাওয়ার পরে, ম্যাচ পয়েন্টারটি 0
পরবর্তী কলামের দিকে ইশারা করা উচিত , আবার প্রথম বন্ধনী প্রকাশের সাথে মিল রাখতে প্রস্তুত।