এটি কি বৈধ দাবার পদক্ষেপ?


15

বিকল্প নাম: ChessMoveQ

৩২ টি পর্যন্ত উপাদানগুলির একটি তালিকা দেওয়া হয়েছে, যার মধ্যে প্রতিটি 4 টি উপাদান রয়েছে এবং 4 টি উপাদান সহ একটি দ্বিতীয় তালিকা, দ্বিতীয় ইনপুটটিতে বিশদ পদক্ষেপটি বৈধ দাবা পদক্ষেপ কিনা তা নির্ধারণ করে।

প্রথম তালিকাটি বোর্ডের সমস্ত 32 টুকরোটির অবস্থান নির্দেশ করে। প্রতিটি উপাদান কাঠামো অনুসরণ করবে <colour>, <piece-name>, <x-coord>, <y-coord>, যেমন ["W", "K", 5, 1], যা সূচিত করে যে সাদা রাজা চালু আছে 5, 1( e1একটি সাধারণ দাবা বোর্ডে)। প্রথম ইনপুটটির সমস্ত উপাদান অনন্য হবে। <x-coord>এবং <y-coord>সর্বদা 1 থেকে 8 এর মধ্যে থাকবে One একটি উদাহরণ হ'ল:

[["B", "K", 3, 8], ["B", "Q", 1, 5], ["B", "N", 4, 7], ["B", "N", 7, 8],
 ["B", "B", 2, 4], ["B", "R", 4, 8], ["B", "R", 8, 8], ["B", "P", 1, 7],
 ["B", "P", 2, 7], ["B", "P", 3, 6], ["B", "P", 5, 6], ["B", "P", 6, 7],
 ["B", "P", 7, 7], ["B", "P", 8, 7], ["W", "K", 5, 1], ["W", "Q", 6, 3],
 ["W", "N", 3, 3], ["W", "B", 5, 2], ["W", "B", 6, 4], ["W", "R", 1, 1],
 ["W", "R", 8, 1], ["W", "P", 1, 3], ["W", "P", 2, 2], ["W", "P", 3, 2],
 ["W", "P", 4, 4], ["W", "P", 6, 2], ["W", "P", 7, 2], ["W", "P", 8, 3]]

যা বোর্ডের প্রতিনিধিত্ব করবে:

উদাহরণ দাবাবোর্ড

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

