मिनिमल बोगल जैसी व्यवस्था


14

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

इस शब्द MISSISSIPPIको केवल 6 क्यूब्स का उपयोग करके व्यवस्थित किया जा सकता है। यहाँ एक संभव व्यवस्था है:

 S
MIS
 PP

पर प्रारंभ हो Mहम बार-बार किसी भी कदम, क्षैतिज, सीधा या तिरछे जब तक पूरे शब्द बाहर वर्तनी है ले लो।

हैरानी की बात है, एक लंबे वाक्यांश की तरह AMANAPLANACANALPANAMAभी केवल 6 क्यूब्स की जरूरत है:

MAN
PLC

हालांकि, क्यूब्स की न्यूनतम संख्या अधिक समय के लिए आवश्यक है, अधिक जटिल तार हमेशा स्पष्ट नहीं होते हैं।

चुनौती

एक प्रोग्राम लिखें जो एक स्ट्रिंग में लेता है और इसे इस बोगल-जैसे फैशन में व्यवस्थित करता है जैसे कि न्यूनतम संख्या में क्यूब्स का उपयोग किया जाता है । (परिणामस्वरूप ग्रिड के आयाम और खाली कोशिकाओं की संख्या अप्रासंगिक है।)

मान लें कि आपके पास अंतरिक्ष (हेक्स कोड 21 से 7 ई) को छोड़कर प्रत्येक मुद्रण योग्य एएससीआईआई चरित्र के लिए असीमित संख्या में क्यूब्स हैं , क्योंकि यह एक खाली ग्रिड सेल के रूप में उपयोग किया जाता है। केवल मुद्रण योग्य ASCII तार (रिक्त स्थान के बिना) इनपुट होंगे।

इनपुट को स्टडिन या कमांड लाइन से लिया जाना चाहिए। आउटपुट को स्टडआउट (या निकटतम विकल्प) पर जाना चाहिए।

आउटपुट में नए सिरे और रिक्त स्थान को छोड़ना या पीछे चलना ठीक है (लेकिन उम्मीद है कि कोई अशुभ राशि नहीं है)।

खोज स्थान तेजी से ऊपर उठता है क्योंकि स्ट्रिंग लंबी हो जाती है, लेकिन आपको अपने एल्गोरिथ्म को कुशल बनाने के लिए प्रयास करने की आवश्यकता नहीं है (हालांकि यह अच्छा होगा :))। यह कोड-गोल्फ है, इसलिए बाइट्स में सबसे छोटा समाधान जीतता है।

उदाहरण

यदि इनपुट Oklahoma!(8 वर्ण न्यूनतम) थे, तो ये सभी वैध आउटपुट होंगे क्योंकि सभी में बिल्कुल 8 भरे हुए ग्रिड सेल हैं और वे (संशोधित) बोगल रीडिंग पैटर्न का पालन करते हैं:

Oklaho
   !m

या

  !
Oamo
klh

या

   lkO   
  !amo              
    h    

आदि।


4
यह एक कठिन अनुकूलन समस्या की तरह लगता है। मुझे लगता है कि यह एक अच्छा कोड चुनौती बना होगा।
मार्टिन एंडर

1
मैं संपादित नहीं कर सकता क्योंकि कम-प्रतिनिधि उपयोगकर्ता से एक लंबित संपादन है, लेकिन मिसिसिपी में दो डबल-एस हैं।
पीटर टेलर

केस सेंसिटिविटी के बारे में क्या?
गौरवशाली हेकेलर

1
@proudhaskeller मुझे यकीन है कि इनपुट असंवेदनशील है, क्योंकि: 1) इनपुट सिर्फ किसी भी मुद्रण योग्य ASCII 2 है) ओपी ने अन्यथा 3 का उल्लेख नहीं किया है) यदि इनपुट असंवेदनशील था, तो ओक्लाहोमा उदाहरण कम से कम नहीं होगा।
मार्टिन एंडर

@ MartinBüttner मुझे लगता है कि आप का मामला संवेदनशील था
Ypnypn

जवाबों:


5

अजगर 342 355 398

R=(-1,0,1)
A=[];b={}
def s(w,x,y):
 if w: # not at the end of the word yet?
  for I in R: # search adjacent squares
   for j in R:
    if I|j: # skip the square we are on
     i=I+x;j+=y;c=b.get((i,j)) # get square in board
     if c==w[0]:s(w[1:],i,j) # square is what we are looking for?
     elif not c:b[i,j]=w[0];s(w[1:],i,j);del b[i,j] # we can set square?
 else:A.append(dict(b)) # all solutions
s(raw_input(),9,9) # run the search
A=min(A,key=len) # A is now the shortest solution
C=sum(map(list,A),[]) # put all board coords together
C=range(min(C),max(C)+1) # find the board biggest square bound
for r in C:print"".join(A.get((c,r)," ") for c in C)

चार स्थानों पर इंडेंट वास्तव में एक टैब कैरेक्टर है।

AMANAPLANACANALPANAMA:

MC 
NA 
PL

MISSISSIPPI:

S  
SI 
PPM

Oklahoma!:

oh    
 ma   
 ! l  
    k 
     O

Llanfairpwllgwyngyllहै घातक ;)


अब अच्छा लग रहा है, बस बहुत धीमी गति से: /
केल्विन के शौक

1
आप को हटाने के द्वारा यह थोड़ा छोटा कर सकते हैं import sysऔर जगह sys.argv[1]के साथ raw_input()
केल्विन के शौक 20

@ Calvin'sHobbies THX फिर से, साफ टिप :) एक प्रारंभिक प्राप्त करने के लिए बाहर तुम सिर्फ बदल सकते हैं elifकरने के लिए elif not c and (not A or len(b)<len(A[-1])):और यह तेजी से एक बहुत चलाता है
विल

1
यदि "Oklahoma!"ठीक इनपुट है, तो आप input()इसके बजाय बस का उपयोग कर सकते हैं raw_input()
फ्राईअमईमैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.