शब्द खोज सॉल्वर


13

मैं कल सोच में पड़ गया कि क्या मैं दिए गए शब्द खोज के माध्यम से कंघी करने और उत्तरों को आउटपुट करने के लिए एक कार्यक्रम लिख सकता हूं। यह वास्तव में आश्चर्यजनक रूप से आसान था। अब मुझे आश्चर्य है कि हम कितना छोटा हो सकते हैं।

नियम

  • आपका पहला इनपुट एक स्ट्रिंग या n लाइनों का संग्रह है, जिनमें से प्रत्येक n वर्ण लंबा है
  • आपका दूसरा इनपुट पहेली में खोजने के लिए किसी भी प्रारूप में शब्दों की एक सूची है
  • खोज सूची में सभी शब्द पहेली में होने की गारंटी है
  • शब्द चार कार्डिनल दिशाओं में से किसी में भी उन्मुख हो सकते हैं, साथ ही तिरछे दोनों आगे और पीछे
  • केवल अपरकेस AZ अक्षर पहेली में मौजूद होंगे
  • आपके कोड को खोज स्ट्रिंग में प्रत्येक शब्द मिलना चाहिए, और प्रारंभिक अक्षर के समन्वय की स्थिति को आउटपुट करना चाहिए, जहां 0,0 शीर्ष बाएं वर्ण है।
  • इस घटना में कि आप एक ही शब्द के एक से अधिक उदाहरणों का पता लगाते हैं, आप इसे अपनी पसंद के अनुसार संभाल सकते हैं। इसे कई बार आउटपुट करें, या केवल एक बार, यह आपके ऊपर है

उदाहरण / परीक्षण मामले

निम्नलिखित बोर्ड को देखते हुए:

ABCD
EFGH
IJKL
MNOP

और निम्नलिखित खोज स्ट्रिंग:

ABCD,CGKO,POMN,NJF,AFKP,CFI,LGB,MJGD

आपके कार्यक्रम को निम्न, किसी भी क्रम में आउटपुट करना चाहिए:

ABCD at 0,0
CGKO at 0,2
PONM at 3,3
NJF at 3,1
AFKP at 0,0
CFI at 0,2
LGB at 2,3
MJGD at 3,0

हमेशा की तरह, सबसे छोटा जवाब जीत जाता है


6
PPCG में आपका स्वागत है! अच्छी पहली चुनौती!
AdmBorkBork

2
इसी तरह , केवल वास्तविक अंतर आउटपुट में स्थान का समावेश प्रतीत होता है।
FryAmTheEggman

@ NL628 हां, सभी खोज शब्द पहेली में होने की गारंटी है। यदि एक से अधिक घटनाएँ हैं, तो आप इसे या तो दोनों समय आउटपुट कर सकते हैं या दूसरे को अनदेखा कर सकते हैं, यह आपके ऊपर है।
मोर्फेन

@ जोनाथनअलन महान विचार। जैसा आपने सुझाव दिया था मैं उसे अपडेट करूंगा।
मोर्फन

1
@ रिक्शेकॉक हाँ यह चाहिए :)
morpen

जवाबों:


4

जावास्क्रिप्ट (Node.js) , 154 152 150 141 बाइट्स

  • 2 बाइट्स कम करने के लिए अरनॉल्ड का धन्यवाद

स्थानों की रिटर्न सरणी (यह पहले नई लाइनों के साथ एक स्ट्रिंग थी)

(b,w)=>w.map(s=>[...b].map((_,p)=>[1,-1,r=b.search`
`,-r,~r,++r,-~r,~r].map(d=>[...s].every((c,i)=>c==b[p+d*i])?s+=" at "+[p/r|0,p%r]:0))&&s)

इसे ऑनलाइन आज़माएं!


3

पायथन 2 , 213 बाइट्स

lambda a,W:[(w,i,j)for w in W for i in R(L(a))for j in R(L(a[0]))for U in R(9)if U-4and g(i,j,U/3-1,U%3-1,a).find(w)==0]
g=lambda i,j,u,v,a,s='':L(a)>i>=0<=j<L(a[0])and g(i+u,j+v,u,v,a,s+a[i][j])or s
L=len;R=range

इसे ऑनलाइन आज़माएं!

gएक प्रारंभिक स्थान i,jऔर एक दिशा लेता है u,vऔर पुनरावृत्ति के माध्यम से उस दिशा में उस स्थान पर शुरू होने वाले स्ट्रिंग को निकालता है।

fफिर प्रत्येक प्रारंभिक स्थान i,jऔर दिशा का दौरा U/3-1,U%3-1करता है और प्रत्येक शब्द wको यह देखने के लिए जांचता है कि क्या परिणामी स्ट्रिंग शुरू होता है w


2

पायथन 3 , 149 147 बाइट्स

def g(b,w):h=b.find('\n')+1;return[f'{y} at {i//h},{i%h}'for y in w for i in range(len(b))for d in(1,h+1,h,h-1,-1,~h,-h,1-h)if y==b[i::d][:len(y)]]

इसे ऑनलाइन आज़माएं!

अनप्लग्ड संस्करण

def g(b,w):
    h = b.find('\n') + 1                              # width of a row plus the '\n'
    a = []
    for y in w:                                       # iterate over the words
        for i in range(len(b)):                       #   iterate over the game board
            for d in(1,h+1,h,h-1,-1,~h,-h,1-h):       #     for each possible direction
                if y==b[i::d][:len(y)]:               #       see if the word matches
                    a.append(f'{y} at {i//h},{i%h}')
    return a

मुख्य विचार यह है कि b[i::d]गेम बोर्ड से एक स्लाइस का चयन करें। टुकड़ा स्थिति के रूप में शुरू होता है iऔर दिशा में फैलता है d। उदाहरण के लिए, d = h+1दक्षिण-पूर्व विकर्ण से मेल खाती है, जबकि d = ~h, जो जैसा है -h-1, वह उत्तर-पश्चिमी विकर्ण से मेल खाती है। [:len(y)] खोजा जा रहा है शब्द के रूप में एक ही लंबाई में बंद टुकड़ा।

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