ক্রসওয়ার্ড উত্পন্ন করতে অ্যালগরিদম


123

শব্দের একটি তালিকা দেওয়া হয়েছে, আপনি কীভাবে সেগুলি ক্রসওয়ার্ড গ্রিডে সাজিয়ে রাখবেন?

এটি একটি "যথাযথ" ক্রসওয়ার্ড ধাঁধা এর মতো হতে হবে না যা প্রতিসম বা এর মতো কিছু: মূলত প্রতিটি শব্দের জন্য একটি সূচনা অবস্থান এবং দিকনির্দেশ output

উত্তর:


62

আমি একটি সমাধান নিয়ে এসেছি যা সম্ভবত সবচেয়ে দক্ষ নয়, তবে এটি যথেষ্ট ভালভাবে কাজ করে। মূলত:

  1. সমস্ত শব্দকে দৈর্ঘ্য অনুসারে বাছাই করুন।
  2. প্রথম শব্দটি নিয়ে বোর্ডে রাখুন।
  3. পরের শব্দটি নিন।
  4. বোর্ডে ইতিমধ্যে থাকা সমস্ত শব্দের সন্ধান করুন এবং দেখুন এই শব্দটির সাথে কোনও সম্ভাব্য ছেদ (কোনও সাধারণ অক্ষর) আছে কিনা।
  5. এই শব্দের জন্য যদি কোনও সম্ভাব্য অবস্থান থাকে তবে বোর্ডে থাকা সমস্ত শব্দের মধ্য দিয়ে লুপ করুন এবং নতুন শব্দটি হস্তক্ষেপ করে কিনা তা পরীক্ষা করে দেখুন।
  6. যদি এই শব্দটি বোর্ডটি না ভাঙে, তবে এটি সেখানে রাখুন এবং তৃতীয় ধাপে যান, অন্যথায়, কোনও স্থান অনুসন্ধান করা চালিয়ে যান (পদক্ষেপ 4)।
  7. যতক্ষণ না সমস্ত শব্দ হয় বা স্থাপন করা যায় না ততক্ষণ এই লুপটি চালিয়ে যান।

এটি একটি কাজ করে, তবে প্রায়শই বেশ দুর্বল ক্রসওয়ার্ড করে। উন্নততর ফলাফল নিয়ে আসার জন্য আমি বেসিক রেসিপিটিতে বেশ কয়েকটি পরিবর্তন করেছি।

  • ক্রসওয়ার্ড উত্পন্ন করার শেষে, কতটি শব্দের স্থাপন করা হয়েছিল (আরও ভাল), বোর্ডটি কত বড় (ছোট আরও ভাল) এবং উচ্চতা এবং প্রস্থের মধ্যে অনুপাত (আরও কাছাকাছি) এর উপর ভিত্তি করে এটিকে একটি স্কোর দিন 1 ভাল)। বেশ কয়েকটি ক্রসওয়ার্ড তৈরি করুন এবং তারপরে তাদের স্কোরগুলি তুলনা করুন এবং সেরাটি চয়ন করুন।
    • স্বতঃস্ফূর্ত সংখ্যার পুনরাবৃত্তি চালানোর পরিবর্তে, আমি সিদ্ধান্ত নিয়েছি সময় মতো একটি স্বেচ্ছাসেবী হিসাবে যথাসম্ভব ক্রসওয়ার্ড তৈরি করতে। আপনার যদি কেবল একটি ছোট শব্দের তালিকা থাকে তবে আপনি 5 সেকেন্ডের মধ্যে কয়েক ডজন সম্ভাব্য ক্রসওয়ার্ড পাবেন। একটি বৃহত ক্রসওয়ার্ড কেবল 5-6 সম্ভাবনা থেকে বেছে নেওয়া যেতে পারে।
  • কোনও নতুন শব্দ স্থাপন করার সময়, কোনও গ্রহণযোগ্য অবস্থান সন্ধানের সাথে সাথে এটি স্থাপনের পরিবর্তে, শব্দটির অবস্থানটি গ্রিডের আকার কতটা বাড়ায় এবং কতগুলি ছেদকেন্দ্র রয়েছে তার ভিত্তিতে একটি স্কোর দিন (আদর্শভাবে আপনি প্রতিটি শব্দটিই চান অন্যান্য শব্দের দ্বারা অতিক্রম 2)। সমস্ত অবস্থান এবং তাদের স্কোর সম্পর্কে নজর রাখুন এবং তারপরে সেরাটি চয়ন করুন।

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

2
".... ... এবং নতুন শব্দটি হস্তক্ষেপ করে কিনা তা পরীক্ষা করে দেখুন" একটি বিদ্যমান শব্দের পাশাপাশি নতুন শব্দটি যেখানে অবস্থিত রয়েছে সেখানে এমন শব্দগুলি কীভাবে জবরদস্ত করে সেখানে আপনি কীভাবে দায়বদ্ধ হন? উদাহরণস্বরূপ: লেমন ইরেস যদি "এলই", "ইআর" এবং "এমএ" ইত্যাদি আপনার তালিকার শব্দ না হয় তবে এটি ভুল। অন্যদিকে, সরাসরি এই জাতীয় সংলগ্নতাকে প্রত্যাখ্যান করা সত্যিই ভাল গ্রিডগুলি ফেলে দিতে পারে, যেমন: ডাব্লু
লেমন এরেস

4
@ ক্যাফেইন, হ্যাঁ, আপনি কী বলতে চাইছেন তা আমি জানি - আমাকে এই বিকল্পগুলি ফেলে দিতে হয়েছিল কারণ তারা সত্যই ভাল গ্রিড তৈরি করতে পারলেও এটি পরীক্ষা করা খুব কঠিন (পড়ুন: আমাকে বিরক্ত করা যায় না) , এবং সম্ভাবনা হ'ল যাইহোক এটি কেবল হস্তক্ষেপই নয় ।
নিক

4
উপরের প্রস্তাবনাগুলি এবং আমার নিজস্ব কয়েকটি ব্যবহার করে jQuery / জাভাস্ক্রিপ্ট দিয়ে তৈরি ... mlewiscs.com/crossword
এম্লিউভিসকোডসোলিউশন

@ এমএইউইভিসকোডসোলিউশনগুলি দুর্দান্ত দেখাচ্ছে। আপনি কি ওপেন সোর্সিং করছেন?
জিকেএস

23

