Поиск слова

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

Как всегда, самый короткий ответ выигрывает

morpen
источник
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)

Попробуйте онлайн!

DanielIndie
источник
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)] отрезает ломтик на той же длине, что и искомое слово.

RootTwo
источник