Kelime Arama Yardımcısı


12

Geçenlerde kelime aramaları yaptığını ve bunu olacağını düşündüm bu yüzden kelimelerin hepsi okursanız çok daha kolay soldan sağa. Ancak tüm satırları yeniden yazmak çok çaba gerektirir! Bu yüzden yardımcı olmak için kod golfçüleri yazıyorum.

(Feragatname: Yukarıdaki hikaye uzaktan doğru olabilir veya olmayabilir.)

Kodunuz dikdörtgen bir ızgara alır ve tüm satırları her iki yönde de verir.

Çıktı, ızgaranın 8 rotasyonunun tümünü (kardinaller ve ana köşegenler), yukarıdan aşağıya, soldan sağa 'okumalı' içermelidir. (Bu, her "satırın" bir kez ileri ve bir kez geri çoğaltılacağı anlamına gelir.)

Çizgi bölümleri boşluk veya satır sonu olabilir. Boşluk seçerseniz, ızgara döndürme bölümleri satır kesmeleri olmalıdır; aksi takdirde, ızgara döndürme bölümleri iki satır sonu olmalıdır.

Örnek giriş (bir karakter dizisi, çok satırlı dize veya başka bir makul biçim olarak alınır)

ABCDE
FGHIJ
KLMNO
PQRST

Örnek çıktı (bölümler için ilk seçeneği kullanarak)

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

"Okuma" rotasyonlarının sırası, sekiz kardinalin ve primer intercardinalin bir kez yapıldığı sürece önemli değildir.

Bu , bu yüzden en kısa kod kazanır. Standart boşluklar geçerlidir.


Izgara yalnızca büyük harf içeriyor mu yoksa yazdırılabilir ASCII'nin tamamı olabilir mi?
Denker


@DigitalTrauma: Hayır, gerçekten değil - bu hiç bir kelime bulmanızı istemiyor.
Deusovi

Yanıtlar:


4

Python 3, 181 bayt

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

açıklama

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

Sonuçlar

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

daha temiz bir çıktı ile (189 bayt)

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

Bir matrisi nasıl tranforme edersiniz? (kod bloğu 2)
CalculatorFeline

@CatsAreFluffy Açıklamalara bir adım daha ekledim
Erwan

Eminim tranforme bir kelime değildir. (transform?)
CalculatorFeline

@CatsAreFluffy ^^ tamam, İngilizce'nin benim ana dilim olmadığı açıktı
Erwan

Çok güzel bir cevap!
Timtech

1

MATL , 40 bayt

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

Giriş, Matlab gösteriminde 2B karakter dizisidir:

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

Çıktı, her bir "sözcüğü" ayrı bir satırda içerir.

Çevrimiçi deneyin!

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.