আমি সম্প্রতি পাইথনে নিজের লেখা লিখেছি। আপনি এটি এখানে খুঁজে পেতে পারেন: http://bryanhelmig.com/python-crossword-puzzle-generator/ । এটি ঘন এনওয়াইটি স্টাইলের ক্রসওয়ার্ড তৈরি করে না, তবে ক্রসওয়ার্ডগুলির স্টাইলটি আপনি কোনও সন্তানের ধাঁধা বইতে খুঁজে পেতে পারেন।

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

  1. যাইহোক আকার এবং শব্দের একটি তালিকা তৈরি করুন।
  2. শব্দের তালিকাটি পরিবর্তন করুন এবং তারপরে শব্দটিকে দীর্ঘতম থেকে সংক্ষিপ্ত আকারে সাজান।
  3. প্রথম ও দীর্ঘতম শব্দটি উপরের বাম সর্বাধিক অবস্থানে রাখুন, 1,1 (উল্লম্ব বা অনুভূমিক)।
  4. পরের শব্দের দিকে সরান, শব্দের প্রতিটি অক্ষর এবং গ্রিডের প্রতিটি কক্ষের চিঠি থেকে চিঠি পত্রের জন্য সন্ধানের জন্য লুপ করুন।
  5. কোনও মিল পাওয়া গেলে, কেবলমাত্র শব্দের জন্য প্রস্তাবিত স্থানাঙ্ক তালিকায় সেই অবস্থানটি যুক্ত করুন।
  6. প্রস্তাবিত সমন্বয় তালিকার উপরে লুপ করুন এবং আরও কতগুলি শব্দের ক্রস হয় তার উপর ভিত্তি করে শব্দ স্থান নির্ধারণের উপর ভিত্তি করে "স্কোর" করুন। 0 এর স্কোরগুলি খারাপ স্থান নির্ধারণ করে (বিদ্যমান শব্দের সাথে সংলগ্ন) বা কোনও শব্দের ক্রস হয়নি indicate
  7. শব্দ তালিকাটি অবসন্ন না হওয়া পর্যন্ত # 4 ধাপে ফিরে যান। .চ্ছিক দ্বিতীয় পাস।
  8. আমাদের এখন ক্রসওয়ার্ড থাকা উচিত, তবে কিছু এলোমেলো স্থানের কারণে মানটি হিট বা মিস হতে পারে। সুতরাং, আমরা এই ক্রসওয়ার্ডটি বাফার করি এবং # 2 তে ফিরে যাই। যদি পরবর্তী ক্রসওয়ার্ডটির বোর্ডে আরও শব্দ থাকে তবে এটি ক্রফওয়ার্ডটি বাফারে প্রতিস্থাপন করে। এটি সময় সীমাবদ্ধ (এক্স সেকেন্ডের সেরা ক্রসওয়ার্ডটি সন্ধান করুন)।

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


@ নীল এন: অন্য শব্দের জন্য সম্ভবত একটি আরও ভাল অক্ষরের সাথে মিলের সম্ভাবনা। শব্দ প্রতি পৃথক অক্ষর গণনা অনুসারে বাছাই করার একটি পদ্ধতিও হতে পারে যা বেশিরভাগ ক্ষেত্রে একই ফলাফলের দিকে নিয়ে যায়।
কার্ল অ্যাডলার

@ নীলন পাইথন array.sort(key=f)স্থিতিশীল, যার অর্থ (উদাহরণস্বরূপ) যে দৈর্ঘ্য অনুসারে একটি বর্ণানুক্রমিক শব্দ তালিকাকে বাছাই করা 8-অক্ষরের শব্দগুলিকে বর্ণমালা অনুসারে বাছাই করে রাখবে।
লিন

4
ব্রায়ান, আপনার ওয়েবসাইটের লিঙ্কটি আমার পক্ষে কাজ করে না এবং প্রাথমিক ডোমেনটি কেবল টুইটারে পুনঃনির্দেশ করে। আপনার কোডটিতে একটি আপডেট লিঙ্ক আছে?
মাইকেল 20

2
ব্রায়ানের জেনারেটরের একটি ক্লোন এখানে (আপাতদৃষ্টিতে): github.com/jeremy886/ ক্রসওয়ার্ড_হেল্মিগ
লিভিক্টোরিনো

20

আমি আসলে প্রায় দশ বছর আগে একটি ক্রসওয়ার্ড জেনারেশন প্রোগ্রাম লিখেছিলাম (এটি গুপ্ত ছিল তবে একই নিয়মগুলি সাধারণ ক্রসওয়ার্ডের জন্য প্রযোজ্য)।

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

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

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

একবার শব্দ / ক্লু ফাইলটি একটি নির্দিষ্ট আকারে উঠল (এবং এটি এই ক্লায়েন্টটির জন্য দিনে 50-100 টি ক্লু যুক্ত করা হয়েছিল), খুব কমই দু'বারের থেকে তিনটি ম্যানুয়াল ফিক্স আপের ঘটনা ঘটে যা প্রতিটি ক্রসওয়ার্ডের জন্য করতে হয়েছিল had ।


এটি আসলে আমার পরিস্থিতিতে সহায়তা করে না, যেহেতু আমার কাছে কেবল প্রায় 6-12 শব্দের একটি তালিকা থাকবে। আমার শব্দের ধাঁধার চেয়ে ব্যবহারকারীর জন্য শেখার অনুশীলনের মতোই খনি। যাইহোক যাইহোক আকর্ষণীয় অ্যালগরিদমের জন্য +1!
নিকফ

1
সুন্দর বর্ণনা। আমি অতীতে কয়েকবার এটি সম্পর্কে ভেবেছিলাম, কিন্তু কখনও চেষ্টা করিনি। এখন যাদু প্রশ্নের জন্য: এটি কতটা ভাল কাজ করেছে? কেবল বিরল ধাঁধা জন্য, বা ঘন বেশী জন্য (কাগজের মতো)? এবং ঘন ধাঁধাটির জন্য আপনার কতগুলি ক্লু দরকার?
ডিএমকেকে --- প্রাক্তন-মডারেটর বিড়ালছানা

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

16

এই অ্যালগরিদম 60 সেকেন্ডে 50 ঘন 6x9 তীর ক্রসওয়ার্ড তৈরি করে । এটি একটি ওয়ার্ড ডাটাবেস (শব্দ + টিপস সহ) এবং একটি বোর্ড ডাটাবেস (প্রাক কনফিগার বোর্ড সহ) ব্যবহার করে।