উপরের উদাহরণের জন্য, একটি বৈধ পদক্ষেপ হতে পারে ["W", "B", 4, 3](বিশপ এক বর্গাকার এবং বাম দিকে এগিয়ে যায়), এবং একটি অবৈধ পদক্ষেপ ["B", "R", 4, 1]যেমন নরকটি নাইটের মধ্য দিয়ে যেতে হয়েছিল, এবং চৌকোতে পৌঁছানোর জন্য পদ্মরোগটি হতে পারে। পদক্ষেপ সময়ে একাধিক টুকরা পড়ুন পারে হিসাবে, আপনি পরীক্ষা হবে কিনা কোন নিদিষ্ট টুকরা সরানো, তাদের না শুধু একটা করে তুলতে পারে। উদাহরণস্বরূপ, প্রথম উদাহরণটি কেবলমাত্র একটি বিশপের জন্য বৈধ, তবে এটি এখনও একটি বৈধ পদক্ষেপ। যাইহোক, কালো ছোকরা উভয়ই দ্বিতীয় পদক্ষেপটি সম্পাদন করতে পারে না, তাই এটি অবৈধ।

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

  • যে কোনও টুকরা : কোনও টুকরো ইতিমধ্যে দখলকৃত স্কোয়ারের উপরে বা বোর্ডের বাইরে চলে যেতে পারে না, যদি না square বর্গটি অন্য রঙের কোনও অংশে দখল করে। উদাহরণস্বরূপ, একটি সাদা টুকরা একটি কালো টুকরা দ্বারা দখলকৃত স্কোয়ারের দিকে চলে যেতে পারে তবে কোনও সাদা টুকরা নয়। অতিরিক্তভাবে, নাইটস ব্যতীত কোনও টুকরো স্কোয়ারগুলিতে যেতে পারে না যা সরাসরি অন্য টুকরা দ্বারা বাধা হয়ে থাকে।
    • টুকরা বি দিয়ে বর্গাকার সিতে সরানো একটি টুকরো A দ্বারা "সরাসরি বাধা" থাকে যদি A সরাসরি হয়, বি এবং সি এর মধ্যে একটি সোজা (অরথোগোনাল বা তির্যক) লাইনে থাকে ।
  • যে কোনও টুকরো : রাজার অবস্থানও কোনও টুকরোটির পদক্ষেপের বৈধতাকে প্রভাবিত করতে পারে। যদি এই দুটি শর্তের কোনও একটি পূরণ করা হয় তবে পদক্ষেপটি অবৈধ:
    • বিপদে পড়া রাজার মতো একই অংশে টুকরো টুকরো করে চেক করতে রাজাটিকে উন্মোচিত করছেন। এটি কেবল তখনই প্রযোজ্য যখন কোনও বিরোধী টুকরোটি চলাফেরা করে, বরং বিরোধী টুকরোটি বাদশাহকে তদন্তের জন্য রাখে।
    • চেক রাজা, যে ক্ষেত্রে এটা দিয়া গেছে চেক আউট সরাতে। অতএব, যদি রাজা তদন্তে থাকে এবং সরানো যদি আদেশ দেয় যে অন্য টুকরা সরে যায় তবে এটি একটি অবৈধ পদক্ষেপ, যদি না অন্য টুকরা চেক প্রতিরোধ না করে। একটি টুকরো দুটি মাধ্যমে চেক প্রতিরোধ করতে পারে: হয় এটি টুকরা সম্পাদনকারী চেক নেয়, বা এটি টুকরা সম্পাদনকারী চেক এবং রাজার মধ্যে পথকে বাধা দেয়।
    • "চেক" এমন একটি পরিস্থিতি যেখানে রাজার প্রতিপক্ষ আইনীভাবে সেই রাজার উপরে কোনও টুকরো স্থানান্তর করতে পারে (যদি তাদের সরানোর পালা হয়)। এই নিয়মটি পুনরাবৃত্তির সাথে প্রযোজ্য নয়, অর্থাত কোনও রাজা যদি সেই রাজার দিকে প্রতিপক্ষের পদক্ষেপটি তাদের নিজস্ব রাজাকে ছেড়ে দেয় তবে তা তদন্তের মধ্যে রয়েছে।
  • পাউন্ডস : একটি গিরিটি এক বর্গাকারকে একটি অনিয়মিত স্কোয়ারের দিকে এগিয়ে যেতে পারে (অর্থাত্ সাদা যদি নীচে দিকে, কালো হয়) square এছাড়াও তিনটি বিশেষ পরিস্থিতি রয়েছে:
    • যদি পদ্মটি এখনও সরানো না হয় (আপনি ওয়াই-স্থানাঙ্ক ব্যবহার করে এটি নির্ধারণ করতে পারেন; হোয়াইট কোয়েনডেটগুলি যদি 2 হয় তবে হোয়াইট প্যাঁকাগুলি স্থানান্তরিত হয় নি, যদি তাদের ওয়াই-কো-অর্ডিনেটটি 7 হয় তবে কালো প্যাঁকাগুলি সরেনি) দুটি স্কোয়ারকে অব্যক্ত স্কোয়ারের দিকে এগিয়ে যাওয়ার অনুমতি দেওয়া হয়।
    • শৈশবকালে সামনের দিকে যদি কোনও প্রতিপক্ষের অংশটি তির্যকভাবে থাকে (যেমন শ্বেতকণ্ঠে শুকনোভাবে উত্তর-পশ্চিম বা উত্তর-পূর্ব দিকে বর্গাকারে, অথবা এটি দক্ষিণ-পশ্চিম বা দক্ষিণ-পূর্বে যদি কালো হয়), ভাঁড়াকে প্রশ্নযুক্ত দখলকৃত স্কোয়ারের দিকে যাওয়ার অনুমতি দেওয়া হয়েছে।
    • যদি কোনও মহিরা চেসের সাধারণ নিয়মে চূড়ান্ত ওয়াই-কোঅর্ডিনেটে (হোয়াইটের জন্য 8, বা কালো রঙের 1 টি) দিকে চলে যায় তবে এটিকে একই রঙের রানী, নড়বড়, নাইট বা বিশপ হিসাবে প্রচার করতে হবে। এই প্রশ্নের উদ্দেশ্যগুলির জন্য, পদোন্নতির পছন্দটি পদক্ষেপটি বৈধ কিনা এবং (এবং ইনপুট ফর্ম্যাটে প্রকাশ করা যায় না) সম্পর্কিত অপ্রাসঙ্গিক, তবে পদোন্নতির পদক্ষেপের ফলে অনুমোদনের ফলে অবশ্যই অনুমতি দেওয়া উচিত allowed
  • বিশপস : বিশপগুলি যে কোনও অবিচ্ছিন্ন অ-বাধা ইন্টারকার্ডিনাল (অর্থাত্ ডায়াগোনাল) পথে বরাবর 1 থেকে 8 স্কোয়ারের মধ্যে যেতে পারে।
  • নাইটস : নাইটগুলি কোনওLআকারেচলতেপারে, নিম্নলিখিতগুলির (সমতুল্য) পদক্ষেপগুলির মধ্যে দুটি থাকে:
    • যে কোনও মূল দিকের একক বর্গক্ষেত্র, তার পরে 90/270 ° টার্ন, তারপরে 2 স্কোয়ারের চূড়ান্ত অগ্রসর হয়।
    • কোনও কার্ডিনাল দিকের 2 স্কোয়ার, তার পরে 90/270 ° টার্ন এবং তারপরে একটি একক বর্গক্ষেত্রের চূড়ান্ত স্থানান্তর।
    (মনে রাখবেন যে কোনও নাইটের পথটি হস্তক্ষেপকারী টুকরোয় দ্বারা অবরুদ্ধ করা যাবে না, যদিও এর চূড়ান্ত চৌকোটি অবশ্যই আইনী হতে হবে be)
  • রুকস : যে কোনও অবিচ্ছিন্ন অ-বাধা কার্ডিনাল পথ ধরে রুকগুলি 1 থেকে 8 স্কোয়ারের মধ্যে যেতে পারে।
  • কুইনস : কুইন্সগুলি কোনও অবিচ্ছিন্ন কার্ডিনাল বা আন্তঃকার্ডিনাল (অর্থাত্ ডায়াগোনাল) অ-বাধা পথ ধরে 1 থেকে 8 স্কোয়ারের মধ্যে যেতে পারে।
  • কিং : কিংরা রানির মতো চলাফেরা করে, কেবল সেগুলি প্রতি চলন্ত মাত্র একটি বর্গক্ষেত্রের মধ্যে সীমাবদ্ধ (যেমন কোনও রাজা কেবল কার্ডিনালি বা ত্রিভুজ সংলগ্ন স্কোয়ারগুলিতে যেতে পারেন)। অনুস্মারক হিসাবে, আপনি এমন কোনও পদক্ষেপ করতে পারবেন না যা আপনার রাজাকে পরীক্ষা করে রাখবে; সুতরাং আপনি আপনার রাজাকেও পরীক্ষা করতে পারবেন না।

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

