Pomocnik wyszukiwania słów

12

Ostatnio szukałem słów i pomyślałem, że byłoby o wiele łatwiej, gdyby wszystkie słowa były czytane od lewej do prawej. Ale przepisanie wszystkich wierszy wymaga dużo wysiłku! Pozyskuję więc golfistów z kodem do pomocy.

(Zastrzeżenie: powyższa historia może być, ale nie musi, być bardzo dokładna).

Twój kod pobierze prostokątną siatkę i wyprowadzi przez nią wszystkie linie w obu kierunkach.

Dane wyjściowe muszą zawierać wszystkie 8 obrotów siatki (kardynały i główne przekątne), „odczyt” od góry do dołu, od lewej do prawej. (Oznacza to, że każdy „wiersz” zostanie zduplikowany - raz do przodu i raz do tyłu.)

Podziały linii mogą być spacją lub podziałem linii. Jeśli wybierzesz spacje, podziały obrotu siatki muszą być podziałami linii; w przeciwnym razie podziały obrotu siatki muszą być dwoma podziałami linii.

Przykładowe dane wejściowe (traktowane jako tablica znaków, łańcuch wielowierszowy lub inny rozsądny format)

ABCDE
FGHIJ
KLMNO
PQRST

Przykładowe dane wyjściowe (przy użyciu pierwszej opcji dla działów)

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

Kolejność „odczytu” rotacji nie ma znaczenia, dopóki wszystkie osiem kardynałów i pierwotne interkardalale zostaną wykonane raz.

To jest , więc wygrywa najkrótszy kod. Obowiązują standardowe luki.

Deusovi
źródło
Czy siatka zawiera tylko wielkie litery, czy może to być cały drukowany kod ASCII?
Denker,
Prawie duplikat (bez przekątnych) codegolf.stackexchange.com/questions/37940/word-search-puzzle
Digital Trauma
@DigitalTrauma: Nie, niezupełnie - ten w ogóle nie wymaga od ciebie szukania słów.
Deusovi,

Odpowiedzi:

4

Python 3, 181 bajtów

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

Wyjaśnienie

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

Wyniki

>>> 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']

z czystszym wyjściem (189 bajtów)

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
źródło
Jak przekształcić macierz? (blok kodu 2)
CalculatorFeline
@CatsAreFluffy Dodałem jeszcze jeden krok w wyjaśnieniach
Erwan
Jestem pewien, że tranforme nie jest słowem. (przekształcać?)
CalculatorFeline
@CatsAreFluffy ^^ ok, myślę, że było oczywiste, że angielski nie jest moim językiem ojczystym
Erwan
Bardzo ładna odpowiedź!
Timtech,
1

MATL , 40 bajtów

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

Dane wejściowe to tablica znaków 2D w notacji Matlab:

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

Wynik zawiera każde „słowo” w osobnym wierszu.

Wypróbuj 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
źródło