1) Search for all starting cells (the ones with an arrow), store their size and directions
2) Loop through all starting cells
2.1) Search a word
2.1.1) Check if it was not already used
2.1.2) Check if it fits
2.2) Add the word to the board
3) Check if all cells were filled

একটি বড় শব্দের ডাটাবেস প্রজন্মের সময়কে যথেষ্ট হ্রাস করে এবং কিছু ধরণের বোর্ডগুলি পূরণ করা শক্ত hard বড় বোর্ডগুলিকে সঠিকভাবে পূরণ করতে আরও সময় প্রয়োজন!


উদাহরণ:

প্রাক-কনফিগার 6x9 বোর্ড:

(# মানে একটি ঘরে একটি টিপ,% এর অর্থ একটি কক্ষে দুটি টিপস, তীর দেখানো হয়নি)

# - # # - % # - # 
- - - - - - - - - 
# - - - - - # - - 
% - - # - # - - - 
% - - - - - % - - 
- - - - - - - - - 

6x9 বোর্ড উত্পন্ন:

# C # # P % # O # 
S A T E L L I T E 
# N I N E S # T A 
% A B # A # G A S 
% D E N S E % W E 
C A T H E D R A L 

টিপস [লাইন, কলাম]:

[1,0] SATELLITE: Used for weather forecast
[5,0] CATHEDRAL: The principal church of a city
[0,1] CANADA: Country on USA's northern border
[0,4] PLEASE: A polite way to ask things
[0,7] OTTAWA: Canada's capital
[1,2] TIBET: Dalai Lama's region
[1,8] EASEL: A tripod used to put a painting
[2,1] NINES: Dressed up to (?)
[4,1] DENSE: Thick; impenetrable
[3,6] GAS: Type of fuel
[1,5] LS: Lori Singer, american actress
[2,7] TA: Teaching assistant (abbr.)
[3,1] AB: A blood type
[4,3] NH: New Hampshire (abbr.)
[4,5] ED: (?) Harris, american actor
[4,7] WE: The first person of plural (Grammar)

11

যদিও এটি একটি পুরানো প্রশ্ন, আমি একইভাবে করা কাজের উপর ভিত্তি করে একটি উত্তর চেষ্টা করব।

সীমাবদ্ধতা সমস্যাগুলি সমাধান করার জন্য অনেকগুলি পন্থা রয়েছে (যা জেনারেলটি এনপিসি জটিলতার শ্রেণিতে থাকে)।

এটি সম্মিলিত অপ্টিমাইজেশন এবং সীমাবদ্ধ প্রোগ্রামিং সম্পর্কিত। এক্ষেত্রে সীমাবদ্ধতা হ'ল গ্রিডের জ্যামিতি এবং শব্দের অনন্যতা ইত্যাদির প্রয়োজনীয়তা ..

র্যান্ডমাইজেশন / আনিলিং পদ্ধতিগুলিও কাজ করতে পারে (যদিও সঠিক সেটিংয়ের মধ্যে))

দক্ষ সরলতা কেবল চূড়ান্ত জ্ঞান হতে পারে!

প্রয়োজনীয়তাগুলি কম-বেশি সম্পূর্ণ ক্রসওয়ার্ড সংকলক এবং (ভিজ্যুয়াল ডাব্লুওয়াইএসআইওয়াইওয়াইজি) নির্মাতার জন্য ছিল।

ডাব্লুওয়াইএসআইওয়াইওয়াইজি বিল্ডার অংশটি বাদ দিয়ে সংকলকের রূপরেখাটি হ'ল:

  1. উপলভ্য ওয়ার্ডলিস্টগুলি লোড করুন (শব্দের দৈর্ঘ্য অনুসারে বাছাই করা, অর্থাৎ ২,৩, .., ২০)

  2. ব্যবহারকারীর দ্বারা নির্মিত গ্রিডে ওয়ার্ডস্লটস (অর্থাত্ গ্রিড শব্দ) সন্ধান করুন (উদাহরণস্বরূপ x, y দৈর্ঘ্যের এল, অনুভূমিক বা উল্লম্ব সহ) (জটিলতা O (N))

  3. গ্রিড শব্দের ছেদযুক্ত বিন্দুগুলি গণনা করুন (যেটি পূরণ করা দরকার) (জটিলতা হে (এন ^ 2))

  4. বর্ণমালার শব্দের ছেদগুলিকে বর্ণমালার বিভিন্ন অক্ষরের সাথে গণনা করুন (এটি টেমপ্লেট ব্যবহার করে শব্দের সাথে মিলের সন্ধান করতে দেয় যেমন সিডব্লিউসি দ্বারা ব্যবহৃত সিক কম্বন থিসিস ) (জটিলতা ও (ডাব্লুএল * আল))

পদক্ষেপ .3 এবং .4 এই কাজটি করার অনুমতি দেয়:

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

খ। বর্ণমালার সাথে একটি শব্দ তালিকার শব্দের ছেদগুলি কোনও প্রদত্ত "টেমপ্লেট" (যেমন 1 ম স্থানে 'এ' এবং তৃতীয় স্থানে 'বি' ইত্যাদি মিলে যায়) (মিলিয়ে প্রার্থী) শব্দগুলি খুঁজে পেতে সক্ষম করে)

সুতরাং এই ডেটা স্ট্রাকচার প্রয়োগের সাথে ব্যবহৃত অ্যালগরিদমটি এরকম ছিল:

