Kelime Arama Çözücü


13

Dün belirli bir kelime aramasıyla taramak ve cevapları çıkarmak için bir program yazıp yazamayacağımı merak ettim. Aslında şaşırtıcı derecede kolaydı. Şimdi ne kadar küçük olabileceğimizi merak ediyorum.

kurallar

  • İlk girişiniz, her biri n karakter uzunluğunda bir dize veya n satırlık koleksiyon
  • İkinci girişiniz, bulmacanın içinde bulmak için herhangi bir formattaki kelimelerin bir listesidir
  • Arama listesindeki tüm kelimelerin bulmacada olması garanti edilir
  • Kelimeler dört ana yönün herhangi birinde yönlendirilebilir, hem çapraz olarak hem ileri hem de geri olabilir
  • Bulmacada sadece büyük harf AZ karakterleri bulunacak
  • Kodunuz arama dizesindeki her kelimeyi bulmalı ve başlangıç ​​harfinin koordinat konumunu yazmalıdır; burada 0,0, sol üst karakterdir.
  • Aynı kelimenin birden fazla örneğini bulmanız durumunda, kelimeyi istediğiniz gibi işleyebilirsiniz. Birden çok kez veya yalnızca bir kez çıktısını almak size kalmış

Örnekler / Test Örnekleri

Aşağıdaki yönetim kurulu göz önüne alındığında:

ABCD
EFGH
IJKL
MNOP

Ve aşağıdaki arama dizesi:

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

Programınız aşağıdaki sırayla çıktı almalıdır:

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

Her zaman olduğu gibi, en kısa cevap kazanır


6
PPCG'ye Hoşgeldiniz! Güzel ilk meydan okuma!
AdmBorkBork

2
Benzer şekilde , tek gerçek fark, yerin çıktıya dahil edilmesi gibi görünmektedir.
FryAmTheEggman

@ NL628 Evet, tüm arama kelimelerinin bulmacada olması garanti edilir. Birden fazla olay varsa, bunu iki kez çıktılayabilir veya ikincisini yoksayabilirsiniz, size kalmış.
morpen

@JonathanAllan Harika bir fikir. Önerdiğin gibi güncelleyeceğim.
morpen

1
@RickHitchcock Evet olmalı :)
morpen

Yanıtlar:


4

JavaScript (node.js) , 154 152 150 141 bayt

  • 2 bayt azalttığı için Arnauld'a teşekkürler

konum dizisini döndürür (daha önce yeni satırları olan bir dizedir)

(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)

Çevrimiçi deneyin!


3

Python 2 , 213 bayt

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

Çevrimiçi deneyin!

gbir başlangıç ​​konumu i,jve bir yön alır u,vve özyineleme yoluyla o konumdan o yönde başlayan dizgiyi çıkarır.

fdaha sonra her bir başlangıç ​​konumunu i,jve yönü ziyaret U/3-1,U%3-1eder wve elde edilen dizenin başlayıp başlamadığını görmek için her sözcüğü kontrol eder w.


2

Python 3 , 149147 bayt

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)]]

Çevrimiçi deneyin!

Ungolfed sürümü

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

Ana fikir, b[i::d]oyun tahtasından bir dilim seçmesidir. Dilim konum olarak başlar ive yönde uzanır d. Örneğin d = h+1, güneydoğu diyagonaline karşılık gelirken d = ~h, aynı -h-1güneybatı diyagonaline karşılık gelir. [:len(y)] dilimi, aranan sözcükle aynı uzunlukta keser.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.