Numpyを使用するPython 3.5、251バイト:
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
受け取りの入力を次の形式で:
print(''.join(r((start1,start2),(end1,end2),'''grid''')))
APPLE
上記の形式を使用して関数が呼び出される限り、文字列の形式(など)で出力します。それ以外の場合は、各文字を含むリスト(例:)['A','P','P','L','E']
が返されます。
いつ、どこで、いつゴルフができるのか。
オンラインでお試しください!(イデオネ)(ここでは、グリッドを二重引用符(""
)で囲んで入力し\n
、グリッドの各行の間にsを入れて1行で入力します。次に、ポイントは、 2行目で終わり、3行目で終わります。)
Ungolfedコードと説明
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
この説明のために、このプログラムが入力((0,4),(4,0))
と質問の最初のグリッドで実行されたと想定します。ここでは、コードの2つの主要部分について説明します。
l=numpy.array([[*i.split()]for i in z.split('\n')])
ここでl
は、入力の各行を個別の「リスト」に含む派手な配列です。たとえば、質問の最初のグリッドは次のとおりです。
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
この派手な配列を返します:
[['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])]
これは、グリッド上の各ポイントに対応するすべての文字が検索される関数のメインリストです。ここで、i
は、の各整数に対応しますn
。これは、範囲内のすべての数値を、if またはifの逆がtrueの場合start1=>end1+1
に増分して含む範囲オブジェクトです。ただし、に等しくない限り、これにのみ対応します。そうでなければ、多くの長さが倍として返され、範囲内の各整数を含む範囲の対象であると同じ条件とし、そして内のすべての整数に対応します。そうは言っても、今からこのステップをステップごとに見ていきましょう。+1
start1<end1
-1
i
start1
end1
start1
m
m
start2=>end2+1
n
p
m
l[:,i]
基本的i
に、配列の各列の行ベクトルを返しますl
。たとえば、次l[:,0]
を返します:
['A' 'E' 'W' 'A' 'N' 'A' 'O' 'T']
l[:,1]
戻ります:
['G' 'A' 'O' 'K' 'P' 'S' 'P' 'F']
などなど。このメソッドを含むnumpyでのさまざまなインデックス作成方法の詳細については、こちらをご覧ください。
次に、関数は返された各配列を逆にします。l[:,i][::-1]
各配列には左から右にインデックスが付けられているためです0,0
が、グリッドの左下隅にあるグリッド上の点から、各配列を逆にするとインデックス値が返されますまるで彼らが右から左へ捜されているかのように。たとえば、次l[:,0][::-1]
を返します:
['T' 'O' 'A' 'N' 'A' 'W' 'E' 'A']
この後、関数はその逆の配列を介してp
、文字に対応するインデックス値のインデックスを作成し、作成中のリストに追加します。たとえば、l[:,0][::-1][4]
ポイント(0,4)
に対応するは、を返しA
ます。
このプロセスは、範囲オブジェクトがなくなるまで、リストに新しい値を繰り返し追加し続けます。
結局、リストw
である出力が最終的に返されます。この場合、それはAPPLE
withで呼び出された場合、またはなしで呼び出されたprint(''.join(r((0,4),(4,0),'''The Grid''')))
場合['A','P','P','L','E']
です''.join()
。いずれにせよ、それは正しい答えを返し、完了です!