কোনও পদক্ষেপের বৈধতা নির্দেশ করতে আপনি যে কোনও দুটি পৃথক ফলাফল আউটপুট করতে পারেন এবং আপনি যে পদ্ধতিতে চান তাতে ইনপুট নিতে পারেন। আপনি যদি পছন্দ করেন তবে পজিশনের জন্য 1-ইনডেক্সিংয়ের পরিবর্তে 0-ইনডেক্সিংও চয়ন করতে পারেন। এটি একটি , তাই সংক্ষিপ্ততম কোড জয়!

পরীক্ষার মামলা

Board
Move => Output (Reason)

[["B", "K", 3, 8], ["B", "Q", 1, 5], ["B", "N", 4, 7], ["B", "N", 7, 8], ["B", "B", 2, 4], ["B", "R", 4, 8], ["B", "R", 8, 8], ["B", "P", 1, 7], ["B", "P", 2, 7], ["B", "P", 3, 6], ["B", "P", 5, 6], ["B", "P", 6, 7], ["B", "P", 7, 7], ["B", "P", 8, 7], ["W", "K", 5, 1], ["W", "Q", 6, 3], ["W", "N", 3, 3], ["W", "B", 5, 2], ["W", "B", 6, 4], ["W", "R", 1, 1], ["W", "R", 8, 1], ["W", "P", 1, 3], ["W", "P", 2, 2], ["W", "P", 3, 2], ["W", "P", 4, 4], ["W", "P", 6, 2], ["W", "P", 7, 2], ["W", "P", 8, 3]]
["W", "R", 8, 2] => True (The rook on h1 can move forward one)