দ্রষ্টব্য: গ্রিড এবং শব্দের ডাটাবেস স্থির থাকলে পূর্ববর্তী পদক্ষেপগুলি একবারে একবার করা যেতে পারে।

  1. অ্যালগরিদমের প্রথম পদক্ষেপটি এলোমেলোভাবে একটি ফাঁকা ওয়ার্ল্ডস্লট (গ্রিড শব্দ) নির্বাচন করুন এবং এর সাথে যুক্ত ওয়ার্ডলিস্ট থেকে প্রার্থী শব্দটি পূরণ করুন (এলোমোরিয়ামের ক্রমাগত মৃত্যুদণ্ড কার্যকর করতে বিভিন্ন দ্রাবক উত্পাদন করতে সক্ষম) (জটিলতা ও (1) বা ও ( এন))

  2. প্রতিটি খালি শব্দের স্লটের জন্য (যেগুলি ইতিমধ্যে ভরা ওয়ার্ডস্লট সহ ছেদগুলি রয়েছে), একটি সীমাবদ্ধতার অনুপাত গণনা করুন (এটি পরিবর্তিত হতে পারে, সহজ পদক্ষেপটি সেই ধাপে উপলব্ধ সমাধানের সংখ্যা) এবং এই অনুপাত দ্বারা ফাঁকা ওয়ার্ডস্লটগুলি বাছাই করুন (জটিলতা হে (এনলগএন) ) বা ও (এন))

  3. পূর্ববর্তী পদক্ষেপে গণনা করা খালি ওয়ার্ডস্লটগুলির মধ্য দিয়ে লুপ করুন এবং প্রত্যেকের জন্য বেশ কয়েকটি ক্যানসিডিটেট সলিউশন চেষ্টা করুন ("অর্ক-ধারাবাহিকতা বজায় রয়েছে কিনা তা নিশ্চিত করে", অর্থাত গ্রিডের এই পদক্ষেপের পরে একটি সমাধান রয়েছে যদি এই শব্দটি ব্যবহৃত হয়) এবং সেগুলি অনুসারে বাছাই করুন পরবর্তী পদক্ষেপের জন্য সর্বাধিক প্রাপ্যতা (অর্থাত্ পরবর্তী পদক্ষেপের সর্বাধিক সম্ভাব্য সমাধান রয়েছে যদি এই শব্দটি সেই স্থানে ব্যবহৃত হয়, ইত্যাদি)) (জটিলতা হে (এন * ম্যাক্স্যান্ডিডেটস ইউজড))

  4. শব্দটি পূরণ করুন (এটিকে ভরাট হিসাবে চিহ্নিত করুন এবং দ্বিতীয় ধাপে যান)

  5. কোনও পদক্ষেপ না পাওয়া গেলে পদক্ষেপের মানদণ্ডকে সন্তুষ্ট করে .3 কিছু পূর্ববর্তী পদক্ষেপের অন্য প্রার্থীর সমাধানের ব্যাকট্র্যাক করার চেষ্টা করুন (মানদণ্ড এখানে আলাদা হতে পারে) (জটিলতা ও (এন))

  6. যদি ব্যাকট্র্যাক পাওয়া যায় তবে বিকল্পটি ব্যবহার করুন এবং ইতিমধ্যে ভরাট শব্দগুলির পুনঃনির্ধারণ করুন যা পুনরায় সেট করার প্রয়োজন হতে পারে (এগুলি আবার পূরণ না করে চিহ্নিত করুন) (জটিলতা ও (এন))

  7. যদি কোনও ব্যাকট্র্যাক পাওয়া যায় না, তবে কোনও সমাধান পাওয়া যাবে না (কমপক্ষে এই কনফিগারেশন সহ, প্রাথমিক বীজ ইত্যাদি etc)

  8. অন্যথায় যখন সমস্ত ওয়ার্ডলট পূরণ হয় আপনার একটি সমাধান হয়

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

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

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

PS2। অ্যালগরিদম একই সাথে একাধিক (পৃথক) সমাধান তৈরি করতে সহজেই সমান্তরাল করা যায়

আশাকরি এটা সাহায্য করবে


1
এটি কি ঘন লেআউটগুলি (এনওয়াই টাইমসের মতো) বা স্পার লেআউট তৈরির জন্য?
জিম

1
@ জিম, এটি বেশিরভাগ ঘন লেআউটের জন্য তবে এলোমেলোভাবে সামঞ্জস্যও করা যেতে পারে। পার্থক্যটি ঘন বিন্যাসে (যেমন ক্লাসিক, স্ক্যান্ডিনাভিক ইত্যাদি)) one
নিকস এম।

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

1
@ জিম, আমার যেমন এটি ইতিমধ্যে ব্যবহৃত হয়েছে তবে এটি আমার একটি কাজের জন্য নির্দিষ্টভাবে করা হয়েছিল, সম্ভবত আমার ওপেন সোর্স প্রকল্পগুলিতে আমি একটি হালকা ওজনের সংস্করণ পোস্ট করব, যদি আপনার আরও সাহায্যের প্রয়োজন হয় তবে আমার সাথে যোগাযোগ করুন (পিএস সত্যই এখানে কিছু কিছু ক্ষেত্রে অ্যালগরিদম আমি পোস্ট করতে খুব দীর্ঘ, কিন্তু গড় তে এটি স্বল্পতা)
নিকোস এম

1
@ জিম, এই ক্রসওয়ার্ড সাইটটি দেখুন (এখনও অগ্রগতিতে) istavrolexo.gr (গ্রীক ভাষায়) বিভিন্ন (ঘন) ক্রসওয়ার্ড সহ (যেমন স্ক্যান্ডিনাভিক, ক্লাসিক, সুডোকু) যা একটি অনুরূপ অ্যালগরিদম ( একটি বৃহত স্ক্যান্ডিনেভিক ক্রসওয়ার্ড ) দ্বারা উত্পন্ন হয়েছে
নিকোস এম।

9

শুরু করার জন্য কেন কেবল একটি এলোমেলো সম্ভাব্য পদ্ধতির ব্যবহার করবেন না। একটি শব্দ দিয়ে শুরু করুন এবং তারপরে বারবার একটি এলোমেলো শব্দ বেছে নিন এবং আকারের সীমাবদ্ধতাগুলি ভঙ্গ না করে ধাঁধাটির বর্তমান অবস্থায় এটি ফিট করার চেষ্টা করুন you আপনি যদি ব্যর্থ হন তবে কেবল আবার শুরু করুন।

আপনি অবাক হয়ে যাবেন যে কোনও মন্টি কার্লো এর মত কাজ করে।


