Пошук рішень для пошуку слів


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

@JonathanAllan Чудова ідея. Я оновлю його, як ви запропонували.
morpen

1
@RickHitchcock Так, це повинно :)
1818

Відповіді:



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)] відрізає шматочок на тій же довжині, що і слово, яке шукають.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.