[['B', 'K', 6, 8], ['B', 'Q', 1, 7], ['B', 'N', 1, 3], ['B', 'N', 7, 1], ['B', 'B', 8, 8], ['B', 'B', 2, 5], ['B', 'R', 4, 3], ['B', 'R', 1, 5], ['B', 'P', 5, 5], ['B', 'P', 7, 2], ['B', 'P', 5, 7], ['B', 'P', 5, 6], ['B', 'P', 4, 4], ['W', 'K', 7, 3], ['W', 'Q', 3, 2], ['W', 'N', 4, 8], ['W', 'N', 7, 5], ['W', 'B', 1, 1], ['W', 'B', 8, 1], ['W', 'R', 1, 8], ['W', 'R', 3, 7], ['W', 'P', 8, 2], ['W', 'P', 6, 3], ['W', 'P', 4, 2], ['W', 'P', 1, 4], ['W', 'P', 8, 7]]
['W', 'N', 1, 5] => False (Neither knight to move to a5 from where they are)

[['B', 'K', 7, 3], ['B', 'Q', 2, 4], ['B', 'N', 5, 2], ['B', 'N', 1, 6], ['B', 'B', 7, 7], ['B', 'B', 1, 8], ['W', 'K', 7, 1], ['W', 'Q', 6, 1], ['W', 'N', 5, 6], ['W', 'N', 3, 3], ['W', 'B', 2, 2], ['W', 'B', 6, 5]]
['B', 'K', 8, 3] => False (The white bishop would put the king in check)

[['B', 'K', 7, 6], ['B', 'Q', 8, 3], ['B', 'N', 7, 7], ['B', 'N', 8, 7], ['B', 'B', 2, 2], ['B', 'B', 3, 8], ['B', 'R', 1, 1], ['B', 'R', 1, 6], ['B', 'P', 8, 5], ['B', 'P', 4, 3], ['B', 'P', 8, 6], ['W', 'K', 7, 8], ['W', 'Q', 7, 2], ['W', 'N', 5, 1], ['W', 'N', 4, 6], ['W', 'B', 1, 2], ['W', 'B', 2, 6], ['W', 'R', 4, 4], ['W', 'R', 3, 6], ['W', 'P', 5, 2], ['W', 'P', 6, 2]]
['B', 'N', 5, 8] => False (The white queen currently has the king in check, and this move doesn't prevent that)

[['B', 'K', 7, 6], ['B', 'Q', 8, 3], ['B', 'N', 7, 7], ['B', 'N', 8, 7], ['B', 'B', 2, 2], ['B', 'B', 3, 8], ['B', 'R', 1, 1], ['B', 'R', 1, 6], ['B', 'P', 8, 5], ['B', 'P', 4, 3], ['B', 'P', 8, 6], ['W', 'K', 7, 8], ['W', 'Q', 7, 2], ['W', 'N', 5, 1], ['W', 'N', 4, 6], ['W', 'B', 1, 2], ['W', 'B', 2, 6], ['W', 'R', 4, 4], ['W', 'R', 3, 6], ['W', 'P', 5, 2], ['W', 'P', 6, 2]]
['B', 'N', 7, 5] => True (The king is in check, and the knight blocks that)

[['B', 'K', 8, 3], ['B', 'Q', 6, 5], ['B', 'N', 7, 8], ['B', 'N', 3, 7], ['B', 'B', 4, 1], ['B', 'B', 1, 1], ['W', 'K', 7, 7], ['W', 'Q', 7, 1], ['W', 'N', 2, 2], ['W', 'N', 1, 3], ['W', 'B', 3, 5]]
['B', 'B', 2, 2] => True (takes the white knight)

[['B', 'K', 6, 1], ['B', 'Q', 6, 2], ['W', 'K', 8, 1]]
['B', 'Q', 7, 1] => True (Smallest checkmate possible, in terms of bounding box)

এই চ্যালেঞ্জটি স্যান্ডবক্সযুক্ত ছিল । এটি ডাউনভিটস পেয়েছে, কোনও ব্যাখ্যা ছাড়াই, তাই আমি যাইহোক এটি পোস্ট করার সিদ্ধান্ত নিয়েছি


"একই পাশের একটি টুকরা চলে যায়, রাজাটিকে পরীক্ষা করতে দেখায়" " - এই শব্দের এখন উপযুক্ত মনে হচ্ছে না আপনি যে শিরোনামটি নীচে চলেছেন তা সরানো হয়েছে। আমি এটিকে এমন কিছুতে পরিবর্তন করব যেমন "এই টুকরোটি সরানো
রাজাটিকে

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

2
কেউ এটাকে কমিয়ে দেয়নি ...?
ফ্লিপট্যাক

1
আমরা কি ইনপুট হিসাবে টুকরাগুলির 2 ডি অ্যারে পেতে পারি?
ovs

1
@ ওভস হ্যাঁ, এটি গ্রহণযোগ্য বলে মনে হচ্ছে
18

উত্তর:


3

পাইথন 2 ( পাইথন-দাবা সহ ),  141 138 134 133  132 বাইট

সত্যিই আকর্ষণীয় কোডটি না করেই - তবে সম্ভবত এটি গল্ফিং ভাষার সাথে প্রতিযোগিতা করতে পারে বা (আমি এটি উল্লেখ করার সাহস করব) ম্যাথমেটিকাকে?

নোট: পাইথন-দাবা একটি হল Pypi প্যাকেজ 2.7.9+ পাইথন এটি ইনস্টল সঙ্গে
python -m pip install python-chess)

