Python 3.5 mit 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
Nimmt Eingaben im folgenden Format vor:
print(''.join(r((start1,start2),(end1,end2),'''grid''')))
Ausgaben im Format einer Zeichenfolge (z. B. APPLE
), solange die Funktion im obigen Format aufgerufen wird. Andernfalls wird eine Liste mit jedem Buchstaben (z ['A','P','P','L','E']
. B. ) zurückgegeben.
Wird im Laufe der Zeit mehr Golf spielen, wo und wann ich kann.
Probieren Sie es online aus! (Ideone) (Hier wird die Eingabe so vorgenommen, dass das Raster von doppelten Anführungszeichen ( ""
) umgeben ist, und in einer Zeile mit \n
s zwischen jeder Zeile des Rasters eingegeben . Anschließend werden die Punkte in einer einfachen Tupelform mit dem Start bereitgestellt in der zweiten Zeile und das Ende in der dritten.)
Ungolfed Code zusammen mit Erklärung
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
Für die Zwecke dieser Erklärung wird angenommen, dass dieses Programm mit den Eingaben ((0,4),(4,0))
und dem ersten Raster der Frage ausgeführt wurde. Hier werde ich die 2 Hauptteile des Codes durchgehen:
l=numpy.array([[*i.split()]for i in z.split('\n')])
Hier l
ist ein Numpy-Array, das jede Zeile der Eingabe in einer separaten "Liste" enthält. Zum Beispiel das erste Raster in der Frage:
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
gibt dieses numpy-Array zurück:
[['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])]
Dies ist die Hauptliste der Funktion, in der alle Buchstaben gefunden werden, die jedem Punkt im Raster entsprechen. Entspricht hier i
entweder jeder Ganzzahl in n
, bei der es sich um ein Bereichsobjekt handelt, das jede Zahl im Bereich start1=>end1+1
in Schritten von +1
if enthält start1<end1
oder -1
wenn das Gegenteil der Fall ist. Entspricht i
dies jedoch nur, solange start1
es nicht gleich ist end1
. Andernfalls start1
wird so oft wie die Länge von zurückgegeben m
, wobei m
ein Bereichsobjekt jede Ganzzahl im Bereich start2=>end2+1
mit den gleichen Bedingungen wie enthält n
und p
jeder Ganzzahl in entspricht m
. Lassen Sie uns nun Schritt für Schritt durch diesen Schritt gehen:
l[:,i]
Grundsätzlich wird für jede Spalte i
im Array ein Zeilenvektor zurückgegeben l
. würde zum Beispiel l[:,0]
zurückkehren:
['A' 'E' 'W' 'A' 'N' 'A' 'O' 'T']
l[:,1]
würde zurückkehren:
['G' 'A' 'O' 'K' 'P' 'S' 'P' 'F']
und so weiter und so fort. Weitere Informationen zu verschiedenen Indizierungsmethoden in Numpy, einschließlich dieser Methode, finden Sie hier .
Danach kehrt die Funktion jedes zurückgegebene Array um, indem verwendet wird l[:,i][::-1]
, da jedes Array von links nach rechts indiziert ist. Da jedoch der Punkt 0,0
auf dem Gitter in der unteren linken Ecke des Gitters liegt, würde das Umkehren jedes Arrays die Indexwerte zurückgeben als würden sie von rechts nach links gesucht. Zum Beispiel l[:,0][::-1]
würde zurückkehren:
['T' 'O' 'A' 'N' 'A' 'W' 'E' 'A']
Danach indiziert die Funktion durch dieses umgekehrte Array nach dem Indexwert p
, der Ihrem Buchstaben entspricht, und fügt diesen der zu erstellenden Liste hinzu. Zum Beispiel würde, l[:,0][::-1][4]
was Punkt entspricht (0,4)
, zurückkehren A
.
Dieser Vorgang wiederholt sich und fügt der Liste neue Werte hinzu, bis die Bereichsobjekte erschöpft sind.
Nach all dem wird die Ausgabe, die Liste w
ist, schließlich zurückgegeben. In diesem Fall wäre das, APPLE
wenn mit print(''.join(r((0,4),(4,0),'''The Grid''')))
oder ['A','P','P','L','E']
ohne aufgerufen wird ''.join()
. In jedem Fall wird die richtige Antwort zurückgegeben, und wir sind fertig!