2
হ্যাঁ, এটিই আমি বেছে নিয়েছি approach আপনাকে চেষ্টা করে খুব চালাক হতে হবে না। দীর্ঘতম থেকে সংক্ষিপ্ত পর্যন্ত শব্দ অর্ডার করুন। একটি লুপে, একটি এলোমেলো সেল নির্বাচন করুন (কলাম এবং সারি স্থানাঙ্ক) এবং শব্দটি বোর্ডের টেস্টে রাখুন এটি শেষ হয়ে চলেছে কিনা বা অন্য কোনও শব্দের সাথে হস্তক্ষেপ করছে কিনা তা পরীক্ষা করার জন্য (গ্রিডে শব্দটি লেখার আগে আপনি পরীক্ষা করে নিন যে প্রতিটি ঘরটি হয় কিনা) খালি বা এটির একটি চিঠি থাকলে, সেই চিঠিটি আপনি যে চিঠির সাথে লেখার চেষ্টা করছেন তা তার সাথে মেলে)। সীমা এবং স্টাফ চেক করার জন্য আরও কিছু যুক্তি রয়েছে। আমি জোর করে কিছু ছোট এবং আরও ছোট গ্রিড উত্পন্ন করি, তার পরে ছেদযুক্ত শব্দের উপর ভিত্তি করে সবচেয়ে ছোটকে র‌্যাঙ্ক করি।
ম্যাক্স হজস

6

নিকফের উত্তর এবং ব্রায়ানের পাইথন কোডের উপর ভিত্তি করে এখানে কিছু জাভাস্ক্রিপ্ট কোড রয়েছে। জেএস-এ অন্য কারোর প্রয়োজন হলে কেবল এটি পোস্ট করা।

function board(cols, rows) { //instantiator object for making gameboards
this.cols = cols;
this.rows = rows;
var activeWordList = []; //keeps array of words actually placed in board
var acrossCount = 0;
var downCount = 0;

var grid = new Array(cols); //create 2 dimensional array for letter grid
for (var i = 0; i < rows; i++) {
    grid[i] = new Array(rows);
}

for (var x = 0; x < cols; x++) {
    for (var y = 0; y < rows; y++) {
        grid[x][y] = {};
        grid[x][y].targetChar = EMPTYCHAR; //target character, hidden
        grid[x][y].indexDisplay = ''; //used to display index number of word start
        grid[x][y].value = '-'; //actual current letter shown on board
    }
}

function suggestCoords(word) { //search for potential cross placement locations
    var c = '';
    coordCount = [];
    coordCount = 0;
    for (i = 0; i < word.length; i++) { //cycle through each character of the word
        for (x = 0; x < GRID_HEIGHT; x++) {
            for (y = 0; y < GRID_WIDTH; y++) {
                c = word[i];
                if (grid[x][y].targetChar == c) { //check for letter match in cell
                    if (x - i + 1> 0 && x - i + word.length-1 < GRID_HEIGHT) { //would fit vertically?
                        coordList[coordCount] = {};
                        coordList[coordCount].x = x - i;
                        coordList[coordCount].y = y;
                        coordList[coordCount].score = 0;
                        coordList[coordCount].vertical = true;
                        coordCount++;
                    }

                    if (y - i + 1 > 0 && y - i + word.length-1 < GRID_WIDTH) { //would fit horizontally?
                        coordList[coordCount] = {};
                        coordList[coordCount].x = x;
                        coordList[coordCount].y = y - i;
                        coordList[coordCount].score = 0;
                        coordList[coordCount].vertical = false;
                        coordCount++;
                    }
                }
            }
        }
    }
}

function checkFitScore(word, x, y, vertical) {
    var fitScore = 1; //default is 1, 2+ has crosses, 0 is invalid due to collision

    if (vertical) { //vertical checking
        for (i = 0; i < word.length; i++) {
            if (i == 0 && x > 0) { //check for empty space preceeding first character of word if not on edge
                if (grid[x - 1][y].targetChar != EMPTYCHAR) { //adjacent letter collision
                    fitScore = 0;
                    break;
                }
            } else if (i == word.length && x < GRID_HEIGHT) { //check for empty space after last character of word if not on edge
                 if (grid[x+i+1][y].targetChar != EMPTYCHAR) { //adjacent letter collision
                    fitScore = 0;
                    break;
                }
            }
            if (x + i < GRID_HEIGHT) {
                if (grid[x + i][y].targetChar == word[i]) { //letter match - aka cross point
                    fitScore += 1;
                } else if (grid[x + i][y].targetChar != EMPTYCHAR) { //letter doesn't match and it isn't empty so there is a collision
                    fitScore = 0;
                    break;
                } else { //verify that there aren't letters on either side of placement if it isn't a crosspoint
                    if (y < GRID_WIDTH - 1) { //check right side if it isn't on the edge
                        if (grid[x + i][y + 1].targetChar != EMPTYCHAR) { //adjacent letter collision
                            fitScore = 0;
                            break;
                        }
                    }
                    if (y > 0) { //check left side if it isn't on the edge
                        if (grid[x + i][y - 1].targetChar != EMPTYCHAR) { //adjacent letter collision
                            fitScore = 0;
                            break;
                        }
                    }
                }
            }

        }

    } else { //horizontal checking
        for (i = 0; i < word.length; i++) {
            if (i == 0 && y > 0) { //check for empty space preceeding first character of word if not on edge
                if (grid[x][y-1].targetChar != EMPTYCHAR) { //adjacent letter collision
                    fitScore = 0;
                    break;
                }
            } else if (i == word.length - 1 && y + i < GRID_WIDTH -1) { //check for empty space after last character of word if not on edge
                if (grid[x][y + i + 1].targetChar != EMPTYCHAR) { //adjacent letter collision
                    fitScore = 0;
                    break;
                }
            }
            if (y + i < GRID_WIDTH) {
                if (grid[x][y + i].targetChar == word[i]) { //letter match - aka cross point
                    fitScore += 1;
                } else if (grid[x][y + i].targetChar != EMPTYCHAR) { //letter doesn't match and it isn't empty so there is a collision
                    fitScore = 0;
                    break;
                } else { //verify that there aren't letters on either side of placement if it isn't a crosspoint
                    if (x < GRID_HEIGHT) { //check top side if it isn't on the edge
                        if (grid[x + 1][y + i].targetChar != EMPTYCHAR) { //adjacent letter collision
                            fitScore = 0;
                            break;
                        }
                    }
                    if (x > 0) { //check bottom side if it isn't on the edge
                        if (grid[x - 1][y + i].targetChar != EMPTYCHAR) { //adjacent letter collision
                            fitScore = 0;
                            break;
                        }
                    }
                }
            }

        }
    }

    return fitScore;
}

function placeWord(word, clue, x, y, vertical) { //places a new active word on the board

    var wordPlaced = false;

    if (vertical) {
        if (word.length + x < GRID_HEIGHT) {
            for (i = 0; i < word.length; i++) {
                grid[x + i][y].targetChar = word[i];
            }
            wordPlaced = true;
        }
    } else {
        if (word.length + y < GRID_WIDTH) {
            for (i = 0; i < word.length; i++) {
                grid[x][y + i].targetChar = word[i];
            }
            wordPlaced = true;
        }
    }

    if (wordPlaced) {
        var currentIndex = activeWordList.length;
        activeWordList[currentIndex] = {};
        activeWordList[currentIndex].word = word;
        activeWordList[currentIndex].clue = clue;
        activeWordList[currentIndex].x = x;
        activeWordList[currentIndex].y = y;
        activeWordList[currentIndex].vertical = vertical;

        if (activeWordList[currentIndex].vertical) {
            downCount++;
            activeWordList[currentIndex].number = downCount;
        } else {
            acrossCount++;
            activeWordList[currentIndex].number = acrossCount;
        }
    }

}

function isActiveWord(word) {
    if (activeWordList.length > 0) {
        for (var w = 0; w < activeWordList.length; w++) {
            if (word == activeWordList[w].word) {
                //console.log(word + ' in activeWordList');
                return true;
            }
        }
    }
    return false;
}

this.displayGrid = function displayGrid() {

    var rowStr = "";
    for (var x = 0; x < cols; x++) {

        for (var y = 0; y < rows; y++) {
            rowStr += "<td>" + grid[x][y].targetChar + "</td>";
        }
        $('#tempTable').append("<tr>" + rowStr + "</tr>");
        rowStr = "";

    }
    console.log('across ' + acrossCount);
    console.log('down ' + downCount);
}

//for each word in the source array we test where it can fit on the board and then test those locations for validity against other already placed words
this.generateBoard = function generateBoard(seed = 0) {

    var bestScoreIndex = 0;
    var top = 0;
    var fitScore = 0;
    var startTime;

    //manually place the longest word horizontally at 0,0, try others if the generated board is too weak
    placeWord(wordArray[seed].word, wordArray[seed].displayWord, wordArray[seed].clue, 0, 0, false);

    //attempt to fill the rest of the board 
    for (var iy = 0; iy < FIT_ATTEMPTS; iy++) { //usually 2 times is enough for max fill potential
        for (var ix = 1; ix < wordArray.length; ix++) {
            if (!isActiveWord(wordArray[ix].word)) { //only add if not already in the active word list
                topScore = 0;
                bestScoreIndex = 0;

                suggestCoords(wordArray[ix].word); //fills coordList and coordCount
                coordList = shuffleArray(coordList); //adds some randomization

                if (coordList[0]) {
                    for (c = 0; c < coordList.length; c++) { //get the best fit score from the list of possible valid coordinates
                        fitScore = checkFitScore(wordArray[ix].word, coordList[c].x, coordList[c].y, coordList[c].vertical);
                        if (fitScore > topScore) {
                            topScore = fitScore;
                            bestScoreIndex = c;
                        }
                    }
                }

                if (topScore > 1) { //only place a word if it has a fitscore of 2 or higher

                    placeWord(wordArray[ix].word, wordArray[ix].clue, coordList[bestScoreIndex].x, coordList[bestScoreIndex].y, coordList[bestScoreIndex].vertical);
                }
            }

        }
    }
    if(activeWordList.length < wordArray.length/2) { //regenerate board if if less than half the words were placed
        seed++;
        generateBoard(seed);
    }
}
}
function seedBoard() {
    gameboard = new board(GRID_WIDTH, GRID_HEIGHT);
    gameboard.generateBoard();
    gameboard.displayGrid();
}

