โปรแกรมค้นหาคำ


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 ใช่คำค้นหาทั้งหมดรับประกันว่าจะอยู่ในปริศนา หากมีมากกว่าหนึ่งเกิดขึ้นคุณสามารถส่งออกมันทั้งสองครั้งหรือไม่สนใจมันที่สองก็ขึ้นอยู่กับคุณ
morpen

@JanathanAllan ความคิดที่ดี ฉันจะอัปเดตตามที่คุณแนะนำ
morpen

1
@RickHitchcock ใช่แล้ว :):
พ.ย.

คำตอบ:


4

JavaScript (Node.js) , 154 152 150 141 ไบต์

  • ขอบคุณ Arnauld สำหรับการลดขนาด 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

Python 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

Python 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)] ตัดส่วนที่ความยาวเท่ากับคำที่ค้นหา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.