ভাষার নকশা: 2-ডি প্যাটার্ন ম্যাচিং


49

এটি পাক্ষিক চ্যালেঞ্জ # 6 । থিম: ভাষা নকশা

আছে একটি চ্যাটরুম এই প্রতিদ্বন্দ্বিতায় জন্য। আপনি আইডিয়া নিয়ে আলোচনা করতে চাইলে আমাদের সাথে যোগ দিন!

এবং এখন সম্পূর্ণ ভিন্ন কিছু...

এই পাক্ষিক, আমরা একটি নতুন ধরণের চ্যালেঞ্জ নিয়ে পরীক্ষা করতে চাই। এই চ্যালেঞ্জে, আপনি একটি ভাষা ডিজাইন করা হবে! প্যাটার্ন ম্যাচিং প্রোগ্রামিংয়ে একটি খুব সাধারণ সমস্যা এবং কোড গল্ফের জন্য প্রায়শই খুব কার্যকর। নিয়মিত প্রকাশ, উদাহরণস্বরূপ, পাঠ্য লাইনের একটি প্যাটার্ন সনাক্ত করতে ব্যবহার করা যেতে পারে। দ্বি-মাত্রিক নিদর্শনগুলি বর্ণনা এবং সনাক্ত করার জন্য কোনও প্রতিষ্ঠিত পদ্ধতি নেই।

চ্যালেঞ্জ

আপনি একটি প্যাটার্ন-ম্যাচিং ভাষা ডিজাইন করতে পারেন যা পাঠ্যের ব্লকগুলিতে দ্বি-মাত্রিক নিদর্শনগুলির বর্ণনা মঞ্জুরি দেয়। অপারেশন মোড (যদিও আপনার ভাষা অন্যথায় Regex সঙ্গে সাধারণ কিছু আছে তা নয়) আপনার ভাষার রেগুলার এক্সপ্রেশনের অনুরূপ হবে:

  • ইনপুট হিসাবে, আপনি পাঠ্যের একটি আয়তক্ষেত্রাকার ব্লক পাবেন। আপনি ধরে নিতে পারেন যে পাঠ্যটিতে গ্রিডের সারিগুলি পৃথক করতে কেবল প্রিন্টযোগ্য ASCII অক্ষর (0x20 থেকে 0x7E) এবং নিউলাইনগুলি (0x0A) থাকতে পারে।
  • প্যাটার্নের বিবরণ অনুসারে কোনও ম্যাচ যদি পাঠ্যের এই ব্লকের কোনও উপসেট হিসাবে পাওয়া যায়, তবে এই ম্যাচটি ফেরত বা মুদ্রণ করা উচিত। যদি ম্যাচটি অ-আয়তক্ষেত্রাকার হতে পারে তবে এটি কিছু সংরক্ষিত অক্ষরযুক্ত একটি আয়তক্ষেত্রাকার অঞ্চলে প্যাড করা উচিত। যদি বেশ কয়েকটি বৈধ ম্যাচ থাকে তবে আপনি সিদ্ধান্ত নিতে পারেন কীভাবে ফিরে আসা ম্যাচটি বেছে নেওয়া হয় (বৃহত্তম, ক্ষুদ্রতম, প্রথম ইত্যাদি)।

কিছু প্রয়োগের ক্ষেত্রে এটি কার্যকর হতে পারে যদি আপনার প্রয়োগটি ম্যাচের পরিবর্তে ম্যাচের অবস্থানটি ফিরিয়ে দিতে পারে তবে এটি কোনও প্রয়োজন নয়।

খুব কমপক্ষে, আপনার ভাষাটিকে এর ইনপুটটির একটি সামঞ্জস্যপূর্ণ, আয়তক্ষেত্রাকার সাবগ্রিওশন হিসাবে কোনও প্যাটার্নটি মেলাতে সক্ষম করা উচিত।

আপনার উত্তরে অন্তর্ভুক্ত থাকা উচিত:

  • একটি বিবরণ ভাষার।
  • একটি কার্যকরী বাস্তবায়ন । এটি কোনও প্রোগ্রাম, বা আপনার পছন্দের একটি ভাষাতে ফাংশন / ক্লাসের সেট হতে পারে।
  • নীচে প্রদত্ত উদাহরণগুলি সমাধান করতে কীভাবে এটি ব্যবহার করা যেতে পারে তা দেখিয়ে আপনার ভাষা প্রদর্শন করা উচিত । আপনার ভাষা সেগুলির সাথে সব মিলিয়ে নিতে সক্ষম হতে হবে না তবে আপনাকে অবশ্যই এইগুলির মধ্যে কমপক্ষে 8 টির সাথে মিল রাখতে সক্ষম হতে হবে । আপনার ভাষা যদি অভিনব কিছু করতে পারে যা আমরা ভাবিনি, তবে এটিকেও অন্তর্ভুক্ত করতে নির্দ্বিধায়।

যদি আপনার উত্তরটি বিদ্যমান ধারণাগুলির উপর নির্ভর করে, তবে তা ঠিক আছে তবে দয়া করে যেখানে creditণ প্রদান করুন।

এক্সটেনশানগুলি

উপরোক্ত বৈধ জমাটি সন্তুষ্ট করতে হবে এমন ন্যূনতম বর্ণনা করে। তবে বেশ কয়েকটি সাধারণীকরণ এ জাতীয় প্যাটার্নের সাথে মিলে যাওয়া ভাষাটিকে আরও কার্যকর করতে পারে, তবে এতে সীমাবদ্ধ নয়:

  • এক বা একাধিক প্রান্তগুলিতে প্যাটার্নটি অ্যাঙ্কর করতে সক্ষম হওয়া, যাতে পুরো ইনপুট অঞ্চলে নির্দিষ্ট প্যাটার্ন রয়েছে কিনা তা পরীক্ষা করতে পারে।
  • কেবল একটির পরিবর্তে সমস্ত ম্যাচ উত্পাদন করছে। আপনি ওভারল্যাপিং মিলগুলির শব্দার্থকগুলি চয়ন করতে পারেন।
  • ইনপুট হিসাবে আয়তক্ষেত্রাকার পাঠ্য নেওয়া।
  • অ-আয়তক্ষেত্রাকার মিলগুলি নির্দিষ্ট করার জন্য নিদর্শনগুলিকে মঞ্জুরি দিচ্ছে। যেমন একটি ক্ষেত্রে, আউটপুট কিছু সংরক্ষিত অক্ষর সঙ্গে একটি আয়তক্ষেত্র প্যাড করা উচিত।
  • ছিদ্রগুলির সাথে মিলগুলি নির্দিষ্ট করার জন্য নিদর্শনগুলিকে মঞ্জুরি দিচ্ছে।
  • নির্দিষ্ট অফসেটের সাথে উপস্থিত দুটি অক্ষরের মতো অ-মিল থাকা মেলগুলির অনুমতি দেওয়া হচ্ছে।
  • আবর্তন এবং প্রতিবিম্বের সহজ স্পেসিফিকেশন।
  • বৈকল্পিকভাবে ইনপুটটিকে সিলিন্ডার বা টরাস হিসাবে চক্রাকারে চিকিত্সা করুন, যেমন বিপরীত প্রান্তগুলি সংলগ্ন হিসাবে বিবেচিত হয়।