শব্দের অবজেক্ট স্কিমা অনুপস্থিত, দয়া করে ওয়ার্ডআরাই সরবরাহ করুন
অর্থাত্

আক্ষরিক অর্থে ['আপেল', 'কমলা', 'নাশপাতি']
ফ্যাসিস্টডোনট

হাই, FYI আমার সম্পাদনাটি প্রচুর কোড পরিবর্তন করে নি, এটি কেবল এটি ফর্ম্যাট করেছে। আমি জানি এটি 'ইনলাইন' দেখার সময় এটিকে এত অগোছালো দেখাচ্ছে তবে আপনি যদি কোডের আসল পরিবর্তনগুলি দেখতে চান তবে 'পাশাপাশি-পাশের মার্কডাউন' এ ক্লিক করুন। আচ্ছা ... সম্পাদনার বিবরণে আমার "ফর্ম্যাট কোড" লেখা উচিত ছিল তবে মেহ।
ডাবল-বীপ

কিভাবে কাজ করে? আপনি এই জাভাস্ক্রিপ্ট অন্তর্ভুক্ত একটি এইচটিএমএল ফাইল সরবরাহ করতে পারেন?
জিকেএস

5

আমি দুটি সংখ্যা তৈরি করব: দৈর্ঘ্য এবং স্ক্র্যাবল স্কোর। ধরে নিন যে একটি কম স্ক্র্যাবল স্কোর মানে এর সাথে যোগ দেওয়া সহজ (কম স্কোর = প্রচুর প্রচলিত চিঠি)। দৈর্ঘ্য অবতরণ এবং স্ক্র্যাবল স্কোর আরোহী অনুসারে তালিকাটি সাজান।

এরপরে, কেবল তালিকাটি নীচে যান। শব্দটি যদি বিদ্যমান শব্দের সাথে অতিক্রম না করে (প্রতিটি শব্দের বিপরীতে যথাক্রমে তার দৈর্ঘ্য এবং স্ক্র্যাবল স্কোর পরীক্ষা করে দেখুন), তবে এটিকে কাতারে রাখুন এবং পরবর্তী শব্দটি পরীক্ষা করুন check

ধুয়ে ফেলুন এবং পুনরাবৃত্তি করুন এবং এটি ক্রসওয়ার্ড তৈরি করবে।

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


3

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

সুতরাং, আমার সাধারণ চিন্তাভাবনাটি হ'ল: কিছু লোকেরা এখানে নিম্ন-ঘনত্বের ক্রস তৈরির জন্য বর্ণিত হিসাবে তুলনামূলকভাবে কিছু জোরের পদ্ধতির তৈরি করুন এবং অভিধানের শব্দের সাথে ফাঁকা স্থান পূরণ করুন fill

অন্য কেউ যদি এই পদ্ধতি গ্রহণ করে থাকে তবে দয়া করে আমাকে জানান।


3

আমি ক্রসওয়ার্ড জেনারেটর ইঞ্জিনের চারপাশে খেলছিলাম এবং আমি এটি সবচেয়ে গুরুত্বপূর্ণ হিসাবে পেয়েছি:

