Python 3.5 usando Numpy, 251 bytes:
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
Toma entrada en el siguiente formato:
print(''.join(r((start1,start2),(end1,end2),'''grid''')))
Salidas en el formato de una cadena (p APPLE
. Ej. ) Siempre que se llame a la función utilizando el formato anterior. De lo contrario, ['A','P','P','L','E']
se devuelve una lista que contiene cada letra (por ejemplo ).
Jugaré más golf con el tiempo donde y cuando pueda.
¡Pruébelo en línea! (Ideone) (Aquí, la entrada se toma de tal manera que la cuadrícula se rodea con comillas dobles ( ""
) y la entrada en una línea, con \n
s entre cada línea de la cuadrícula. Luego, los puntos se proporcionan en forma de tupla simple, con el inicio en la segunda línea y el final en la tercera).
Código no reflejado junto con la explicación
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
A los fines de esta explicación, suponga que este programa se ejecutó con las entradas ((0,4),(4,0))
y la primera cuadrícula de la pregunta. Aquí, revisaré las 2 partes principales del código:
l=numpy.array([[*i.split()]for i in z.split('\n')])
Aquí, l
hay una matriz numpy que contiene cada línea de la entrada en una "lista" separada. Por ejemplo, la primera cuadrícula de la pregunta, que es:
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
devuelve esta matriz numpy:
[['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])]
Esta es la lista principal de la función en la que se encuentran todas las letras correspondientes a cada punto de la cuadrícula. Aquí, i
corresponde a cada número entero en n
, que es un objeto de rango que contiene cada número en el rango start1=>end1+1
en incrementos de +1
si start1<end1
o -1
si lo contrario es cierto. Sin embargo, i
solo corresponde a esto siempre que start1
no sea igual end1
. De start1
lo contrario, se devuelve tantas veces como la longitud de m
, donde m
es un objeto de rango que contiene cada número entero en el rango start2=>end2+1
con las mismas condiciones que n
, y p
corresponde a cada número entero en m
. Dicho esto, pasemos ahora por este paso a paso:
l[:,i]
básicamente devuelve un vector fila para cada columna, i
en la matriz, l
. por ejemplo, l[:,0]
devolvería:
['A' 'E' 'W' 'A' 'N' 'A' 'O' 'T']
l[:,1]
volvería:
['G' 'A' 'O' 'K' 'P' 'S' 'P' 'F']
Y así sucesivamente. Puede leer más sobre las diferentes formas de indexación en numpy, incluido este método, aquí .
Luego, después de eso, la función invierte cada matriz devuelta, usando l[:,i][::-1]
, ya que cada matriz está indexada de izquierda a derecha, pero dado que el punto 0,0
en la cuadrícula en la esquina inferior izquierda de la cuadrícula, invertir cada matriz devolvería los valores de índice como si los estuvieran buscando de derecha a izquierda. Por ejemplo, l[:,0][::-1]
devolvería:
['T' 'O' 'A' 'N' 'A' 'W' 'E' 'A']
Después de esto, la función indexa a través de esa matriz invertida para el valor de índice correspondiente a p
, que es su letra, y luego agrega eso a la lista que se está creando. Por ejemplo, l[:,0][::-1][4]
que corresponde al punto (0,4)
, volvería A
.
Este proceso continúa repitiéndose y agregando nuevos valores a la lista hasta que se agoten los objetos de rango.
Después de todo eso, la salida, que es la lista w
, finalmente se devuelve. En este caso, eso sería APPLE
si se llama con print(''.join(r((0,4),(4,0),'''The Grid''')))
o ['A','P','P','L','E']
si se llama sin ''.join()
. De cualquier manera, devuelve la respuesta correcta, ¡y hemos terminado!