স্কোরিং

এই চ্যালেঞ্জের প্রাথমিক লক্ষ্যটি একটি কার্যকর 2 ডি প্যাটার্ন-মিলের ভাষা তৈরি করা যা ভবিষ্যতে সম্ভবত ব্যবহার করা যেতে পারে। যেমন, "উদাহরণগুলি সমাধানের জন্য সংক্ষিপ্ততম সংযুক্ত দৈর্ঘ্য" এর মতো একটি স্কোরিং সিস্টেম সাধারণ ব্যবহারের জন্য ব্যয় করে নির্দিষ্ট কার্যকারিতা হার্ড-কোডিংয়ের দিকে নিয়ে যায়। অতএব, আমরা স্থির করেছি যে এই চ্যালেঞ্জটি জনপ্রিয়তার প্রতিযোগিতা হিসাবে সেরা সর্বাধিক নেট ভোট সহ জমাটি জয়লাভ করে। যদিও আমরা লোকেরা কীভাবে ভোট দেয় জোর করতে পারি না, তবে ভোটারদের আদর্শভাবে কী কী সন্ধান করা উচিত সে সম্পর্কে এখানে কয়েকটি গাইডলাইন রয়েছে:

  • Expressiveness। এই প্রশ্নটিতে উপস্থাপিত উদাহরণগুলির বাইরেও কি ভাষা বিভিন্ন সমস্যা সমাধান করতে পারে? এটি প্রস্তাবিত এক্সটেনশনের কোনওটিকে সমর্থন করে?
  • পঠনযোগ্যতার। স্বরলিপিটি কতটা স্বজ্ঞাত (কমপক্ষে এমন ব্যক্তিদের কাছে যারা মূল বাক্য গঠন জানেন)?
  • Golfitude। এটি এখনও কোডগলফ.এসই। এই সাইটের উদ্দেশ্যগুলির জন্য, অবশ্যই একটি মেলানো ভাষা পাওয়া খুব সুন্দর হবে যা একটি প্যাটার্ন বর্ণনা করার জন্য খুব কম কোড প্রয়োজন।

সমস্যাগুলির উদাহরণ

নিম্নলিখিত স্ট্যাক স্নিপেট 16 টি উদাহরণ দেখায় যেগুলি 2-ডি প্যাটার্নের সাথে মিলে যাওয়া ভাষা মোকাবেলা করতে সক্ষম হতে পারে। প্রতিটি উদাহরণে একটি সংক্ষিপ্ত সমস্যার বিবরণ থাকে এবং তারপরে সাধারণত একটি ইনপুট উদাহরণ অনুসরণ করা হয় যেখানে কোনও মিল খুঁজে পাওয়া যায় এবং একটি উদাহরণ যেখানে কোনও মিল খুঁজে পাওয়া যায় না (যদি প্রযোজ্য হয়)।

উপরে বর্ণিত হিসাবে, আপনার ভাষা কেবলমাত্র এই 8 টি সমস্যার সমাধান করতে সক্ষম হতে হবে। এর উপরে থাকা সমস্ত কিছুই alচ্ছিক, তবে অবশ্যই আপনার ভোটের সংখ্যা বাড়ানো উচিত।

(না, আপনাকে এইচটিএমএল কোডটি পড়ার দরকার নেই your আপনার ব্রাউজারটি সুন্দরভাবে রেন্ডার করার জন্য "রান কোড স্নিপেট" বোতামটি হিট করুন, যা আপনি সম্পূর্ণ স্ক্রিনটিও দেখতে পারেন))


এই সমস্যাগুলির জন্য কি কোনও সাধারণ সময়সীমা রয়েছে? আমি এটি সমাধানে খুব আগ্রহী তবে আমি খুব ব্যস্ত, এটি করতে আমাকে খুব সহজে 2 সপ্তাহ সময় নিতে পারে।
ডিভন পার্সসন

7
@ ডিভনপারসনস প্রবেশের কোনও শেষ সময়সীমা নেই।
ফিনোটপিআই

আকর্ষণীয় দেখাচ্ছে, বিশেষত যেহেতু আপনি এটির জন্য একটি নতুন ট্যাগ তৈরি করেছেন। আমি মনে করি এর জন্য 2-ডি ভাষা তৈরির জন্য বোনাস পয়েন্ট থাকা উচিত।
mbomb007

1
@ mbomb007 একটি 2-ডি ভাষা তৈরির জন্য বোনাস পয়েন্ট রয়েছে। আমি নিশ্চিত যে এটি একটি ভাল পরিমাণে upvotes পাবেন। ;)
মার্টিন এন্ডার

@ মার্টিনবাটনার আমি কীভাবে একটি ভাষা তৈরি করতে পারি তাও জানি না। এটি কি পাইথন প্রোগ্রাম তৈরির মতো কিছু হতে পারে যা আপনার নতুন ভাষার কোডের একটি ফাইল নেয় (এবং আপনার সংজ্ঞায়িত সিনট্যাক্সের ভিত্তিতে ব্যাখ্যা করে / নির্বাহ করে) এবং আউটপুট উত্পাদন করে?
mbomb007

উত্তর:


32

SnakeEx

এখনও 15/16 সমস্যার সমাধান!

অনলাইন দোভাষী ! - সম্পূর্ণ ভাষার বৈশিষ্ট - জাভাস্ক্রিপ্ট উত্স

দোভাষী স্ক্রিনশট

