Python 3.5 menggunakan Numpy, 251 byte:
def r(t,y,z):import numpy;l=numpy.array([[*i.split()]for i in z.split('\n')]);A,B,C,D=t[0],y[0],t[1],y[1];p=[1,-1];a=p[A>B];b=p[C>D];n=range(A,B+a,a);m=range(C,D+b,b);w=[l[:,i][::-1][p]for i,p in zip([[A]*len(m),n][A!=B],[[C]*len(n),m][C!=D])];return w
Mengambil input dalam format berikut:
print(''.join(r((start1,start2),(end1,end2),'''grid''')))
Output dalam format string (mis. APPLE
) Selama fungsinya disebut menggunakan format di atas. Kalau tidak, daftar yang berisi setiap huruf (misalnya ['A','P','P','L','E']
) dikembalikan.
Akan golf lebih dari waktu ke waktu di mana dan kapan saya bisa.
Cobalah secara Online! (Ideone) (Di sini, input diambil sehingga grid dikelilingi dengan tanda kutip ganda ( ""
) dan input pada satu baris, dengan \n
s di antara setiap baris grid. Kemudian, poin disediakan dalam bentuk tuple sederhana, dengan permulaan pada baris kedua, dan akhir pada baris ketiga.)
Kode yang tidak digabungkan dengan Penjelasan
def r(t,y,z):
import numpy
l=numpy.array([[*i.split()]for i in z.split('\n')])
A,B,C,D=t[0],y[0],t[1],y[1]
p=[1,-1]
a=p[A>B]
b=p[C>D]
n=range(A,B+a,a)
m=range(C,D+b,b)
w=[l[:,i][::-1][p]for i,p in zip([[A]*len(m),n][A!=B],[[C]*len(n),m][C!=D])]
return w
Untuk keperluan penjelasan ini, anggaplah program ini dijalankan dengan input ((0,4),(4,0))
dan kisi pertama dari pertanyaan. Di sini, saya akan membahas 2 bagian utama dari kode:
l=numpy.array([[*i.split()]for i in z.split('\n')])
Di sini, l
adalah array numpy yang berisi setiap baris input dalam "daftar" yang terpisah. Misalnya, kisi pertama dalam pertanyaan, yaitu:
A G O A T C A T
E A T M E N O W
W O R D S E A R
A K L L K J H G
N P L F G H F D
A S P L K J H G
O P I L F G H J
T F A S E J K L
mengembalikan array numpy ini:
[['A' 'G' 'O' 'A' 'T' 'C' 'A' 'T']
['E' 'A' 'T' 'M' 'E' 'N' 'O' 'W']
['W' 'O' 'R' 'D' 'S' 'E' 'A' 'R']
['A' 'K' 'L' 'L' 'K' 'J' 'H' 'G']
['N' 'P' 'L' 'F' 'G' 'H' 'F' 'D']
['A' 'S' 'P' 'L' 'K' 'J' 'H' 'G']
['O' 'P' 'I' 'L' 'F' 'G' 'H' 'J']
['T' 'F' 'A' 'S' 'E' 'J' 'K' 'L']]
w=[l[:,i][::-1][p]for i,p in zip([[A]*len(m),n][A!=B],[[C]*len(n),m][C!=D])]
Ini adalah daftar utama dari fungsi di mana semua huruf yang sesuai dengan setiap titik pada grid ditemukan. Di sini, i
berkorespondensi dengan setiap bilangan bulat di n
, yang merupakan objek rentang yang berisi setiap angka dalam rentang start1=>end1+1
dalam peningkatan +1
jika start1<end1
atau -1
jika kebalikannya benar. Namun, i
hanya sesuai dengan ini selama start1
tidak sama end1
. Jika tidak, start1
dikembalikan sebanyak kali dari panjang m
, di mana m
objek rentang berisi setiap bilangan bulat dalam kisaran start2=>end2+1
dengan kondisi yang sama seperti n
, dan p
sesuai dengan setiap bilangan bulat di m
. Yang sedang berkata, mari kita sekarang berjalan melalui langkah demi langkah:
l[:,i]
pada dasarnya mengembalikan vektor baris untuk setiap kolom i
,, dalam array l
,. misalnya, l[:,0]
akan kembali:
['A' 'E' 'W' 'A' 'N' 'A' 'O' 'T']
l[:,1]
akan kembali:
['G' 'A' 'O' 'K' 'P' 'S' 'P' 'F']
seterusnya dan seterusnya. Anda dapat membaca lebih lanjut tentang berbagai cara pengindeksan dalam numpy, termasuk metode ini, di sini .
Kemudian, setelah itu, fungsi membalikkan setiap array yang dikembalikan, menggunakan l[:,i][::-1]
, karena setiap array diindeks dari kiri ke kanan, tetapi karena titik 0,0
di grid masuk di sudut kiri bawah grid, membalikkan setiap array akan mengembalikan nilai indeks seolah-olah mereka sedang dicari dari kanan ke kiri. Misalnya, l[:,0][::-1]
akan kembali:
['T' 'O' 'A' 'N' 'A' 'W' 'E' 'A']
Setelah ini, fungsi kemudian indeks melalui array terbalik untuk nilai indeks yang sesuai dengan p
, yang merupakan surat Anda, dan kemudian menambahkannya ke daftar yang sedang dibuat. Misalnya, l[:,0][::-1][4]
yang sesuai dengan titik (0,4)
, akan kembali A
.
Proses ini terus berulang dan menambahkan nilai-nilai baru ke daftar sampai objek rentang habis.
Setelah semua itu, output, yang daftar w
, akhirnya dikembalikan. Dalam hal ini, itu akan menjadi APPLE
jika dipanggil dengan print(''.join(r((0,4),(4,0),'''The Grid''')))
atau ['A','P','P','L','E']
jika itu disebut tanpa ''.join()
. Either way, itu mengembalikan jawaban yang benar, dan kita selesai!