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
Recebe entrada no seguinte formato:
print(''.join(r((start1,start2),(end1,end2),'''grid''')))
Saídas no formato de uma string (por exemplo APPLE
), desde que a função seja chamada usando o formato acima. Caso contrário, uma lista contendo cada letra (por exemplo ['A','P','P','L','E']
) é retornada.
Golf mais ao longo do tempo, onde e quando eu puder.
Experimente Online! (Ideone) (Aqui, a entrada é feita de forma que a grade seja cercada por aspas duplas ( ""
) e a entrada em uma linha, com \n
s entre cada linha da grade. Em seguida, os pontos são fornecidos em uma forma simples de tupla, com o início na segunda linha e no final na terceira.)
Código ungolfed junto com a explicação
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
Para os fins desta explicação, suponha que este programa foi executado com as entradas ((0,4),(4,0))
e a primeira grade da pergunta. Aqui, vou percorrer as 2 partes principais do código:
l=numpy.array([[*i.split()]for i in z.split('\n')])
Aqui l
está uma matriz numpy contendo cada linha da entrada em uma "lista" separada. Por exemplo, a primeira grade da pergunta, que é:
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
retorna 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 é a lista principal da função na qual todas as letras correspondentes a cada ponto na grade são encontradas. Aqui, i
corresponde a cada número inteiro em n
, que é um objeto de intervalo que contém todos os números do intervalo start1=>end1+1
em incrementos de +1
se start1<end1
ou -1
se o oposto é verdadeiro. No entanto, i
apenas corresponde a isso, desde que start1
não seja igual end1
. Caso contrário, start1
é retornado quantas vezes o comprimento de m
, onde m
é um objeto de intervalo que contém cada número inteiro no intervalo start2=>end2+1
com as mesmas condições que n
e p
corresponde a cada número inteiro em m
. Dito isto, vamos percorrer este passo a passo:
l[:,i]
basicamente retorna um vetor de linha para cada coluna i
, na matriz l
,. por exemplo, l[:,0]
retornaria:
['A' 'E' 'W' 'A' 'N' 'A' 'O' 'T']
l[:,1]
retornaria:
['G' 'A' 'O' 'K' 'P' 'S' 'P' 'F']
e assim por diante. Você pode ler mais sobre diferentes maneiras de indexar numpy, incluindo este método, aqui .
Depois disso, a função reverte cada matriz retornada, usando l[:,i][::-1]
, uma vez que cada matriz é indexada da esquerda para a direita, mas como o ponto 0,0
na grade no canto inferior esquerdo da grade, a reversão de cada matriz retornaria os valores do índice como se estivessem sendo procurados da direita para a esquerda. Por exemplo, l[:,0][::-1]
retornaria:
['T' 'O' 'A' 'N' 'A' 'W' 'E' 'A']
Depois disso, a função indexa através dessa matriz invertida o valor do índice correspondente a p
, que é sua letra, e o adiciona à lista que está sendo criada. Por exemplo, l[:,0][::-1][4]
que corresponde ao ponto (0,4)
, retornaria A
.
Esse processo continua repetindo e adicionando novos valores à lista até que os objetos do intervalo sejam esgotados.
Depois de tudo isso, a saída, que é lista w
, é finalmente retornada. Nesse caso, isso seria APPLE
se chamado com print(''.join(r((0,4),(4,0),'''The Grid''')))
ou ['A','P','P','L','E']
se for chamado sem ''.join()
. De qualquer forma, ele retorna a resposta correta e estamos prontos!