এই ভাষার পিছনে ধারণাটি হ'ল 'সাপগুলি' সংজ্ঞায়িত করা যা একটি রেজেেক্স-জাতীয় সিনট্যাক্স ব্যবহার করে পাঠ্য পরীক্ষার অক্ষরের চারপাশে চলে।

স্নেকএক্সে একটি প্রোগ্রামে কমান্ডের বিভিন্ন সিকোয়েন্স ব্যবহার করে সাপগুলির সংজ্ঞাগুলির একটি তালিকা থাকে। এই সংজ্ঞাগুলি ব্যবহার করে সাপগুলি অন্যান্য সাপগুলিকে ছড়িয়ে দিতে পারে, যেখানে স্নেকএক্স তার বেশিরভাগ শক্তি পায় - আমরা শাখা কাঠামোগুলির সাথে মেলাতে পারি এমনকি পুনরাবৃত্তিও করতে পারি (পারেন ম্যাচের উদাহরণ দেখুন)।

প্রতিটি প্রোগ্রামটি মূলত রেজেক্সের সংকলনের মতো দেখবে, তবে ফর্মটির দিকনির্দেশ কমান্ডগুলি যুক্ত করার সাথে <dir>এটি সাপের দিক পরিবর্তন করে এবং আরও সাপ ছড়িয়ে দেওয়ার ফর্মটির আদেশগুলি কল করে {label<dir>params}

কোনও প্রবেশের জন্য, দোভাষী প্রথম সংজ্ঞাটি ডান দিকে সরিয়ে একটি সাপ তৈরি করেন।

এটি মারাত্মকভাবে সংক্ষিপ্ত নয়, তবে এটি অত্যন্ত শক্তিশালী এবং (আমি মনে করি) বেশ পঠনযোগ্য।

আপডেট

  • বদলে গেছে! যৌক্তিক নয় এবং matches মিলগুলি চিহ্নিত না করা
  • <!>কলিনিয়ার সমাধান করার জন্য যুক্ত করা হয়েছে
  • সমাধান ম্যাচিং ক্রসগুলি
  • কম ভয়ঙ্কর উপায়ে দাবাবোর্ডগুলি সমাধান করা
  • বাউন্ডার ক্লোজার সিনট্যাক্স যুক্ত হয়েছে %{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,}সংজ্ঞা C (ব্যবহার করে একটি অবসান "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 - মাইনক্রাফ্ট বুকে স্থান

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

এখানে আমরা একটি লজিকাল নট ( !) ব্যবহার করি যা নীচের টোকেনটির সাথে কিছু মিলছে না এবং তা মিলছে। ঘোষণাপত্রটি dএকটি নির্দিষ্ট দিকে ডাবল বুক সনাক্ত করে, সুতরাং !{d<+>}নিশ্চিত করুন যে কোনও অরথোগোনাল দিকের কোনও ডাবল বুক নেই। sবর্তমান স্কোয়ারের চারপাশে অল্প ডায়মন্ডে চলে আসে those এর মধ্যে কমপক্ষে 3 টি ফাঁকা স্থান ফাঁকা হয় বা বোর্ডের বাইরে যাচাই করে। \.পূর্ববর্তী সমস্ত শর্ত সাফল্যরূপে ধরে রেখে শেষের দিকে স্কোরের সাথে মেলে।

সমস্যা 9 - অনুভূমিক এবং উল্লম্ব প্রান্তিককরণ

m:<R>?#~.*#

ক্রমটি মেলানোর আগে সাপটি mallyচ্ছিকভাবে ডানদিকে <R>?ঘুরবে। .রেগেক্সের মতো একটি ওয়াইল্ডকার্ড।

সমস্যা 10 - কলিনার পয়েন্টস

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

<!>দিকটি যুক্ত হওয়ার সাথে সাথে আমরা এখন এটি সমাধান করতে পারি! <!>এর মতো <+>তবে চার দিকের শাখা প্রশাখার পরিবর্তে এটি প্রতিটি সম্ভাব্য দিক দিয়ে শাখা করে।

সমস্যা 12 - চিঠিটি এড়িয়ে চলুন প্রশ্ন

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

কেবলমাত্র 4 টি সাপ তৈরি হয়েছে যা প্রত্যেকে চারটি অক্ষরের সন্ধান করে যা অক্ষর Q নয় for

সমস্যা 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দুটি সাপ জন্মায়, একটি তার পিছনে ডান দিকে এবং একটি তার ডানদিকে এগিয়ে। এগুলির প্রত্যেকটি একটি এক্সকে স্ল্যাশ অনুসরণ করে, এবং তার বর্তমান দিকের ডান কোণে অন্য একটি সাপ তৈরি করে, যা নীচের এক্সে স্ল্যাশ অনুসরণ করে follows

সমস্যা 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:#+

এখানে আমি প্রথমবার Pআইগিব্যাক প্যারামিটার ব্যবহার করেছি । সাধারণত সাপগুলি স্বতন্ত্র থাকে তবে আপনি যদি এই প্যারামিটার দিয়ে কল করেন তবে কলিং সাপটি কলি দিয়ে সরিয়ে নেওয়া হবে। সুতরাং e2'।' এর ক্রম, তারপরে '#' এর ক্রম, তারপরে '.'র আর একটি সিকোয়েন্স পরীক্ষা করতে পারে এবং সেগুলি পৃথক কল হতে পারে যাতে আমরা তাদেরকে' 1, '2' এবং '3' দিয়ে গ্রুপ করতে পারি , তাদের দৈর্ঘ্য মেলে ধরতে বাধ্য করছে।

সমস্যা 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>])।

অতিরিক্ত - পারেন ম্যাচিং

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

কীভাবে প্রিলিডে করতে হবে তা এখনও বুঝতে পারেন নি, তবে এখানে প্রথম পদক্ষেপ! এখানে আমি rসাপটিকে পুনরাবৃত্তির সাথে সম্পর্কিত প্যারেনেসিসের সাথে মিলিয়ে ব্যবহার করে দেখছি যে তাদের মধ্যে কোনও মিল নেই parent

অতিরিক্ত - এএসসিআইআই টপোলজি: গণনা লুপগুলি


