Auxiliar de pesquisa de palavras

12

Eu venho fazendo buscas da palavra recentemente, e eu pensei que seria tão mais fácil se todas as palavras lidas da esquerda para a direita. Mas reescrever todas as linhas exige muito esforço! Então, estou recrutando jogadores de código para ajudar.

(Isenção de responsabilidade: a história acima pode ou não ser remotamente precisa.)

Seu código pegará uma grade retangular e produzirá todas as linhas através dela nas duas direções.

A saída deve conter todas as 8 rotações da grade (cardeais e diagonais principais), 'lidas' de cima para baixo, da esquerda para a direita. (Isso significa que cada "linha" será duplicada - uma vez para frente e outra para trás.)

As divisões de linha podem ser um espaço ou uma quebra de linha. Se você escolher espaços, as divisões de rotação da grade deverão ser quebras de linha; caso contrário, as divisões de rotação da grade devem ser duas quebras de linha.

Entrada de exemplo (tomada como uma matriz de caracteres, sequência multilinha ou outro formato razoável)

ABCDE
FGHIJ
KLMNO
PQRST

Exemplo de saída (usando a primeira opção para divisões)

ABCDE FGHIJ KLMNO PQRST
E DJ CIO BHNT AGMS FLR KQ P
EJOT DINS CHMR BGLQ AFKP
T OS JNR EIMQ DHLP CGK BF A
TSRQP ONMLK JIHGF EDBCA
P QK RLF SMGA TNHB OIC JD E
PKFA QLGB RMHC SNID TOJE
A FB KGC PLHD QMIE RNJ SO T

A ordem das rotações "lidas" não importa, desde que todos os oito cardeais e intercardeais primários sejam feitos uma vez.

Isso é , então o código mais curto vence. Aplicam-se brechas padrão.

Deusovi
fonte
A grade contém apenas letras maiúsculas ou pode ser todo o ASCII imprimível?
Denker
Quase duplicado (sem as diagonais) codegolf.stackexchange.com/questions/37940/word-search-puzzle
Trauma Digital
@DigitalTrauma: Não, na verdade - este não pede que você encontre nenhuma palavra.
Deusovi 11/03/16

Respostas:

4

Python 3, 181 bytes

def f(s):
 for k in [1,0]*4:
  b=list(zip(*[([' ']*(len(s)-1-n)*k+list(i)+[' ']*n*k)[::-1] for n,i in enumerate(s)]))
  print([' '.join(i).replace(' ','') for i in b])
  if k==0:s=b

Explicação

def f(s):
 for k in [0]*4:                  # loop 4 times, we don't need the index so [0]*4 is shorter than range(4)
  l=len(s)-1                      # number of line

  # rotation of 45°
  a=[(['.']*(l-n)+list(i)+['.']*n)[::-1] for n,i in enumerate(s)]
  # tranform matrice :
  #  ABC      ..ABC      CBA..
  #  DEF  --> .DEF.  --> .FED.
  #  GHI      GHI..      ..IHG
  b=list(zip(*a))                 # transpose 
  #  CBA..      C..
  #  .FED.  --> BF.
  #  ..IHG      AEI
  #             .DH
  #             ..G
  print(' '.join(''.join(i).replace('.','') for i in b))

  # rotation of 90°
  a=[(list(i))[::-1] for n,i in enumerate(s)]
  # tranform matrice :
  #  ABC      CBA
  #  DEF  --> FED
  #  GHI      IHG
  b=list(zip(*a))                 # transpose 
  #  CBA       CFI
  #  FED   --> BEH
  #  IHG       ADG
  print(' '.join(''.join(i) for i in b))
  s=b

Resultados

>>> f(['ABCDE','FGHIJ','KLMNO','PQRST'])
['E', 'DJ', 'CIO', 'BHNT', 'AGMS', 'FLR', 'KQ', 'P']
['EJOT', 'DINS', 'CHMR', 'BGLQ', 'AFKP']
['T', 'OS', 'JNR', 'EIMQ', 'DHLP', 'CGK', 'BF', 'A']
['TSRQP', 'ONMLK', 'JIHGF', 'EDCBA']
['P', 'QK', 'RLF', 'SMGA', 'TNHB', 'OIC', 'JD', 'E']
['PKFA', 'QLGB', 'RMHC', 'SNID', 'TOJE']
['A', 'FB', 'KGC', 'PLHD', 'QMIE', 'RNJ', 'SO', 'T']
['ABCDE', 'FGHIJ', 'KLMNO', 'PQRST']

