~),1>{*}*
~
вычисляет входную строку (в целое число) )
увеличивает число ,
является диапазоном (4, становится [0 1 2 3]) 1>
выбирает значения, индекс которых равен 1 или больше {*}*
складывает умножение по списку Для запуска:
echo 5 | ruby gs.rb fact.gs
Если вы делаете это в Python, на основе ячеек, а не пар координат, очень просто повернуть вложенный список.
rotate = lambda tetrad: zip(*tetrad[::-1])
# S Tetrad
tetrad = rotate([[0,0,0,0], [0,0,0,0], [0,1,1,0], [1,1,0,0]])
Я вывел алгоритм вращения на основе матричных вращений здесь . Подводя итог: Если у Вас есть список координат для всех ячеек, составляющих блок, например [(0, 1), (1, 1), (2, 1), (3, 1)] или [(1, 0), (0, 1), (1, 1), (2, 1)]:
0123 012
0.... 0.#.
1#### or 1###
2.... 2...
3....
Вы можете вычислить новые координаты, используя
x_new = y_old
y_new = 1 - (x_old - (me - 2))
для вращения по часовой стрелке и
x_new = 1 - (y_old - (me - 2))
y_new = x_old
для вращения против часовой стрелки. me
- это максимальная протяженность блока, т.е. 4
для I-блоков, 2
для O-блоков и 3
для всех остальных блоков.
Повернуть матрицу можно только путем применения к ней математических операций. Если у вас есть матрица, скажем:
Mat A = [1,1,1]
[0,0,1]
[0,0,0]
Чтобы повернуть ее, умножьте ее на ее транспонирование, а затем на эту матрицу ([I]dentity [H]orizontaly [M]irrored):
IHM(A) = [0,0,1]
[0,1,0]
[1,0,0]
Тогда вы получите:
Mat Rotation = Trn(A)*IHM(A) = [1,0,0]*[0,0,1] = [0,0,1]
[1,0,0] [0,1,0] = [0,0,1]
[1,1,0] [1,0,0] = [0,1,1]
Примечание: Центр вращения будет центром матрицы, в данном случае в точке (2,2).