단어 검색 해결사


13

어제 주어진 단어 검색을 통해 빗질하고 답을 출력하는 프로그램을 작성할 수 있는지 궁금해졌습니다. 실제로 놀라 울 정도로 쉬웠다. 이제 우리가 얼마나 작은 지 궁금합니다.

규칙

  • 첫 번째 입력은 n 줄의 문자열 또는 모음이며, 각 줄의 길이는 n 자입니다
  • 두 번째 입력은 퍼즐에서 찾을 수있는 모든 형식의 단어 목록입니다
  • 검색 목록에있는 모든 단어는 퍼즐 안에 있어야합니다
  • 단어는 4 개의 기본 방향 중 하나를 향할 수 있으며 대각선 방향으로 앞뒤로
  • 퍼즐에는 대문자 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

답변:



3

파이썬 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 , 149147 바이트

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.