>>> f(['ABCDEF','GHIJKL','MNOPQR','STUVWX'])
['F', 'EL', 'DKR', 'CJQX', 'BIPW', 'AHOV', 'GNU', 'MT', 'S']
['FLRX', 'EKQW', 'DJPV', 'CIOU', 'BHNT', 'AGMS']
['X', 'RW', 'LQV', 'FKPU', 'EJOT', 'DINS', 'CHM', 'BG', 'A']
['XWVUTS', 'RQPONM', 'LKJIHG', 'FEDCBA']
['S', 'TM', 'UNG', 'VOHA', 'WPIB', 'XQJC', 'RKD', 'LE', 'F']
['SMGA', 'TNHB', 'UOIC', 'VPJD', 'WQKE', 'XRLF']
['A', 'GB', 'MHC', 'SNID', 'TOJE', 'UPKF', 'VQL', 'WR', 'X']
['ABCDEF', 'GHIJKL', 'MNOPQR', 'STUVWX']

com uma saída mais limpa (189 bytes)

j=' '.join
def f(s):
 for k in [1,0]*4:
  b=list(zip(*[([' ']*(len(s)-1-n)*k+list(i)+[' ']*n*k)[::-1] for n,i in enumerate(s)]))
  print(j(j(i).replace(' ','') for i in b))
  if k==0:s=b

.

>>> f(['ABCDE','FGHIJ','KLMNO','PQRST'])
E DJ CIO BHNT AGMS FLR KQ P
EJOT DINS CHMR BGLQ AFKP
T OS JNR EIMQ DHLP CGK BF A
TSRQP ONMLK JIHGF EDCBA
P QK RLF SMGA TNHB OIC JD E
PKFA QLGB RMHC SNID TOJE
A FB KGC PLHD QMIE RNJ SO T
ABCDE FGHIJ KLMNO PQRST
Erwan
fonte
Como você transforma uma matriz? (code block 2)
CalculatorFeline
@CatsAreFluffy eu adicionei mais um passo em explicações
Erwan
Tenho certeza de que transformar não é uma palavra. (transform?)
CalculatorFeline
@CatsAreFluffy ^^ ok, eu acho que era óbvio que o Inglês não é minha língua nativa
Erwan
Resposta muito boa!
Timtech
1

MATL , 40 bytes

t!tP!tP!GXKZyqXI"IZ}w_w2$:"K@2$Xd!]K!XKx

Input é uma matriz de caracteres 2D na notação Matlab:

['ABCDE'; 'FGHIJ'; 'KLMNO'; 'PQRST']

A saída contém cada "palavra" em uma linha separada.

Experimente online!

t          % input 2D char array. Duplicate. The original copy will produce
           % the words left to right when displayed
!          % transpose. This will produce the words up to down
tP!        % duplicate, flip upside down, transpose. This will produce the
           % words right to left
tP!        % Same. This will produce the words down to up 
GXK        % push input again. Copy to clipboard K
Zy         % get size (length-2 vector; [4 5] in the example)
q          % decrement by 1 (gives  [3 4] in the example)
XI         % copy to clipboard I
"          % loop: do this twice, consuming the decremented length-2 vector
  I        %   push decremented size vector again
  Z}       %   split into its two elements (pushes 3 and 4 in the example)
  w_w      %   swap, negave, swap (results in -3, 4 in the example)
  2$:      %   binary range: indices of diagonals  ([-3 -2 -1 0 1 2 3 4]
           %   in the first iteration in the example, [-4 -3 -2 -1 0 1 2 3]
           %   in the second)
  "        %   for each
    K      %     push input (first iteration) or its tranposed version (second)
    @      %     push index of diagonal
    2$Xd!  %     extract that diagonal as a row vector
  ]        %   end for each
  K!XKx    %   update clipboard K with transposed version for next iteration
           % end loop. Display
Luis Mendo
fonte