আপনি কি সিনট্যাক্স যুক্ত করার বিষয়টি বিবেচনা করবেন যাতে এই ভাষাটি কেবল মিলের পরিবর্তে প্রতিস্থাপন করতে পারে? কোডগল্ফ.স্ট্যাকেক্সেঞ্জার.কম / সেকশনস / ৫১১১১১/২ এর জন্য একটি এন্ট্রি লিখতে আমি এই চ্যালেঞ্জের কিছু সমাধান ব্যবহার করতে চাই তবে এখানে একটিও সমাধান খুঁজে পাওয়া যাবে না এবং এটি প্রতিস্থাপন করবে না। (আমি জানি ভাষা নির্দিষ্ট টাইমিং নিয়মের কারণে আমার উত্তর বৈধ হবে না)
স্পার

@Sparr। কোনও খারাপ ধারণা নয়, এটি অবশ্যই কোড গল্ফের জন্য আরও কার্যকর হবে। আমি নিজে কখন এটি করার সময় পাব তা নিশ্চিত নয়, তবে আমি এটি মনে রাখব।
বিএমাক

3
পৃথকভাবে: দিক পরিবর্তনের জন্য বাক্য গঠন বিভ্রান্তিকর। যেহেতু সাপ একটি চরিত্রের সাথে মিলে যাওয়ার পরে অগ্রসর হয়, আমার মনে হয় আমার দিকনির্দেশনাটি একটি চরিত্রকে আগেই পরিবর্তন করতে হবে যেখানে এটি আমার কাছে বোধগম্য হয়। উদাহরণ: স্ট্রিং "ABC A nDEF" এবং আমি ABCF দ্বারা সংজ্ঞায়িত এল আকৃতির টেট্রিস টুকরাটির সাথে মিল রাখতে চাই, আমি আমার সাপটিকে "এম: এবিসি <আর> এফ" হিসাবে লিখতে চাই তবে আমাকে "এম: এবি <<> লিখতে হবে পরিবর্তে সিএফ "। আমি বুঝতে পারি যে এটি অনুমানের সাথে মেলে তবে এটি আমি খুব বিপরীত বলে মনে করি।
স্পার

প্রিলিড সিনট্যাক্সের জন্য আমার একটি আংশিক সমাধান রয়েছে। একমাত্র সমস্যাটি হ'ল এটি পুরো m:{a<>} a:[({n<R>A})({n<R>A}*{l<R>A}{a<>P}{r<R>A})]*{n<R>A}* l:$[^\(\)]*\([^\(\)]*$ r:$[^\(\)]*\)[^\(\)]*$ n:$[^\(\)]+$
ইনপুটটির সাথে

21

স্লিপ, পাইথন ৩.৪ ( গিথুব উইকি , অনলাইন দোভাষী )

ফেয়ারসামের জমা দেওয়ার মতো এটিও গ্রিডকে অনুসরণ করার উপর ভিত্তি করে, তবে কার্পেট পাইথনের জমা দেওয়ার মতো এটি রেজেক্সের উপর ভিত্তি করে। কোনওরকম দেখে মনে হচ্ছে আমি মাঝের জায়গাটি নিতে পেরেছি।

আমি যুক্ত করতে চাই এমন বেশ কয়েকটি অপ্রাপ্তিময় বৈশিষ্ট্য রয়েছে, যাতে প্রাসঙ্গিক হয়ে আমি সময় পেলে আমি কী করতে চাই তা উল্লেখ করেছি।


আপডেট

(বিস্তারিত খবরের জন্য গিথুব পৃষ্ঠা দেখুন)

  • এপ্রিল 5 2015 : স্লিপে এখন একটি অনলাইন দোভাষী রয়েছে ! এটি এখনও প্রাথমিক পর্যায়ে রয়েছে, যাতে কয়েকটি বাগ থাকতে পারে।

  • এপ্রিল 5 2015 : দক্ষতা আপডেট! এখন নেটার পোর্টালগুলি বড় ইনপুটটি আরও দ্রুত (2 স) করে। এছাড়াও বেশ কয়েকটি সিনট্যাক্স পরিবর্তন হয়েছে, তাই উইকিটি পরীক্ষা করে দেখুন। গ্রুপ নম্বরও ঠিক করা হয়েছে।


স্লিপে একটি ম্যাচ পয়েন্টার রয়েছে যা একটি নির্দিষ্ট স্কোয়ার থেকে শুরু হয় এবং শুরুতে ডানদিকে মুখোমুখি হয়। যখন একটি চর মিলে যায়, পয়েন্টারটি বর্তমান দিকের দিকে এগিয়ে যায় (যদিও বাস্তবায়নগুলি সেই ক্রমে ঠিক কিছু করে না)।

ম্যাচ পয়েন্টার এর নির্দেশনায় একটি নির্দিষ্ট দিক থেকে সেট করা যেতে পারে ^<digit>, যেখানে ^0, ^1, ^2, ..., ^7, এন, উঃপূঃ, ই পয়েন্টার সেট করুন ..., উঃপঃ যথাক্রমে (ঘড়ির কাঁটার দিকে যাচ্ছে)।

নিম্নলিখিত শর্টকাটগুলি উপলব্ধ:

  • ^* 8 টি অরথোগোনাল বা তির্যক দিকগুলি পরীক্ষা করে,
  • ^+ সমস্ত 4 orthogonal দিক পরীক্ষা করে।

(ভবিষ্যতের পরিকল্পনা: (1, 2)নাইটের পদক্ষেপের জন্য স্বেচ্ছাসেবী নির্দেশাবলীর মঞ্জুরি দিন )

উদাহরণস্বরূপ ( সমস্যা 4 - একটি শব্দ অনুসন্ধানে একটি শব্দ সন্ধান করা ),

^*GOLF

"জিওএলএফ" শব্দটি সন্ধান করে 8 টি অরথোগোনাল বা তির্যক দিকনির্দেশ চেষ্টা করে। ডিফল্টরূপে, স্লিপ সমস্ত সম্ভাব্য প্রারম্ভিক স্কোয়ার চেষ্টা করে এবং ডুপ্লিকেটগুলি ফিল্টার করে প্রতিটি থেকে একটি ফলাফল দেয়, সুতরাং গ্রিডের মতো

GOLF
O
L
FLOG

শুধুমাত্র শীর্ষ সারি এবং নীচের সারিটি ম্যাচ হিসাবে প্রত্যাবর্তন করে (যেহেতু শীর্ষ সারি এবং বাম কলাম "জিএলএফ" একই বর্গ থেকে শুরু)। সমস্ত ম্যাচ পেতে, oওভারল্যাপিং ম্যাচ মোড ব্যবহার করা যেতে পারে।

