मैं वर्णों के ग्रिड में मान्य शब्द कैसे पा सकता हूं?


12

मैं टेट्रिस के समान एक गेम बना रहा हूं, जिसमें दो मुख्य अंतर हैं: स्क्रीन पहले से ही टाइलों से भरनी शुरू हो जाती है (जैसे कि निंजा डीएस और पीसी के लिए पहेली क्वेस्ट में) और प्रत्येक व्यक्तिगत टाइल में एक पत्र है। खिलाड़ी का उद्देश्य उनके साथ वैध शब्द बनाकर टाइल्स को खत्म करना है। शब्द एक दूसरे के बगल में, किसी भी दिशा में, तिरछे को छोड़कर अक्षरों को मिलाकर बनते हैं।

खिलाड़ी टाइलों की एक पूरी पंक्ति को बाईं या दाईं ओर या टाइलों के एक पूरे कॉलम को ऊपर या नीचे ले जा सकता है, क्योंकि वह इच्छानुसार कई रिक्त स्थान (यदि एक पंक्ति / स्तंभ का आंदोलन बोर्ड की सीमा से अधिक है, तो) वह अक्षर जो सीमा पार कर जाएगा "चक्र", पंक्ति / स्तंभ के दूसरे छोर पर दिखाई देगा)। खिलाड़ी की कार्रवाई के बाद, खेल को पूरे बोर्ड को मान्य शब्दों की तलाश करने और उन शब्दों को हटाने के लिए जांचना चाहिए जो बोर्ड से उन शब्दों को बनाते हैं। हटाए गए अक्षरों के ऊपर के अक्षर उन अक्षरों के स्थान पर नीचे गिर जाएंगे जिन्हें हटा दिया गया था और नए अक्षर स्क्रीन के ऊपर से तब तक गिरेंगे जब तक बोर्ड फिर से भर नहीं जाता।

मैंने पहले से ही एक रैखिक एल्गोरिथ्म लिखा है, जो वर्णों का एक क्रम देता है, यह निर्धारित करता है कि क्या यह एक वैध अंग्रेजी शब्द है। मेरे पास जो समस्या है वह यह है: मैं बोर्ड पर मान्य शब्दों की जांच कैसे कर सकता हूं? क्या पाशविक बल एकमात्र तरीका है? बोर्ड से सभी संभावित संयोजनों का परीक्षण करना यह देखने के लिए कि क्या वे वैध हैं, बहुत धीमी गति से, यहां तक ​​कि एक छोटे (5x5) बोर्ड के लिए भी। किसी भी मदद की बहुत सराहना की जाएगी, धन्यवाद!


दुर्भाग्य से, आप सही हैं। यह बहुत धीमी है, संख्याओं के कारण (3, 4, 5, ... 25 अक्षरों के सभी संयोजन)। हो सकता है कि इसे प्रदर्शन को बेहतर बनाने के लिए "शब्दों को क्षैतिज या लंबवत रूप से पंक्तिबद्ध होना चाहिए" (और यादृच्छिक शब्द जो खिलाड़ी ने नहीं देखा था) प्राप्त करने के लिए इसे प्रतिबंधित करें?
ashes999

मुझे लगता है कि आपको अपने एल्गोरिथ्म पर फिर से देखने की जरूरत है जो शब्दों के पात्रों के अनुक्रम से मेल खाता है। मेरी गिनती से 5x5 ग्रिड में 2700 संभावित शब्द होंगे, जिसे आपके एल्गोरिथ्म को उड़ाना चाहिए, उदाहरण के लिए जोश का जवाब देखें।
तैमूर

मैं 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 । पंक्तियों और दिशाओं की संख्या से गुणा करें; १३५ * ५ * ४ = २
--००

मुझे लगता है कि मैंने इसे स्पष्ट नहीं किया, लेकिन शब्दों को किसी भी दिशा में बनाया जा सकता है, तिरछे को छोड़कर, और यहां तक ​​कि कोने भी बनाते हैं (उदाहरण के लिए, पहली पंक्ति से पहली टाइल, फिर पहली पंक्ति पर दाईं ओर दूसरी टाइल, इसके बाद दूसरी पंक्ति में नीचे से टाइल)।
तिवियो

