0votos

Paredes Movedizas en Haskell

por josejuan hace 6 años

Es bastante inmediato, podrían usarse bits (ej. si se quiere ahorrar memoria), pero usando paridades es cómodo y eficiente.

Sal de las ruinas resolviendo el enigma de las paredes movedizas

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
27
import qualified Data.Map as Map 
 
{-- 
 
    botones:    para cada botón, la lista de paredes que alternan 
    botonazos:  la lista de botones que es pulsada 
 
--} 
paredes :: [[Int]] -> [Int] -> [Int] 
paredes botones botonazos = map fst $ filter (odd.snd) $ Map.toList $ foldl pulsarBoton paredes botonazos 
  where nparedes = maximum $ concat botones 
        mboton = Map.fromList $ zip [1..] botones                             -- mapa para acceder rápidamente a la secuencia del botón n-ésimo 
        paredes = Map.fromList $ zip [1..nparedes] $ repeat 0                 -- todas las paredes están cerradas inicialmente, es decir, en pares 
        pulsarBoton p n = foldl (flip $ Map.adjust (+1)) p $ mboton Map.! n   -- de pares (cerrada) a nones (abierta) para cada puerta del botón pulsado 
 
 
 
 
 
 
 
{-- por ejemplo --} 
test = paredes [[1,5,7] 
               ,[2,4,6] 
               ,[2,5,8]] 
 
               [1,2,1,3,2,1,2] 
1 comentario
0votos

Escrito por luis_lics hace 6 años

Parece bien aunque realmente no entiendo Haskell, pero por lógica se ve bastante bien

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.