একইভাবে ( 15 টি সমস্যা - একটি বগল বোর্ডে একটি শব্দ মেলে ),

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

panamaপ্রতিবার একটি ভিন্ন দিক চেষ্টা করে মিলছে । iসংবেদনশীলতার জন্য পতাকা ব্যবহার করুন । স্লিপ অক্ষরগুলি ডিফল্টরূপে পুনরায় ব্যবহার করে, তবে এটি rনো-রিপিট ফ্ল্যাগের সাথে টগল করা যায় ।

(ভবিষ্যতের পরিকল্পনা: একটি অনুসন্ধান মোড সংশোধক যা প্রতিটি পদক্ষেপের পরে স্বয়ংক্রিয়ভাবে দিকনির্দেশগুলির সেটগুলি পরীক্ষা করে যাতে পুনরাবৃত্তি ^*অপ্রয়োজনীয় হয়)

ম্যাচ পয়েন্টারের দিকনির্দেশটি 90 ডিগ্রি বাম বা ডানদিকে <বা >যথাক্রমে ঘোরানো যেতে পারে । এই ক্ষেত্রে,

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

প্যাটার্ন জন্য চেহারা

  #
## 
 ##

নিম্নলিখিত ক্রমটি দেখে:

765
894
123

এটি আমাদের 6 টি সমস্যা সমাধান করার অনুমতি দেয় - এর সাথে গ্লাইডার সন্ধান করা

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

যেখানে অংশ 1 এবং 2 গ্লাইডার আকারগুলি এনকোড করে এবং অংশ 3 এবং 4 তাদের প্রতিবিম্বিত অংশগুলিকে এনকোড করে।

নোট করুন যে স্লিপ `পালানোর জন্য ব্যাকটিক ব্যবহার করে। এটি কারণ স্লিপের আরও একটি চলাচল রয়েছে যা ভাষাটিকে তার নাম দেয় - স্লিপ কমান্ড। /ম্যাচ পয়েন্টারটি orthogonally বাম দিকে \পিছলে যায় , এবং ম্যাচ পয়েন্টারটি orthogonally ডানদিকে পিছলে যায়।

উদাহরণ স্বরূপ,

abc   ghi
   def

মিলে যেতে পারে abc\def/ghi

যদিও এটি নিজস্বভাবে বিশেষভাবে কার্যকর নয়, (?| <regex> )স্থির গ্রুপের সাথে একত্রিত হয়ে পিছলে যাওয়া আরও গুরুত্বপূর্ণ হয়ে ওঠে , যা ম্যাচের মতো চেহারা হিসাবে কাজ করে। অভ্যন্তরের রেজেক্সটি মিলছে, তারপরে ম্যাচের পয়েন্টারের অবস্থান এবং দিকটি স্থিতিশীল গ্রুপের আগে রাজ্যে পুনরায় সেট করা হবে।

উদাহরণ স্বরূপ,

abc
def
ghi

এর সাথে ম্যাচ করা যায় (?|abc)\(?|def)\(?|ghi)

একইভাবে, সমস্যা 12 - Q অক্ষরটি এড়িয়ে চলুন সমাধান করা যেতে পারে

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

%প্রথমটি \সক্রিয় করা থেকে বিরত রাখার জন্য নো-স্লিপ কমান্ডটি কোথায় ।

স্লিপের একটি দৈর্ঘ্যের জোড়ও রয়েছে (?_(<group num>) <regex> ), যা কেবলমাত্র তার ম্যাচের দৈর্ঘ্য প্রদত্ত গোষ্ঠীর সংখ্যার সমান দৈর্ঘ্য হলে ভিতরেই রেজেক্সের সাথে মেলে।

উদাহরণস্বরূপ, সমস্যা 13 - ডায়মন্ড খনির মাধ্যমে সহজেই সমাধান করা যেতে পারে

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

যা প্রথমে হীরার উপরের বাম দিকের সাথে মিলিত হওয়ার চেষ্টা করে, তারপরে দৃ as়ভাবে দাবি করে যে অন্য তিনটি দিক একই দৈর্ঘ্য।

( 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}

যা প্রথম দিকের সাথে দু'বার মিলছে।

অন্যান্য সমস্যাগুলির অনেকগুলি স্লিপিং, স্টেশনারি গ্রুপ এবং দৈর্ঘ্যের দৃ as়তা ব্যবহার করে সমাধান করা যেতে পারে:

সমস্যা 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 এবং এর মধ্যে বিকল্প #এবং _তারপরে স্লিপ করে পরবর্তী সারিগুলি মেলাতে হবে make শেষ পর্যন্ত, $aঅ্যাঙ্করটি দাবাবোর্ডের নীচে ডানদিকে থাকা উচিত।

এরপরে আমরা বাম দিকে ঘুরছি এবং কলামগুলির জন্য পুনরাবৃত্তি করব, তা নিশ্চিত করে আমরা $Aশেষে ম্যাচ করব ।

সমস্যা 2 - দাবাবোর্ড যাচাই করা:

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

পূর্ববর্তী সমস্যার মতো, আমরা পরীক্ষা করে নিই যে প্রতিটি সারিটি সঠিক, তারপরে বামদিকে ঘোরান এবং কলামগুলির জন্য একই করুন। শুধুমাত্র পুরো বোর্ডটি ম্যাচ হয়েছে কিনা তা নিশ্চিত করতে অ্যাঙ্করগুলি ব্যবহার করা হয়।

সমস্যা 9 - অনুভূমিক এবং উল্লম্ব সারিবদ্ধকরণ:

>?`#,*`#

আমরা applyচ্ছিক প্রয়োগ করব? থেকে কোয়ান্টিফায়ার >ঘোরান কমান্ড যাতে আমরা পারেন ম্যাচ দক্ষিণমুখে বা নিম্নগামী। আমরা oওভারল্যাপিং মোডের সাহায্যে উদাহরণে সমস্ত 5 টি পাই, তবে এটি 4 ছাড়াই #.,##এবং #.,#একই অবস্থান থেকে শুরু করে।

সমস্যা 10 - কলিনারি পয়েন্ট

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