@Tavio कुछ विचार: जाँच पहले शब्दों को लंबा करना चाहिए (यदि मैं "एक तरफ" "मैं नहीं चाहता हूँ" "के रूप में" भी। इसके अलावा, एकल अक्षर शब्दों को नजरअंदाज किया जा सकता है, अन्यथा आप किसी भी का उपयोग नहीं कर पाएंगे। जब मैं समाप्त हो जाता हूं, तो मैं आपको इस खेल को नाम देना चाहता हूं ताकि मैं इसे देख
सकूं

जवाबों:


22

पाशविक बल ही एकमात्र रास्ता नहीं है।

अपने गेम बोर्ड को हल करना बोगल बोर्ड को हल करने के समान है , सिवाय सरल के। आप बोर्ड में प्रत्येक टाइल की जांच करना चाहते हैं, यह देखने के लिए कि क्या कोई शब्द है जो उपयुक्त दिशाओं के साथ बनाया जा सकता है।

यदि आप जानते हैं कि आप एक शब्द नहीं बना सकते हैं तो भी आप अपने खोज स्थान को और अधिक परिष्कृत करना चाहेंगे ताकि आप किसी दिशा में खोज करने से परेशान न हों। उदाहरण के लिए, यदि आप qएक पंक्ति में दो एस पाते हैं, तो आपको गर्भपात करना चाहिए। उस अंत तक, आप कुछ प्रकार की डेटा संरचना चाहते हैं जो आपको यह बताने की अनुमति देती है कि क्या वर्णों का एक सेट एक मान्य शब्द का उपसर्ग है। इसके लिए, आप एक तिकड़ी , या उपसर्ग वृक्ष का उपयोग कर सकते हैं ; इस तरह की समस्याओं को हल करते समय एक उपयोगी डेटा संरचना।

एक उपसर्ग वृक्ष एक श्रेणीबद्ध नोड-आधारित संरचना है, जहां प्रत्येक नोड अपने बच्चों के कुछ उपसर्ग का प्रतिनिधित्व करता है, और पत्ती नोड्स (आम तौर पर) अंतिम मूल्यों का प्रतिनिधित्व करता है। उदाहरण के लिए, यदि आपके मान्य शब्दों के शब्दकोश में "बिल्ली," "कार," और "सेल" शामिल हैं, तो एक त्रिकोणीय दिख सकता है:

    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

इस प्रकार, अपने खेल में प्रत्येक वैध शब्द के साथ एक उपसर्ग वृक्ष को भरने से शुरू करें।

किसी भी समय बोर्ड पर मान्य शब्द खोजने की वास्तविक प्रक्रिया में बोर्ड पर प्रत्येक टाइल से एक पुनरावर्ती खोज शुरू करना शामिल होगा। चूँकि कुछ दिए गए टाइल पर शुरू होने वाले बोर्ड स्पेस के माध्यम से प्रत्येक खोज स्वतंत्र है, इनको जरूरत पड़ने पर समानांतर किया जा सकता है। जैसा कि आप खोज करते हैं, आप जिस दिशा में खोज रहे हैं, उस अक्षर के मूल्य के आधार पर उपसर्ग वृक्ष का "अनुसरण" करते हैं।

आप अंततः एक ऐसे बिंदु पर पहुंच जाएंगे जहां आसपास के कोई भी अक्षर आपके वर्तमान उपसर्ग वृक्ष नोड के बच्चे नहीं हैं। जब आप उस बिंदु पर पहुंचते हैं, अगर यह भी सच है कि वर्तमान नोड एक पत्ती है, तो आपको एक वैध शब्द मिला है। अन्यथा, आपको एक वैध शब्द नहीं मिला है और आप खोज को रद्द कर सकते हैं।

उदाहरण कोड और इस तकनीक की एक चर्चा (और अन्य, जैसे कि एक गतिशील प्रोग्रामिंग समाधान जो कि फैशन के बाद खोज स्थान "inverting" से भी तेज हो सकता है) इस साथी के ब्लॉग पर पाया जा सकता है ; वह बोगल को हल करने के बारे में चर्चा करता है, लेकिन आपके खेल के समाधानों को अपनाना कम या ज्यादा बदलने की बात है कि आप किन दिशाओं में खोज करने की अनुमति देते हैं।


ब्रूट फोर्स एकमात्र तरीका नहीं है जैसे आपने खुद को समझाया। :) बहुत सारे उपसर्ग हैं जो संकेत देते हैं कि तलाश जारी रखने का कोई मतलब नहीं है। (अधिकांश [यादृच्छिक] तार शब्द नहीं हैं। +1
अट्टुरसम्स

बहुत बढ़िया जवाब। एक "शब्द" खेल के शब्दकोश में कुछ भी है पूर्ण विराम।
एडम एबेरबेक

ओपी बताता है कि उसके पास एक चरित्र स्ट्रिंग के लिए शब्द से मेल करने के लिए एक एल्गोरिथ्म है। इसलिए मुझे नहीं लगता कि यह सवाल का जवाब देता है।
तैमूर

ओटोह मुझे लगता है कि ओपी वर्तमान में जो कुछ भी है उससे अधिक कुशल स्ट्रिंग मिलान एल्गोरिदम चाहेगा।
तैमूर

1
@ तिकड़ी सादे त्रि का उपयोग करके, हाँ। लेकिन एक अहो-कोरासिक एल्गोरिथ्म का उपयोग किया जा सकता है जो थोड़ा संशोधित तिकड़ी का उपयोग करता है वह अधिक प्रभावी (रैखिक) है। अहो-कोरासिक एल्गोरिथ्म के साथ ओ (n ^ 2) समय में nxn मैट्रिक्स में सभी मान्य शब्द मिल सकते हैं।
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.

या, psudo कोड में

// 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' + 1C में करते हैं):

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

आप एक निश्चित आकार के सभी पदार्थों पर जल्दी से दौड़ सकते हैं:

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 अक्षरों तक सबस्ट्रिंग की जांच कर सकते हैं।

यदि आपके शब्दकोश में एक हैश कोड मौजूद है, तो आप शब्द को वहां से जल्दी से खींच सकते हैं क्योंकि हैश कोड इस तरह अद्वितीय हैं। जब आप अधिकतम 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

यह प्रत्येक टाइल पर एक मानचित्र तैयार करेगा जिसमें यह जानकारी होगी कि यह टाइल ग्रिड में उसके चारों ओर के शब्दों से कैसे जुड़ी है। जब एक स्तंभ या पंक्ति को ले जाया जाता है, तो सभी टाइलों की जांच करें, या आंदोलन से सटे हैं और जानकारी को पुनर्गणना करते हैं। जब आप एक शब्द पाते हैं, और उस शब्द में कोई और टाइल नहीं जोड़ी जा सकती है; इसे हटा दो। मुझे यकीन नहीं है कि अगर यह तेज हो जाएगा, तो यह वास्तव में उबल जाता है कि कितने शब्द आधे से बने हैं। इसका लाभ यह है कि उपयोगकर्ता बोर्ड पर आधे पूर्ण शब्द से एक शब्द बनाने की कोशिश कर रहा है। इन सभी शब्दों को संग्रहीत करके, यह जांचना आसान है कि क्या एक शब्द पूरा हो गया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.