단어 검색 도우미


12

최근에 단어 검색을 해왔으며 모든 단어를 왼쪽에서 오른쪽으로 읽는 것이 훨씬 쉬울 것이라고 생각 했습니다. 그러나 모든 줄을 다시 쓰려면 많은 노력이 필요합니다! 그래서 저는 코드 골퍼들을 도와 주려고합니다.

(면책 조항 : 위의 이야기는 원격으로 정확하거나 정확하지 않을 수 있습니다.)

코드는 직사각형 그리드를 취해 모든 라인을 양방향으로 출력합니다.

출력은 그리드의 8 회전 (카디널 및 메인 대각선)을 모두 포함해야합니다. 이것은 모든 "행"이 한 번 앞으로, 한 번 뒤로 복제됨을 의미합니다.

줄 바꿈은 공백이거나 줄 바꿈 일 수 있습니다. 공백을 선택하면 그리드 회전 분할 선이 줄 바꿈이어야합니다. 그렇지 않으면 그리드 회전 분할 선이 두 개의 줄 바꿈이어야합니다.

입력 예 (문자 배열, 여러 줄 문자열 또는 기타 합리적인 형식으로 취함)

ABCDE
FGHIJ
KLMNO
PQRST

출력 예 (나눗셈에 첫 번째 옵션 사용)

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

8 회 추기경과 1 차 심 내막이 모두 한 번만 수행되는 한 "읽기"회전 순서는 중요하지 않습니다.

이것은 이므로 가장 짧은 코드가 승리합니다. 표준 허점이 적용됩니다.


격자에 대문자 만 포함되어 있거나 전체 인쇄 가능한 ASCII 일 수 있습니까?
Denker


@DigitalTrauma : 아니요, 실제로는 아닙니다.이 단어는 전혀 단어를 찾지 않아도됩니다.
Deusovi

답변:


4

파이썬 3, 181 바이트

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

설명

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

결과

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

더 깨끗한 출력 (189 바이트)

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

행렬을 어떻게 변환합니까? (코드 블록 2)
CalculatorFeline

@CatsAreFluffy 한 단계 더 설명을 추가했습니다
Erwan

나는 tranforme이 단어가 아니라고 확신합니다. (변형?)
CalculatorFeline

@CatsAreFluffy ^^ 좋아, 영어가 모국어가 아니라는 것이 분명하다고 생각한다
Erwan

아주 좋은 답변입니다!
Timtech

1

MATL , 40 바이트

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

입력은 Matlab 표기법의 2D 문자 배열입니다.

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

출력에는 각 "단어"가 별도의 줄에 포함됩니다.

온라인으로 사용해보십시오!

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.