ตัวช่วยค้นหาคำ


12

ฉันได้ทำการค้นหาคำเร็ว ๆ นี้และผมคิดว่ามันจะเป็นเช่นนั้นง่ายมากถ้าทุกคำอ่านจากซ้ายไปขวา แต่การเขียนใหม่ทุกบรรทัดต้องใช้ความพยายามอย่างมาก! ดังนั้นฉันกำลังขอรหัสนักกอล์ฟเพื่อช่วย

(ข้อจำกัดความรับผิดชอบ: เรื่องราวข้างต้นอาจหรืออาจไม่ถูกต้องจากระยะไกล)

รหัสของคุณจะใช้กริดสี่เหลี่ยมและส่งออกบรรทัดทั้งหมดผ่านทั้งสองทิศทาง

เอาต์พุตจะต้องประกอบด้วยการหมุนทั้งหมด 8 ตารางของตาราง (cardinals และ diagonals หลัก), 'read off' จากบนลงล่างจากซ้ายไปขวา (ซึ่งหมายความว่า "แถว" ทุกแถวจะถูกทำซ้ำ - ไปข้างหน้าหนึ่งครั้งและอีกครั้งหนึ่งย้อนหลัง)

การแบ่งบรรทัดอาจเป็นช่องว่างหรือตัวแบ่งบรรทัด หากคุณเลือกช่องว่างส่วนการหมุนกริดจะต้องเป็นตัวแบ่งบรรทัด มิฉะนั้นแผนกการหมุนกริดต้องเป็นตัวแบ่งสองบรรทัด

ตัวอย่างการป้อนข้อมูล (นำมาเป็นอาร์เรย์ของอักขระสตริงหลายบรรทัดหรือรูปแบบที่เหมาะสมอื่น ๆ )

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

คำสั่งของการหมุน "อ่านออก" ไม่สำคัญว่าตราบใดที่พระคาร์ดินัลทั้งแปดและ intercardinals หลักจะทำครั้งเดียว

นี่คือดังนั้นรหัสที่สั้นที่สุดจึงชนะ ช่องโหว่มาตรฐานใช้


ตารางมีตัวอักษรตัวพิมพ์ใหญ่หรือเป็น ASCII ที่พิมพ์ได้ทั้งหมดหรือไม่
Denker

เกือบซ้ำกัน (ไม่มีเส้นทแยงมุม) codegolf.stackexchange.com/questions/37940/word-search-puzzle
Digital Trauma

@DigitalTrauma: ไม่ไม่จริง - อันนี้ไม่ขอให้คุณหาคำใด ๆ เลย
Deusovi

คำตอบ:


4

Python 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

คุณเปลี่ยนเมทริกซ์เป็นอย่างไร? (code block 2)
CalculatorFeline

@CatsAreFluffy ฉันได้เพิ่มอีกหนึ่งขั้นตอนในการอธิบาย
Erwan

ฉันค่อนข้างมั่นใจว่าการเปลี่ยนรูปไม่ใช่คำ (แปลง?)
เครื่องคิดเลข

@CatsAreFluffy ^^ โอเคฉันคิดว่ามันชัดเจนว่าภาษาอังกฤษไม่ใช่ภาษาพื้นเมืองของฉัน
Erwan

คำตอบที่ดีมาก!
Timtech

1

MATL 40 ไบต์

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

อินพุตเป็นอาร์เรย์ถ่าน 2 มิติในรูปแบบ Matlab:

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

เอาต์พุตประกอบด้วย "word" แต่ละคำในบรรทัดแยกต่างหาก

ลองออนไลน์!

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.