import chess
a,p,n=input()
S=chess.Board(a+' - - 0 1')
for m in S.legal_moves:1/(m.to_square!=n)**(`p`in`S.piece_at(m.from_square)`)

একটি পূর্ণ-প্রোগ্রাম তিনটি আইটেম গ্রহণ করে:

  1. একটি FEN রেকর্ডের শুরু - প্রথম দুটি ক্ষেত্র সমন্বিত স্ট্রিং। এটি বোর্ডের অবস্থা এবং কোন রঙটি চলমান তা নির্ধারণ করতে হয় (যেহেতু এটি ওপি-র ইনপুট সম্পর্কিত তথ্য, যেখানে ছয়টি ক্ষেত্রের মধ্যে তিনটি ক্ষেত্রটি ওপি দ্বারা "স্থির" থাকে তাই ইনপুটটির অংশ হওয়া উচিত নয়)
  2. টুকরা নামটি স্থানান্তরিত করার চেষ্টা করছে (যেমনটি ওপিতে দেওয়া আছে - এর মধ্যে একটি PRNBQK)
  3. বর্গক্ষেত্র নামে টুকরা সরাতে যেখানে প্রয়াস করছে যা a1হয় 0, b1হয় 1, ... a2হয় 8, ..., h8হয় 63,

প্রোগ্রামটি তার প্রস্থান-কোডের মাধ্যমে বৈধ ইনপুট প্রদান করে:

  • 1 যদি পদক্ষেপটি বৈধ হয় (প্রোগ্রামটি একটি ত্রুটি উত্থাপন করেছিল - শূন্য দ্বারা বিভাজনের কারণে);
  • 0 এটি এটি নয় (প্রোগ্রামটি স্বাভাবিকভাবে উপস্থিত হয়)

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

লক্ষ্য করুন পাইথন ক্ষমতায় অপারেটর তোলে 1**1 == 1**0 == 0**0 == 1কিন্তু 0**1 == 0
... অত: পর 1/0**1শূন্য ত্রুটি দ্বারা একটি বিভাগ উত্থাপন যখন 1/1**1, 1/1**0এবং 1/0**0সব সফল
(... এবং পাইথন যে Falseএবং Trueসমার্থক 0এবং 1যথাক্রমে)।


2
এটি পুরোপুরি বৈধ উত্তর, তবে এটি কিছুটা প্রতারণার মতো অনুভূত, কেবল একটি অন্তর্নির্মিত গণিতের উত্তরের মতো।
কেয়ার্ড কোইনরিঙ্গিংহিং

হ্যাঁ, অতএব মন্তব্যটি আমি শীর্ষে রেখেছি "সত্যিকারের আকর্ষণীয় কোডটি না করেই ..." সম্ভবত যখন আমার আরও কিছু সময় থাকবে তখন আমি একটি জেলি করব (যা এই মডিউলটি আমদানি করতে পারে না :))
জনাথন অ্যালান

1
... মনে আছে এটি এখনও কিছু প্রচেষ্টা গ্রহণ।
জোনাথন অ্যালান

পুনরায় সাজান str(S.piece_at(m.from_square))==p forকরার p==str(S.piece_at(m.from_square))forযে এক বাইট সংরক্ষণ উচিত।
জাকারি