0।!/usr/bin/python

  1. ক। allwords.sort(key=len, reverse=True)

    খ। কার্সারের মতো কিছু আইটেম / অবজেক্ট তৈরি করুন যা ম্যাট্রিক্সের চারপাশে চলবে সহজ অভিযোজনের জন্য যদি না আপনি পরে এলোমেলো পছন্দ দ্বারা পুনরাবৃত্তি করতে চান না।

  2. প্রথমটি, প্রথম জোড়াটি বেছে নিন এবং এটিকে 0,0 থেকে নীচে রেখে দিন; প্রথমটিকে আমাদের বর্তমান ক্রসওয়ার্ড 'নেতা' হিসাবে সংরক্ষণ করুন।

  3. ক্রসটি অর্ডার দ্বারা তির্যক বা এলোমেলোভাবে বৃহত্তর তির্যক সম্ভাব্যতা সহ পরবর্তী ফাঁকা ঘরে সরিয়ে নিন

  4. শব্দের উপর পুনরাবৃত্তি করুন এবং সর্বাধিক শব্দের দৈর্ঘ্য নির্ধারণ করতে ফাঁকা জায়গার দৈর্ঘ্য ব্যবহার করুন: temp=[] for w_size in range( len( w_space ), 2, -1 ) : # t for w in [ word for word in allwords if len(word) == w_size ] : # if w not in temp and putTheWord( w, w_space ) : # temp.append( w )

  5. আমি ব্যবহৃত স্থানের বিরুদ্ধে শব্দটির তুলনা করতে যেমন:

    w_space=['c','.','a','.','.','.'] # whereas dots are blank cells
    
    # CONVERT MULTIPLE '.' INTO '.*' FOR REGEX
    
    pattern = r''.join( [ x.letter for x in w_space ] )
    pattern = pattern.strip('.') +'.*' if pattern[-1] == '.' else pattern
    
    prog = re.compile( pattern, re.U | re.I )
    
    if prog.match( w ) :
        #
        if prog.match( w ).group() == w :
            #
            return True
    
  6. প্রতিটি সফলভাবে ব্যবহৃত শব্দের পরে, দিক পরিবর্তন করুন। সমস্ত ঘর পূর্ণ হয়ে যাওয়ার সময় লুপ করুন বা আপনি শব্দগুলির বাইরে চলেছেন বা পুনরাবৃত্তির সীমা দ্বারা:

# CHANGE ALL WORDS LIST inexOf1stWord = allwords.index( leading_w ) allwords = allwords[:inexOf1stWord+1][:] + allwords[inexOf1stWord+1:][:]

... এবং আবার নতুন ক্রসওয়ার্ড পুনরাবৃত্তি করুন।

  1. পূরণের স্বাচ্ছন্দ্য এবং কিছু অনুমানের ক্যালক দিয়ে স্কোরিং সিস্টেমটি তৈরি করুন। বর্তমান ক্রসওয়ার্ডের জন্য স্কোর দিন এবং পরে স্কোরটি আপনার স্কোরিং সিস্টেমের দ্বারা সন্তুষ্ট হলে তৈরি ক্রসওয়ার্ডগুলির তালিকায় এটি যুক্ত করুন narrow

  2. প্রথম পুনরাবৃত্তি সেশনের পরে পুনরায় কাজ শেষ করতে তৈরি ক্রসওয়ার্ডগুলির তালিকা থেকে পুনরাবৃত্তি করুন।

আরও বেশি পরামিতি ব্যবহার করে গতি একটি বিশাল গুণক দ্বারা উন্নত করা যেতে পারে।


2

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

আর একটি ধারণা জেনেটিক অ্যালগরিদম তৈরি করছে যেখানে শক্তি মেট্রিক হ'ল আপনি গ্রিডে কত শব্দ রাখতে পারেন।

একটি নির্দিষ্ট তালিকাটি জানার সময় আমি যে শক্ত অংশটি খুঁজে পাই তা হ'ল সম্ভবত পারা যায় না।


1
আমি জেনেটিক অ্যালগরিদমের কথাও ভাবছিলাম। ফিটনেস ফাংশনটি হতে পারে শব্দগুলিকে গ্রিডে কীভাবে শক্তভাবে প্যাক করা হয়েছে।
অ্যাড্রিয়ান ম্যাকার্থি

2

এটি হার্ভার্ড থেকে এআই সিএস 50 কোর্সে একটি প্রকল্প হিসাবে উপস্থিত হয় । ধারণাটি হ'ল ক্রসওয়ার্ড জেনারেশন সমস্যাটিকে একটি সীমাবদ্ধ তৃপ্তির সমস্যা হিসাবে চিহ্নিত করা এবং অনুসন্ধানের স্থান হ্রাস করার জন্য বিভিন্ন হিউরিস্টিক্সের সাথে ব্যাকট্র্যাকিংয়ের মাধ্যমে সমাধান করা।

শুরু করতে আমাদের কয়েকটি ইনপুট ফাইলের প্রয়োজন:

  1. ক্রসওয়ার্ড ধাঁধাটির কাঠামো (যা নিম্নলিখিতটির মতো মনে হয়, উদাহরণস্বরূপ, যেখানে '#' ভরাট না হওয়া অক্ষরকে প্রতিনিধিত্ব করে এবং '_' অক্ষরগুলি পূরণ করা প্রতিনিধিত্ব করে)

`

###_####_#
____####_#
_##_#_____
_##_#_##_#
______####
#_###_####
#_##______
#_###_##_#
_____###_#
#_######_#
##_______#    

`

  1. একটি ইনপুট শব্দভাণ্ডার (শব্দের তালিকা / অভিধান) যা থেকে প্রার্থীর শব্দগুলি বেছে নেওয়া হবে (নীচের চিত্রের মতো)।

    a abandon ability able abortion about above abroad absence absolute absolutely ...

