অক্ষরের গ্রিডে আমি কীভাবে বৈধ শব্দগুলি খুঁজে পেতে পারি?


12

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

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

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


দুর্ভাগ্যক্রমে, আপনি ঠিক বলেছেন। এটি সংখ্যার কারণে (3, 4, 5, ... 25 অক্ষরের সমস্ত সংমিশ্রণ) খুব ধীর। পারফরম্যান্সের উন্নতির জন্য এটি "শব্দগুলি অনুভূমিকভাবে বা উল্লম্বভাবে সারিবদ্ধভাবে আবদ্ধ থাকতে হবে" সীমাবদ্ধ করুন (এবং এলোমেলো শব্দগুলি প্লেয়ারটি দেখতে পায়নি এমনটি পাবে না)?
ashes999

আমি মনে করি আপনাকে আবার আপনার আলগোরিদিমটি দেখতে হবে যা অক্ষরের ক্রমের সাথে শব্দের সাথে মেলে। আমার গণনা অনুসারে একটি 5x5 গ্রিডে 2700 সম্ভাব্য শব্দ থাকবে, যা আপনার অ্যালগরিদমের মাধ্যমে ফুরিয়ে যেতে হবে, যেমন জোশের উত্তর দেখুন's
তাইমির

আমি নিম্নলিখিত পদ্ধতিতে 2700 শব্দে পৌঁছেছি; প্রথম সারিতে বাম থেকে ডান শব্দের সাথে শুরু করুন। 1 পজিশন রয়েছে যে একটি 5 অক্ষরের শব্দ, 2 4 অক্ষরের শব্দ, 3 3 অক্ষরের শব্দ, 4 2 অক্ষরের শব্দ এবং 5 1 অক্ষরের শব্দ রয়েছে। আমরা অন্য কলামের একটি চিঠির জন্য শব্দটির মধ্যে একটি চিঠি আদান-প্রদান করতে পারি। আমরা সাধারণতা হারানো ছাড়াই ধরে নিতে পারি যে 1 টি অক্ষরের শব্দের জন্য কোনও বর্ণের আদান-প্রদান করা হয় না এবং প্রথম অক্ষরটি 2 অক্ষর শব্দের বিনিময় হয় না। এটি দেয়; 5 * 5 * 1 + 4 * 5 * 2 + 3 * 5 * 3 + 1 * 5 * 4 + 1 = 135 । সারি এবং দিকনির্দেশের সংখ্যা দ্বারা গুণ করুন; 135 * 5 * 4 = 2700
তাইমার

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

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

উত্তর:


22

বর্বর শক্তি একমাত্র উপায় নয়।

আপনার গেম বোর্ডটি সমাধান করা সরল বাদে কোনও বগল বোর্ড সমাধান করার মতো is আপনি বোর্ডের প্রতিটি টাইল পরীক্ষা করতে চান, উপযুক্ত দিকগুলি বরাবর তৈরি করা যেতে পারে এমন কোনও শব্দ আছে কিনা তা দেখার জন্য।

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

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

    0        The root of the trie is the empty string here, although you 
    |        can implement the structure differently if you want.
    c
   / \ 
  a   e
 / \   \
t  r    l
         \
          l

সুতরাং, আপনার গেমের প্রতিটি বৈধ শব্দ দিয়ে একটি উপসর্গের গাছটি পূরণ করে শুরু করুন।

যে কোনও সময় বোর্ডে বৈধ শব্দগুলি খুঁজে পাওয়ার আসল প্রক্রিয়াটিতে বোর্ডের প্রতিটি টাইল থেকে পুনরাবৃত্ত অনুসন্ধান শুরু করা জড়িত। কিছু প্রদত্ত টাইল থেকে শুরু করে বোর্ড স্পেসের মাধ্যমে প্রতিটি অনুসন্ধান স্বাধীন, তাই প্রয়োজনে এগুলি সমান্তরাল করে তোলা যেতে পারে। আপনি অনুসন্ধান করার সময়, আপনি যে দিকটি সন্ধান করছেন তাতে বর্ণের মানের উপর ভিত্তি করে উপসর্গ গাছটি "অনুসরণ" করেন।

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

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