হ্যাঁ, হ্যাঁ - ধন্যবাদ @ জাকারি আমি কেবল সন্ধানের জন্যই ছিলাম যে আমি reprব্যাকটিকগুলি ব্যবহার করে strসংরক্ষণের পরিবর্তে পার্স করতে পারি কিনা ...
জোনাথন অ্যালান

3

রেজেক্স (পিসিআরই 2), 931 925 837 বাইট

এই সমাধান সমস্যার বিবৃতি থেকে প্রস্থান করে যে দুটি বোর্ডের রাজ্যগুলি একটি বোর্ডের স্থিতি এবং একটি পদক্ষেপের পরিবর্তে রেজিজেসে স্থানান্তরিত হয়। এই পদক্ষেপটি দুটি বোর্ডের রাজ্যের মধ্যে পার্থক্য থেকে অনুমান করা হয়। সুতরাং আমি এই টিআইও প্রোগ্রামটির কাজটি এই প্রশ্নের দ্বারা প্রদত্ত ফরম্যাটে পরীক্ষার কেসগুলি গ্রহণ করা, বোর্ডে বর্ণিত টুকরোটির সমস্ত দৃষ্টান্ত খুঁজে পেতে এবং প্রতিটিটির সাথে এটি গন্তব্য অবস্থানে নিয়ে যাওয়া এবং রেজেক্স মূল্যায়ন করার চেষ্টা করি সেই সম্ভাবনার সাথে, রেগেক্সের দ্বারা বৈধ হিসাবে কোনও রিপোর্ট করা হয়েছে কিনা তা সন্ধান করা। যদি এটি ঠিক না থাকে তবে আমাকে জানান; পজিশন + পদক্ষেপ হিসাবে একটি রেজেক্স কার্যকর করা সম্ভব, তবে এটি অনেক কম মার্জিত হবে এবং গুরুতর রিফ্যাক্টরিংয়ের প্রয়োজন হবে।

: বোর্ড 8 × 8 হওয়া ASCII যেখানে সাদা টুকরা বড় হাতের এবং ছোট হাতের অক্ষরে কালো হয় প্রতিনিধিত্ব করা হয় পি শস্যশূক, K এন ight, বি ishop, আর ওক্, প্রশ্ন ueen, কে ING। ব্ল্যাকের পাশ (অষ্টম র‌্যাঙ্ক) শীর্ষে এবং সাদা অংশের (প্রথম র‌্যাঙ্ক) নীচে রয়েছে। প্রতিটি র‌্যাঙ্কটি একটি নতুন লাইনের দ্বারা পৃথক করা হয় এবং খালি স্কোয়ারগুলি চিহ্নিত করা হয় -। দুটি বোর্ড পজিশন একটি অতিরিক্ত নিউলাইন দ্বারা পৃথক করা হয়েছে।

এই প্রকল্পের আসল লক্ষ্য কেবল একটি একক চাল নয় পুরো গেমগুলিকে বৈধতা দেওয়া। বর্তমান অগ্রগতির জন্য নীচে দেখুন।

()?(?>|((.|
(?=.)){2})((?=(\X{72})-))((?=(?(1)[-a-z]|[-A-Z])))((?5)(?(?=(.*
)
)[qnrb]|p))((?5)(?(?=(?8){8}
)[QNRB]|P)))(?>((.)(?=(?5)\11)|(?(m)$)((?(1)(-(?=(?9))(?=(?3){8}((?3){9})?P(?4))(?(-1)(?=(?8){4}
))|[a-z](?=(?9))(?=(?3){7}(?2)?P(?4)))|(p(?4)((?=(?3){8}((?3){9})?-(?7))(?(-1)(?=(?8){7}
))|(?=(?3){7}(?2)?[A-Z](?7)))))|(?<e>(?6).)?(?=(?i:(?|(?(e)|(B|Q))(?27)(?(e)(B|Q))|(?(e)|(R|Q))(?31)(?(e)(R|Q))|(?(e)|(N))(?34)(?(e)(N))|(?(e)|(K))(?35)?(?(e)(K))))(?(e)(?<=(?!(?6)).)(?4)|(?6).(?5)\19))(?(e)(?=(?5)\20)|(?!(?6)).(?4)))(?<m>)|(?(+1)$)(.))+
)+\k<m>
(?!\X{0,70}((?(1)p|k)(?=(?3){7}(?2)?(?(1)K|P))|(?i:(?<E>(?!(?6))K)?((?(E)|((?6)[BQ]))(()?((?(-1)-)(?3){7}(?(-2)(?2)))+)(?(E)(?-4))|(?(E)|((?6)[RQ]))(-*|((?(-1)-)(?3){8})+)(?(E)(?-3))|(?(E)|((?6)N))((?<=..)(?2){3}|(?=.)(?2){5}|(?2){8}(?2)?)(?(E)(?-2)))(?(E)|(?&E))|K((?3){7,9})?K)))