এখন সিএসপি সংজ্ঞায়িত করা হয়েছে এবং নিম্নলিখিত হিসাবে সমাধান করা হবে:

  1. ভেরিয়েবলগুলি ইনপুট হিসাবে প্রদত্ত শব্দের (শব্দভাণ্ডার) তালিকা থেকে মানগুলি (অর্থাত্ তাদের ডোমেনগুলি) সংজ্ঞায়িত করা হয়।
  2. প্রতিটি ভেরিয়েবল একটি 3 টি টিউপল দ্বারা প্রতিনিধিত্ব করে: (গ্রিড_কোর্ডিনেট, দিক, দৈর্ঘ্য) যেখানে সমন্বয়টি সংশ্লিষ্ট শব্দের প্রারম্ভকে উপস্থাপন করে, দিকটি অনুভূমিক বা উল্লম্ব হতে পারে এবং দৈর্ঘ্যটি শব্দের দৈর্ঘ্যের হিসাবে সংজ্ঞায়িত করা হয় যা চলক হবে নির্ধারিত.
  3. সীমাবদ্ধতা প্রদত্ত স্ট্রাকচার ইনপুট দ্বারা সংজ্ঞায়িত করা হয়: উদাহরণস্বরূপ, যদি একটি অনুভূমিক এবং উল্লম্ব ভেরিয়েবলের একটি সাধারণ চরিত্র থাকে তবে এটি ওভারল্যাপ (চাপ) বাধা হিসাবে উপস্থাপিত হবে।
  4. এখন, নোডের ধারাবাহিকতা এবং AC3 চাপটি ধারাবাহিকতার অ্যালগরিদমগুলি ডোমেনগুলি হ্রাস করতে ব্যবহার করা যেতে পারে।
  5. তারপরে এমআরভি (নূন্যতম অবশিষ্ট মান), ডিগ্রি ইত্যাদির সাহায্যে সিএসপিতে সমাধান পেতে (যদি এটি উপস্থিত থাকে) সমাধান পেতে ব্যাকট্র্যাকিং করা যায় তবে পরবর্তী অনির্ধারিত ভেরিয়েবলটি নির্বাচন করতে হিউরিস্টিক ব্যবহার করা যেতে পারে এবং এলসিভি (ন্যূনতম সীমাবদ্ধ মান) এর মতো হিউরিস্টিকগুলি ডোমেন- ক্রমটি দ্রুততর করে অ্যালগোরিদম করতে order

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

`
███S████D█
MUCH████E█
E██A█AGENT
S██R█N██Y█
SUPPLY████
█N███O████
█I██INSIDE
█Q███E██A█
SUGAR███N█
█E██████C█
██OFFENSE█

`

নিম্নলিখিত অ্যানিমেশন ব্যাকট্র্যাকিং পদক্ষেপগুলি দেখায়:

এখানে চিত্র বর্ণনা লিখুন

এখানে বাংলা (বাংলা) ভাষার শব্দ-তালিকা সহ আরও একটি রয়েছে:

এখানে চিত্র বর্ণনা লিখুন


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

1

jQuery ক্রসওয়ার্ড ধাঁধা জেনারেটর এবং গেম

আমি এই সমস্যার একটি জাভাস্ক্রিপ্ট / jQuery সমাধান কোড আপ করেছি:

নমুনা ডেমো: http://www.earthfluent.com / ক্রসওয়ার্ড-puzzle- demo.html

সোর্স কোড: https://github.com/HoldOffHunger/jquery-crossword-puzzle-generator

আমি ব্যবহৃত অ্যালগরিদমের উদ্দেশ্য:

  1. গ্রিডে যতটা সম্ভব অব্যবহৃত স্কোয়ারের সংখ্যা হ্রাস করুন।
  2. যথাসম্ভব আন্তঃ-মিশ্র শব্দ রয়েছে।
  3. অত্যন্ত দ্রুত সময়ে গণনা করুন।

উত্পন্ন ক্রসওয়ার্ড ধাঁধা এর প্রদর্শন।

আমি ব্যবহৃত আলগোরিদিম বর্ণনা করব:

  1. যেগুলি একটি সাধারণ চিঠি ভাগ করে দেয় সে অনুযায়ী শব্দগুলি একসাথে ভাগ করুন।

  2. এই গোষ্ঠীগুলি থেকে, একটি নতুন ডেটা স্ট্রাকচারের সেট তৈরি করুন ("ওয়ার্ড ব্লকস"), এটি একটি প্রাথমিক শব্দ (যা অন্য সমস্ত শব্দের মধ্য দিয়ে চলে) এবং তারপরে অন্য শব্দগুলি (যা প্রাথমিক শব্দের মধ্য দিয়ে চলে)।

  3. ক্রসওয়ার্ড ধাঁধাটির খুব উপরের-বাম অবস্থানে এই শব্দ ব্লকগুলির মধ্যে প্রথমটি দিয়ে ক্রসওয়ার্ড ধাঁধাটি শুরু করুন।

  4. ক্রসওয়ার্ড ধাঁধাটির ডান-নীচের বেশিরভাগ অবস্থান থেকে শুরু করে বাক্য অবরুদ্ধ শব্দের জন্য, উপরের দিকে এবং বাম দিকে সরান, যতক্ষণ না ভরাবার জন্য আর কোনও উপলভ্য থাকে না। বাম দিকের চেয়ে উপরে খালি কলামগুলি যদি উপরে থাকে তবে উপরের দিকে সরান এবং বিপরীতে।


@ হোল্ড অফফঞ্জার ক্রসওয়ার্ড কীটি দেখানোর জন্য আপনার কি কোনও পদ্ধতি আছে? বাক্সে ভরা বাক্স?
জন গ্লাজার

@ জোন গ্লেজার: সাধারণত আপনি ক্রসওয়ার্ড কীগুলি নিজেই ফাংশনে প্রেরণ করেন তবে আপনি ক্রসওয়ার্ডটি 2d-অ্যারে হিসাবে অক্ষরে লগ করতে পারেন, ঠিক পরে var crosswords = generateCrosswordBlockSources(puzzlewords);। শুধু এই মানটি লগ কনসোল। ভুলে যাবেন না, গেমটিতে একটি "চিট-মোড" রয়েছে, যেখানে অবিলম্বে মান পেতে আপনি কেবল "উত্তর প্রকাশ করুন" ক্লিক করতে পারেন।
হোল্ডঅফহাঙ্গার

এটি সংলগ্ন "ডাউন" বাক্সগুলির সাথে জায়গাগুলির শব্দগুলি "জুড়ে" জিব্বারিশ সহ ধাঁধা তৈরি করে এবং এর বিপরীতে। স্ট্যান্ডার্ড শব্দের পাজল ভালো কাজ করে না, অথচ তা না ঘনত্ব পূর্ণবিস্তার।
বিউজর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.