Возникли проблемы с вращением 3-мерного списка символов в Haskell - PullRequest
0 голосов
/ 07 мая 2018

Я относительно новичок в Haskell и функциональном программировании, но сейчас я работаю над проектом, в котором я пытаюсь решить головоломки 3D-кубов.

У меня есть следующий трехмерный список, где ' ' представляет пустое пространство, а 'C' представляет часть структуры:

myShape = [["CC", " C"], [" C", "  "]]

Я хочу иметь возможность вращать эту структуру вдоль всех трех осей, чтобы попробовать ее в разных положениях. Я знаю, что могу вращать его вдоль одной оси, независимо вращая каждый 2D-слой.

У меня вопрос: как я могу вращаться вдоль других осей без жесткого кодирования вращений?

1 Ответ

0 голосов
/ 07 мая 2018

Ну, я решил сам:

rotate2dArr :: [[Char]] -> Int -> [[Char]]                                                                                                                                                              
rotate2dArr arr 0 = arr
rotate2dArr arr r = rotate2dArr (transpose $ [reverse row | row <- arr]) (r-1)

rotateX :: [[[Char]]] -> Int -> [[[Char]]]
rotateX arr 0 = arr
rotateX arr r = rotateX (transpose $ [reverse plane| plane <- arr]) (r-1) 

rotateY :: [[[Char]]] -> Int -> [[[Char]]]
rotateY arr 0 = arr
rotateY arr r = rotateY (rotateX (rotateZ (rotateX arr 1) 1) 3) (r - 1)

rotateZ :: [[[Char]]] -> Int -> [[[Char]]]
rotateZ arr r = [rotate2dArr plane r | plane <- arr]

rotate3dArr :: [[[Char]]] -> Char -> Int -> [[[Char]]]
rotate3dArr arr axis r = case axis of 
        'x' -> rotateX arr r -- Rotates cube on x axis backwards 
        'y' -> rotateY arr r -- Rotates cube clockwise as seen from above
        'z' -> rotateZ arr r

Это может быть не так уж и красиво, но работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...