এর #পরে কিছু অনুভূমিক অক্ষর এবং কিছু উল্লম্ব চরগুলি মিলিয়ে নিন, তারপরে দ্বিতীয় #অবধি পুনরাবৃত্তি করুন এবং তৃতীয় হওয়া পর্যন্ত পুনরাবৃত্তি করুন #

সমস্যা 5 - বর্গ ইনপুট সনাক্তকরণ:

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

উপরের বাম কোণটি অ্যাঙ্কর করুন এবং নীচের ডান কোণটি নোঙ্গর করার আগে শীর্ষ প্রান্তটি ডান প্রান্তের সমান দৈর্ঘ্য হিসাবে পরীক্ষা করুন। যদি ইনপুটটি এটি পাস করে, তবে আমরা পুরো ইনপুটটির সাথে মেলে পিছনে চলে যাই।

সমস্যা 8 - মাইনক্রাফ্ট বুকের স্থাপনা:

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

pপ্রতিটি ম্যাচের অবস্থানগুলি পেতে পতাকা নিয়ে চালান । $^অ্যাঙ্কর যা মেলে যদি পরবর্তী পদক্ষেপটি ম্যাচ পয়েন্টারটিকে সীমা ছাড়িয়ে দেয়।

প্রথমে আমরা একটির সাথে মেলে ., তারপরে পরীক্ষা করুন যে আমরা তিনটি ./ সীমানা দ্বারা বেষ্টিত আছি , তারপরে নিশ্চিত করুন যে চতুর্থ পার্শ্ববর্তী বর্গক্ষেত্রটিও একটি ./ সীমানা বা একটি একক বুক ( তার আশেপাশের স্কোয়ারগুলি পরীক্ষা করে )।

সমস্যা 11 - প্রিলিড সিনট্যাক্স যাচাই করুন :

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

কয়েকটি চেষ্টা করেছিলাম, তবে আমি মনে করি এটি সঠিক correct এখানে আমরা পুনরাবৃত্তি ব্যবহার করি, যার পিসিআরই এর মত একই সিনট্যাক্স রয়েছে।

এই পদ্ধতির জন্য ইনপুটটি আয়তক্ষেত্রাকার হওয়া দরকার, তবে একবার আমি অ-আয়তক্ষেত্রাকার মিল পেয়ে গেলে অনুমানের প্রয়োজন হবে না।

আরও পুনরাবৃত্তি নিয়ে গল্ফযুক্ত এখানে একই পন্থা:

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

সমস্যা 16 - প্রান্তগুলি চারপাশে মোড়ানো:

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

(দ্রষ্টব্য: মোড়ানো এখনও অনলাইন অনুবাদকের কাছে ধাক্কা দেয়নি)

এটি মোড়ানোর পতাকাটি প্রয়োজন w। প্রযুক্তিগতভাবে %ন-স্লিপের প্রাথমিক নয়, তবে ম্যাচটি এক বর্গ উচ্চতর থেকে শুরু হিসাবে গণনা করা হবে।

প্রাক্তন সমস্যা 1 - গাঁটছড়া সমাধানকারী:

