0votos

Torres de Hanoi en Haskell

por josejuan hace 5 años

Resolver las torres de hanoi ya se resolvió en un desafío anterior, aquí se muestra una animación de las fichas pasando de unas torres a las otras.

Consiste en hacer un simulador de las torres de hanoi....

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import Graphics.Gloss 
import Graphics.Gloss.Geometry 
import Graphics.Gloss.Interface.Pure.Simulate 
import Graphics.Gloss.Data.Vector 
import Data.Bits 
import System.Environment 
 
data Solver = Solver {towers :: [[Int]], current :: Int, size :: Int} 
 
makeHanoi s = Solver [[1..s],[],[]] 1 s 
 
(ww, wh) = (500, 200) 
ww3 = ww / 3 
 
drawWorld (Solver ws _ s) = Color white $ Translate 0 (-0.48 * wh) $ Pictures $ concat $ zipWith (drawTower 0) [-1,0,1] $ map reverse ws 
  where h                    = wh / (fromIntegral s + 1) 
        drawTower _ _     [] = [] 
        drawTower y x (w:ws) = (Translate (ww3*x) (h*y) $ rectangleWire ((0.9*ww3*fromIntegral w)/fromIntegral s) h) : drawTower (y+1) x ws 
 
advanceWorld _ _ (Solver ws c s) = if c < 2^s then Solver (zipWith move [0..] ws) (c + 1) s else makeHanoi s 
 where takeFrom = (c .&. (c - 1)) `mod` 3 
       putIn    = ((c .|. (c - 1)) + 1) `mod` 3 
       (x:_)    = ws!!takeFrom 
       move i w = if takeFrom == i then tail w else if putIn == i then (x:w) else w where w = ws!!i 
 
main = getArgs >>= \(f:s:_) -> simulate (InWindow "Hanoi" (round ww, round wh) (0, 0)) black (read f) (makeHanoi $ read s) drawWorld advanceWorld 
1 comentario
0votos

Escrito por josejuan hace 5 años

Una captura de la animación:
Animation

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.