নিজেকে বোঝানোর মতো একমাত্র জন্তুটি শক্তি নয়। :) অনেকগুলি উপসর্গ রয়েছে যা ইঙ্গিত দেয় যে দেখার চেষ্টা করার কোনও মানে নেই। (বেশিরভাগ [এলোমেলো] স্ট্রিং শব্দ নয় + + 1
আতুরস্যামস

দুর্দান্ত উত্তর। একটি "শব্দ" হ'ল গেমের অভিধানের পুরো স্টপেজ in
অ্যাডাম ইবারবাচ

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

OTOH আমার ধারণা ওপি বর্তমানে তার চেয়ে বেশি দক্ষ স্ট্রিং মেলানো অ্যালগরিদ চাইবে।
তাইমির

1
@ টেইমির প্লেইন ট্রাই ব্যবহার করছেন, হ্যাঁ। তবে কেউ আহো-করাসিক অ্যালগরিদম ব্যবহার করতে পারেন যা সামান্য পরিবর্তিত ট্রাই ব্যবহার করে অনেক বেশি কার্যকর (রৈখিক)। অহো-করাসিক অ্যালগরিদমের সাহায্যে ও (এন ^ 2) সময়ে এনএক্সএন ম্যাট্রিক্সের সমস্ত বৈধ শব্দ পাওয়া যাবে।
el.pescado

3

আপনি এটি চেষ্টা করে থাকতে পারেন, ইতিমধ্যে এটি প্রয়োগ করেছেন, সম্ভবত আরও ভাল উত্তর সহ আরও ভাল কিছু ইত্যাদি রয়েছে তবে আমি তাদের উল্লেখ করা (এখনও) দেখিনি, তাই এখানে এটি রয়েছে:

কি পরিবর্তন হয়েছে এবং কী হয়নি তার উপর নজর রেখে আপনি প্রচুর চেক বাতিল করতে পারেন। উদাহরণ স্বরূপ:

On a 5x5 field, A vertical word is found on base of the third column,
All the rows change. However, the first, second, fourth, and fifth,
columns do not change, so you dont need to worry about them (the third did change.)

On a 5x5 field, A 3 letter word is found horizontally on row 2, column 3, to column 5.
So you need to check row 1 and 2 (row 1 because the words on that one
fell down and where replaced), as-well as columns 3, 4, and 5.

অথবা, স্যুডো কোডে

// update the board

// and check
if (vertical_word)
{
    check(updated_column)

    for (i in range 0 to updated_row_base)
        check(i)
}
else // horizontal word
{
    for (i in range 0 to updated_row)
        check(i)

    for (i in range 0 to updated_column_start)
        check(i)

    for (i in range updated_column_end+1 to final_column)
        check(i)
}

তুচ্ছ প্রশ্নগুলি:

আপনার কি সংকলকগুলির গতি অপ্টিমাইজেশন সেট আছে? (যদি আপনি এটি ব্যবহার করেন)

আপনার শব্দ অনুসন্ধান অ্যালগরিদম কি আদৌ অনুকূলিত করা যেতে পারে? যেকোন ভাবে?


খেলোয়াড়দের সারি ঘোরাতে অনুমতি দেওয়া বাদে তৃতীয় কলামে একটি শব্দ খুঁজে পাওয়া অন্যান্য কলামগুলিকে প্রভাবিত করবে।
তাইমির

@ টেইমির IF(rowMoved){ checkColumns(); checkMovedRow(); } IF(columnMoved){ checkRows() checkMovedColumn();} যদি কোনও ব্যবহারকারী কেবল একবারে একটিতে স্থানান্তর করতে পারেন তবে সেই পদক্ষেপের সমাপ্তির পরে কোনও সমান্তরাল অক্ষর স্থানান্তরিত হয়নি এবং সেগুলির জন্য পুনরায় পরীক্ষা করার প্রয়োজন নেই।
ডেভিড স্টারকি

2

মনে রাখবেন যে প্রতিটি চরিত্রই একটি মান। সুতরাং আপনার সুবিধার জন্য এটি ব্যবহার করুন। কিছু হ্যাশ ফাংশন রয়েছে যা সাবস্ট্রিংগুলিতে পুনরাবৃত্তি করার সময় দ্রুত গণনা করা যেতে পারে। উদাহরণস্বরূপ, ধরা যাক আমরা প্রতিটি অক্ষরকে একটি 5 বিট কোড দিই (কেবল c - 'a' + 1সি তে করুন):

space = 00000;
a = 00001;
c = 00011;
e = 00101;
t = 01100;

আপনি দ্রুত কোনও নির্দিষ্ট আকারের সমস্ত সাবস্ট্রিংগুলিতে দ্রুত রান করতে পারেন Than

a b [c a t] e t h e = 00011 00001 01100;
//Now we just remove the 5 msb and shfit the rest 5 bits left and add the new character.
a b  c [a t e] t h e = (([c a t] & 0xffff) << 5) | e; // == a t e

আমরা আজ বেশিরভাগ সাধারণ স্থাপত্যগুলিতে এভাবে 12 টি অক্ষর পর্যন্ত সাবস্ট্রিংগুলি পরীক্ষা করতে পারি।

যদি আপনার অভিধানে একটি হ্যাশ কোড উপস্থিত থাকে আপনি দ্রুত সেখান থেকে শব্দটি টানতে পারেন কারণ হ্যাশ কোডগুলি অনন্য cause আপনি যখন সর্বোচ্চ 12 টি অক্ষর পৌঁছেছেন, আপনি সেই 12 টি অক্ষর দিয়ে শব্দের জন্য অন্য কোনও ডেটা স্ট্রাকচার যুক্ত করতে চাইতে পারেন। যদি আপনি এমন একটি শব্দ খুঁজে পান যা নির্দিষ্ট 12 টি অক্ষরের সাথে শুরু হয় তবে প্রতিটি শব্দের প্রত্যয়ের জন্য কেবল একটি তালিকা বা অন্য ক্ষুদ্র হ্যাশ টেবিল তৈরি করে যা সেই উপসর্গ দিয়ে শুরু হয়।

সমস্ত বিদ্যমান শব্দ কোডের একটি অভিধান সংরক্ষণ করার জন্য কয়েক মেগাবাইট মেমরির বেশি হওয়া উচিত নয়।


0

শব্দ গঠনের সময় আপনি কি কেবল ধ্রুপদী টেট্রিস আকারগুলিতে সীমাবদ্ধ রয়েছেন, বা কোনও গঠন কী করবে? শব্দগুলি কি অনির্দিষ্টকালের জন্য বা কেবল একবারে বাঁকানো যেতে পারে? একটি শব্দ যতক্ষণ ইচ্ছা দীর্ঘ হতে পারে? আপনি যদি নিজের পছন্দমতো বাঁক করতে পারেন তবে কার্যকরভাবে সবচেয়ে দীর্ঘতম শব্দটি 25 টি অক্ষরকে দীর্ঘায়িত করতে পারলে এটি বেশ জটিল। আমি ধরে নেব আপনার কাছে গৃহীত শব্দের একটি তালিকা আছে। এই অনুমানের ভিত্তিতে আমি আপনাকে এই জাতীয় কিছু চেষ্টা করার পরামর্শ দিচ্ছি:

At the start of the game:
  Iterate tiles:
    Use tile as starting letter
      Store previous tile
      Check the four adjacent tiles
      If a tile can continue a word started by the previous tile, carry on
      Store the next tile
      Move check to next tile

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

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