S(^+`.)*^+E

আড্ডায় বিএমএকের মন্তব্য থেকে সমস্যা । ব্যবহার করুন rকোন পুনরাবৃত্তি মোডের জন্য পতাকা যাতে ম্যাচ পয়েন্টার আগে পিছে যাচ্ছে আটকে যান না।

সমস্যা EX 2 - মুখের স্বীকৃতি :

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

মনে রাখবেন যে আমি কেবল মুখগুলি মেলে, কোনও ক্লিয়ারিং করছি না। নোট করুন যে প্রশ্নটিতে ইউরো চিহ্ন রয়েছে, যা কাজ করার জন্য কিছু মুদ্রণযোগ্য এএসসিআইআই দ্বারা প্রতিস্থাপন করা প্রয়োজন।


সেই হ্যাশ প্যাটার্নটি একটি কনওয়ে গ্লাইডার
হিমডল

17

পিএমএ / শামুক (সি ++)

আমি গ্রিডের ঘোরাঘুরি এবং কমান্ড কার্যকর করে শামুক হিসাবে ভাষাটি কল্পনা করি। শামুকগুলি প্রতিটি স্কোয়ারের উপর চিটচিটে একটি ট্রেইল ফেলে যার দিকে তারা চলে যায়, যার ফলে ডিফল্টরূপে বর্গটি পরবর্তীতে তুলনাহীন হয়ে যায়। কমান্ডের তালিকার সমাপ্তি শেষ হলে কোনও মিল সফল হয় is

এখন পর্যাপ্ত অপারেটর রয়েছে যে তাদের ট্র্যাক রাখতে আমাদের একটি অগ্রাধিকার তালিকার প্রয়োজন। ক্রিয়াকলাপগুলি নিম্নলিখিত ক্রমে সমাধান করা হয়েছে:

  1. গ্রুপগুলির ভিতরে ( ) [ ]
  2. বিকল্প চরিত্রের সাথে বিভক্ত করুন |
  3. `একটি দল হিসাবে বামে সবকিছু মূল্যায়ন করুন
  4. কোয়ান্টিফায়ার [m],[n]এবংn
  5. গবেষকেরা = !
  6. শ্রেণীপরংপরা

দোভাষীটি সি ++ তে লেখা আছে। অভ্যাসগত উত্স কোডটি এখানে পাওয়া যাবে

সমস্যা 4: শব্দ অনুসন্ধান

কার্যক্রম

z\G\O\L\F

শব্দটি পাওয়া গেছে কিনা এর জন্য সত্য বা মিথ্যা মান পেতে যথেষ্ট। z(১৫ টি পরম বা আপেক্ষিক দিকনির্দেশক কমান্ডগুলির মধ্যে একটি) কোনও অষ্টলাইনীয় দিকের সাথে মেলে। একাধিক পরপর দিকনির্দেশ কমান্ডগুলি একসাথে ORed হয়। উদাহরণস্বরূপ ruldyপ্রায় সমান হবে z, কারণ ডান, উপরে, বাম, নীচে এবং যে কোনও তির্যক দিকের নির্দেশ রয়েছে the তবে, দিকনির্দেশগুলি একটি ভিন্ন ক্রমে পরীক্ষা করা হবে। প্রথম চরিত্রের সাথে মেলে এমন দিকনির্দেশ নির্বিশেষে সর্বদা শামুকের শুরু হয়। \<character> একক আক্ষরিক চরিত্রের সাথে মেলে।

ডিফল্ট কৌশল হ'ল বাম-ন্যায়সঙ্গত ইনপুটটির বাউন্ডিং বাক্সের প্রতিটি স্কোয়ারে প্যাটার্নটি চেষ্টা করা এবং মিলগুলির সংখ্যা আউটপুট। যদি বুলিয়ান মান 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: মাইনক্রাফ্ট চেস্টস

প্রোগ্রামটি বৈধ বুকে স্থাপনের সংখ্যা মুদ্রণ করে। এটি হ'ল আমাকে প্রথম গল্ফ করতে হয়েছিল এবং আমার বাইট গণনাটি (17) কয়েকবার হ্রাস করেছে।

\.!(o\C)2o(!\Cw)3
  • \. ম্যাচের শুরুর মুহূর্তে একটি বিন্দু অক্ষরে মেলে matches
  • !(o\C)2!((o\C)2)মাপদণ্ডের সমান হিসাবে দাবী তুলনায় উচ্চতর অগ্রাধিকার। <atom> <number>মানে <atom>ঠিক <number>সময় পুনরাবৃত্তি । oযে কোনও অরথোগোনাল দিকে শামুক ঘুরিয়ে দেয়। !একটি নেতিবাচক দৃser়তা। সুতরাং এই অংশটি সংলগ্ন ডাবল বুকের অনুপস্থিতি পরীক্ষা করে।
  • o কিছু অরথোগোনাল দিক ঘুরিয়ে দেয়।
    • (!\Cw)3জোর দেয় যে Cশামুকের সামনে আর নেই , এবং পরে ঘড়ির কাঁটার দিকে, 3 বার পরিণত হয় turns

সমস্যা 2: দাবাবোর্ড যাচাই করা

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

&বিকল্প হিসাবে প্রোগ্রামের আউটপুট সেট করে 1ম্যাচ সব অবস্থানের সময়ে সফল, এবং যদি 0অন্যথায়। ^cএকটি এমন চরিত্রের সাথে মেলে যা রেগেক্সের সাথে cসমান নয় [^c]। সামগ্রিকভাবে, প্রোগ্রামটির অর্থ হ'ল: 1 টি মুদ্রণ করুন যদি ইনপুটটির সীমানা আয়তক্ষেত্রের প্রতিটি অবস্থানে থাকে তবে এমন একটি রয়েছে #যা একটি চরিত্রের সাথে অরথগনীয়ভাবে সংলগ্ন নয় _, _যা একটি চরিত্রের সাথে অরথোগোনালি সংলগ্ন নয় না #; অন্যথায় 0।


স্লাইম ট্রেইল আইডিয়াটি
বগল

এটি বগল সমস্যার একটি দুর্দান্ত সমাধান। আমি আমার পদ্ধতির সাথে এটি সমাধান করতে পারি না।
লজিক নাইট

14

রি 2 ডি ক্লাস, পাইথন 2

আপডেট: যুক্ত হয়েছে "9. প্রান্তিককরণ" সমস্যা।

আমার পদ্ধতিটি পাইথন রি মডিউলটি অনুসন্ধান এবং মিল করতে করতে ব্যবহার করা। রি 2 ডি ক্লাস প্রক্রিয়াকরণের জন্য পাঠ্য প্রস্তুত করে, পুনরায় ফাংশনগুলি সম্পাদন করে এবং ফলাফলকে আউটপুট হিসাবে বিন্যাস করে।

মনে রাখবেন যে এটি সম্পূর্ণ নতুন ভাষা নয় - এটি অতিরিক্ত 2 ডি মোডের জন্য যুক্ত পতাকাগুলির সাথে 2 টি মাত্রায় প্রমিত মানের নিয়মিত প্রকাশের ভাষা।

শ্রেণীর নিম্নলিখিত ব্যবহার রয়েছে:

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

উভয় নিদর্শন স্ট্যান্ডার্ড লিনিয়ার পাঠ্য আরই নিদর্শন। যদি একটি উল্লম্ব প্যাটার্ন সরবরাহ না করা হয় তবে শ্রেণিটি উল্লম্বভাবে মিলে যাওয়ার জন্য অনুভূমিক প্যাটার্নটি ব্যবহার করবে। পতাকাগুলি 2 ডি এক্সটেনশান সহ স্ট্যান্ডার্ড আর আর পতাকা।

পরীক্ষামূলক

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 নির্দেশাবলী মধ্যে একাধিক ওভারল্যাপিং ম্যাচ পারেন। অনুসন্ধানের পদ্ধতিটি মেলানো বাক্সগুলি অনুসন্ধানের জন্য অনুসন্ধানের পরে টেক্সটের মেলানো ব্লকগুলি বের করে racts বিপরীত দিকের ম্যাচগুলির জন্য অনুসন্ধান কীভাবে নেতিবাচক প্রস্থ এবং / অথবা উচ্চতা ব্যবহার করে তা নোট করুন। উল্লম্ব দিকের শব্দগুলির মধ্যে নতুন রেখার অক্ষর রয়েছে - এটি 2D অক্ষর ব্লকের ধারণার সাথে সামঞ্জস্যপূর্ণ।

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)

উভয় দিকে মিল খুঁজে পেতে আমরা এখানে দুটি অনুসন্ধান ব্যবহার করি। এটি একাধিক অরথোগোনাল ম্যাচগুলি সন্ধান করতে সক্ষম তবে এই পদ্ধতিটি তির্যক ম্যাচগুলিকে সমর্থন করে না।

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 নয়, কোনও আকারের হতে পারে সম্পাদনা: এটিকে আরও স্পষ্ট করার জন্য আমি অনুমিতিটি সম্পাদনা করেছি।
PhiNotPi

বুঝেছি. আমি উত্তরে একটি নোট করব যে রে 2 ডি এর এই সমস্যার একটি আংশিক সমাধান রয়েছে। এটি পরিবর্তনশীল আকারে স্কেল করতে পারে না। এটা কি ঠিক আছে?
লজিক নাইট

হ্যাঁ এটাই ঠিক আছে.
PhiNotPi

14

গ্রিম , হাস্কেল

ভূমিকা