এটি অনলাইন চেষ্টা করুন!

বেশ-মুদ্রিত, এবং আংশিকভাবে শৃঙ্খলাবদ্ধ (নিখুঁত ব্যাকরিফগুলি আপেক্ষিক হিসাবে পরিবর্তিত হয়েছে, এবং ক্যাপচারিং গ্রুপগুলি নন-ক্যাপচারিং বা কিছু ক্ষেত্রে গতির জন্য পারমাণবিক রূপান্তরিত হয়েছে):

# Chess move validation regex (PCRE)
()?                 # decide whether to evaluate this as white's or black's move; \1 set = white, \1 unset (NPCG) = black
(?>|                # subroutines:
  ((.|\n(?=.)){2})                  # (?3) = for moving within the board, without wrapping to the next board, (?2) = (?3){2}
  ((?=                              # (?4) = assert that position of just-consumed piece is vacated on the next turn
    (\X{72})                        # (?5) = skip to the position of the just-consumed piece on the next turn
  -))
  ((?=(?(1)[-a-z]|[-A-Z])))         # (?6) = assert that the piece at the current position belongs to the current player's opponent or is empty
  ((?5)(?(?=(.*\n)\n)[qnrb]|p))     # (?7) = black pawn that might be promoted, (?8) = .*\n
  ((?5)(?(?=(?8){8}\n)[QNRB]|P))    # (?9) = white pawn that might be promoted
)
(?>
  (?>
    # Handle squares that don't change (empty->empty or pieces that doesn't move)
    (.)(?=(?5)\g{-1}) |
    # Handle a piece that moves (and optionally captures an enemy piece)
    (?(m)$)  # allow only one move to be made per turn
    (?>
      (?(1)
        (?:                                                         # white pawn
            -  (?=(?9))(?=(?3){8}((?3){9})?P(?4))(?(-1)(?=(?8){4}\n)) |   # move 1 or 2 spaces forward
          [a-z](?=(?9))(?=(?3){7}(?2)?     P(?4))                     )   # capture diagonally
      |
        (?:p(?4)(?:                                                 # black pawn
          (?=(?3){8}((?3){9})?  -  (?7))(?(-1)(?=(?8){7}\n)) |            # move 1 or 2 spaces forward
          (?=(?3){7}(?2)?     [A-Z](?7)) )                   )            # capture diagonally
      ) |
      # bishops, rooks, queens, knights, or kings
      (?<e>(?6).)?   # decide between scanning forward (<e> is unset) or backwards (<e> is captured)
      (?=
        (?i:
          (?|
            (?(e)|(B|Q)) (?&B)  (?(e)(B|Q)) | # bishops or queens
            (?(e)|(R|Q)) (?&R)  (?(e)(R|Q)) | # rooks or queens
            (?(e)|(N  )) (?&N)  (?(e)(N  )) | # knights
            (?(e)|(K  )) (?&K)? (?(e)(K  ))   # kings
          )
        )
        (?(e)(?<=(?!(?6)).)(?4)|(?6).(?5)\g{-2})   # verify that the piece moved, and optionally captured piece, are of the correct color
      )
      (?(e)(?=(?5)\g{-1})|(?!(?6)).(?4))   # verify that the piece moved is the same type and color at its destination in the next turn's board position
    )(?<m>) |
    (?(+1)$)(.)  # handle the destination/source square that a piece moved to/from (only allow matching one of these per turn)
  )+\n
)+
\k<m>         # assert that a move has taken place
\n
# don't allow moving into check  
(?!
  \X{0,70}
  (?:
    # pawns (capture diagonally)
    (?(1)p|k)(?=(?3){7}(?2)?(?(1)K|P)) |
    # bishops, rooks, queens, knights, or kings
    (?i:
      (?<E>(?!(?6))K)?   # decide between scanning forward (<E> is unset) or backwards (<E> is captured)
      (?:
        (?(E)|((?6)[BQ])) (?<B>()?((?(-1)-)(?3){7}(?(-2)(?2)))+)         (?(E)(?-4)) | # bishops or queens
        (?(E)|((?6)[RQ])) (?<R>-*|((?(-1)-)(?3){8})+)                    (?(E)(?-3)) | # rooks or queens
        (?(E)|((?6) N  )) (?<N>(?<=..)(?2){3}|(?=.)(?2){5}|(?2){8}(?2)?) (?(E)(?-2))   # knights
      )
      (?(E)|(?&E)) |
      K(?<K>(?3){7,9})?K   # kings
    )
  )
)

