Поиск слова


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 Да, это должно быть :)
morpen

Ответы:


4

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

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

Питон 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.