গ্রিম বুলিয়ান ব্যাকরণ ভিত্তিক । মূল ধারণাটি ছোট উপাদানগুলি থেকে আয়তক্ষেত্রাকার নিদর্শনগুলি তৈরি করা এবং সেগুলি ইনপুট ম্যাট্রিক্সে পাওয়া যায় কিনা তা পরীক্ষা করা। এখনও অবধি গ্রিম কেবল আয়তক্ষেত্রাকার ম্যাচগুলিকে সমর্থন করে এবং কমপক্ষে ১১ টি সমস্যা কমবেশি মার্জিতভাবে সমাধান করে।

সম্পাদনা: ক্রসগুলি সংশোধন করা হয়েছে (বাগটি চিহ্নিত করার জন্য ডিএলসকে ধন্যবাদ), এবং হীরা খনির যোগ করা হয়েছে।

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: প্রিন্ট ডিবাগ তথ্য।

ব্যাকরণের মধ্যে বিকল্পগুলি নির্দিষ্ট করে দেওয়া যেতে পারে, কোনও লাইনের আগে সেগুলি tingোকানো এবং একটি কমা যুক্ত করে ,(উদাহরণগুলির জন্য নীচে দেখুন)।

সিনট্যাক্স এবং শব্দার্থবিজ্ঞান

গ্রিম ব্যাকরণ একটি বা একাধিক সংজ্ঞা নিয়ে থাকে , প্রতিটি পৃথক লাইনে। তাদের প্রত্যেকটি একটি নন- টার্মিনালের মান সংজ্ঞায়িত করে এবং তাদের একটির অবশ্যই বেনামে শীর্ষস্তরের ননটার্মিনাল সংজ্ঞায়িত করতে হবে । সংজ্ঞাটির বাক্য গঠনটি হয় হয় N=Eবা Eযেখানে Nবড় হাতের অক্ষর থাকে এবং Eএটি একটি অভিব্যক্তি

এক্সপ্রেশন নিম্নলিখিত হিসাবে নির্মিত হয়।

  • যে কোনও অক্ষর সেই অক্ষর যুক্ত \কোনও 1x1আয়তক্ষেত্রের সাথে মেলে ।
  • . কোনও একক চরিত্রের সাথে মেলে।
  • $1x1অক্ষর ম্যাট্রিক্সের বাইরে একটি আয়তক্ষেত্রের সাথে মেলে ।
  • _ শূন্য প্রস্থ বা উচ্চতার যে কোনও আয়তক্ষেত্রের সাথে মেলে।
  • পূর্বনির্ধারিত অক্ষর গোষ্ঠীগুলি dহ'ল আইগিট, uপপারকেস, lওওয়ারকেস, aলিফাব্যাটিক, আলফা numeric এবং symbol।
  • নতুন চরিত্রের ক্লাসগুলি সিনট্যাক্স দ্বারা সংজ্ঞায়িত করা যায় [a-prt-w,d-gu]। বামে থাকা অক্ষরগুলি অন্তর্ভুক্ত করা হয়েছে এবং ডানদিকে থাকা অক্ষরগুলি অন্তর্ভুক্ত রয়েছে, সুতরাং এটি অক্ষরের সাথে ঠিক মেলে abchijklmnoprtvw। বাম দিকটি খালি থাকলে, এটি সমস্ত অক্ষর ধারণ করে নেওয়া হয়। ডান দিকটি খালি থাকলে কমা বাদ দেওয়া যেতে পারে। চরিত্রগুলি [],-\সঙ্গে পালাতে হবে \
  • একটি অপ্রকাশিত বড় হাতের অক্ষর একটি অযৌক্তিক এবং এটি নির্ধারিত অভিব্যক্তিটির সাথে মেলে।
  • যদি Pএবং হ'ল Qএক্সপ্রেশন হয় তবে PQকেবল তাদের অনুভূমিক সংক্ষিপ্তকরণ এবং এটি শীর্ষে রয়েছে P/Qতাদের উল্লম্ব সমষ্টি P
  • P+এক বা একাধিক Ps অনুভূমিকভাবে প্রান্তিক হয়, এবং 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...

এটি একটি অত্যন্ত ভয়ঙ্কর, যেহেতু গ্রিমের ঘূর্ণন বা প্রতিবিম্বের জন্য কোনও অপারেশন নেই। এছাড়া অত্যন্ত ধীর যেহেতু কয়লার কালি জানে না যে ম্যাচ শুধুমাত্র আকারের হতে পারে, 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একটি nonempty আয়তক্ষেত্র সাথে মেলে .s, এবং Fএকটি nonempty আয়তক্ষেত্র #গুলি। সংযোগের বাম দিকটি টাইপের আয়তক্ষেত্রগুলির সাথে মেলে

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

যেখানে আমাদের 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সে।


@ ডিএলকস স্থির, বাগটি খুঁজে পাওয়ার জন্য ধন্যবাদ!
জাগারব

চান \#(.*|./*)\#কাজ করে?
seequ

প্রান্তিককরণের জন্য @ সিগ? দুর্ভাগ্যক্রমে না, কারণ এটি " #বামদিকে একটি, তারপরে কোনও সারি বা কোনও কলাম, তারপরে #ডানদিকে" হিসাবে বিভক্ত হবে । আমার উল্লেখ করতে হবে যে #স্ল্যাশগুলি ব্যবহার করে কলামটি উল্লম্বভাবে সংযুক্ত করা হয়েছে /
জাগারব

10

TMARL

টেমপ্লেট মিল এবং স্বীকৃতি ভাষা

বিবরণ

আমার দোভাষী 24 কে চর নিয়েছেন ( কোড স্নিপেটগুলি অক্ষর গ্রহণ করে? ), সুতরাং সম্পূর্ণ বিবরণটি এখানে পাওয়া যাবে

সেরা অংশ: দোভাষীটি জাভাস্ক্রিপ্টে রয়েছে, যার অর্থ আপনি এখুনি চেষ্টা করে দেখতে পারেন!

এবং সমস্যার জন্য:

# 1 - দাবাবোর্ড সন্ধান করা

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

&অনুসন্ধান সংযোজন। G2 শেষে একটি ম্যাচ উপাদান তৃতীয় উপাদান পায়, আসল ম্যাচ। প্রথম 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 - চিঠিটি এড়িয়ে চলুন প্রশ্ন

$[^Qq]
~4*4S1G2P

এস 1 কারণ শুধুমাত্র 1 ম্যাচ প্রয়োজন।

আমি আরও শক্ত কিছু পরে করব।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.