-৮৮ বাইটগুলি অ-পারমাণবিক সাব্রোটিন কল ব্যবহার করে, এভাবে পিসিআরআই 1 থেকে পিসিআরই 2-এ পুনরায় চালু করা হয়

উপরের সংস্করণটি পাস বা কাস্টিং প্রবেশের অনুমতি না দেওয়ার জন্য সংশোধন করা হয়েছে, তবে সম্পূর্ণ প্রকল্পটি এমন একটি রাজ্যে রয়েছে যেখানে এটি প্রাথমিক বোর্ড রাজ্যে শুরু করে (যা স্ট্যান্ডার্ড দাবা শুরুর অবস্থান হতে হবে - Chess960 নয়) সমর্থিত, এখনও অন্তত)। এন পাসেন্ট এবং কাস্টলিংয়ের সম্পূর্ণ বিধিগুলি প্রয়োগ করা হয়।

এখানে সম্পূর্ণ নমুনা (পিসিআরআই 1 - এখনও রিচার্জড নয়) দ্বারা বৈধতাযুক্ত একটি নমুনা গেম [regex101.com]

একটি অবৈধ পদক্ষেপের ফলাফল প্রতিটি পরবর্তী বোর্ডের পজিশনে মেলে / হাইলাইট করা হয় না। চেকমেট / অচলাবস্থা সনাক্তকরণ এবং এইভাবে বিজয়ী কে (বা এটি যদি ড্র হয়) সনাক্তকরণ এখনও কার্যকর করা হয়নি; এই কারণেই এই উদাহরণে চূড়ান্ত বোর্ডের রাষ্ট্রটি হাইলাইট করা হয়নি।

এখানে একটি সি / সি ++ প্রোগ্রাম যা বীজগণিত স্বরলিপিটিকে এই রেজেক্স দ্বারা স্বীকৃত ফর্ম্যাটে রূপান্তরিত করে। বীজগণিত স্বরলিপি বর্তমানে প্রতিটি চলার জন্য পৃথক স্ট্রিং সহ উত্স কোডে একটি অ্যারের ইনলাইন আকারে স্থাপন করা উচিত, তবে এটি স্টাডিন বা এক কমান্ড-লাইন আর্গুমেন্টের একক স্ট্রিং হিসাবে স্পেস দ্বারা পৃথক করে মুভের সম্পূর্ণ ক্রম হিসাবে পড়া উচিত এবং ডট-টার্মিনেটেড মুভ নম্বরগুলি পরিকল্পনা করা হয়েছে।

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


সুডোকু বৈধতা প্রশ্নের জন্য 3000-বাইট রেজেক্স মনস্ট্রোসিটি দেওয়ার সময় থেকে আমি এতটা আতঙ্কে পূর্ণ হইনি (বিজয়ী উত্তর বিবেচনা করে 75 টিরও কম পেয়েছে) a সত্যিকার অর্থে প্রমাণিত হয় যে কখনও কখনও আপনি যখন কোন সমস্যা সমাধানের জন্য রেজেক্স ব্যবহার করেন তখন আপনি দুটি সমস্যার সাথে শেষ করেন
মান কালি

@ ভ্যালিউইঙ্ক হেইহ, সম্ভবত আপনি ঠিক বলেছেন তবে আমি এর সম্পূর্ণ অবাস্তবতা নির্বিশেষে (বা সম্ভবত কারণেই) এটিকে উপভোগ করছি। আপনার মন্তব্য আমাকে সেই সুডোকু প্রশ্নের উত্তর দেওয়ার চেষ্টা করতে অনুপ্রাণিত করেছিল, তবে আমি কেবল 200 বাইট পরিচালনা করেছি । আচ্ছা ভালো.
ডেডকোড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.