Pandemia
¡El mundo está en cuarentena! Hay una nueva pandemia que lucha contra la humanidad. Cada continente está aislado de los demás, pero las personas infectadas se han propagado antes de la advertencia.
En este problema se representará el mundo por una cadena como la siguiente
1 |
"01000000X000X011X0X" |
donde 0 representa no infectado, 1 representa infectado y X representa un océano
Las reglas de propagación son:
- El virus no puede propagarse al otro lado de un océano.
- Si una persona se infecta, todas las personas de este continente se infectan también.
- El primer y el último continente no están conectados.
El problema consiste en encontrar el porcentaje de la población humana que se infectó al final. Por ejemplo,
1 2 3 4 5 |
inicio: "01000000X000X011X0X" final: "11111111X000X111X0X" total: 15 infectados: 11 porcentaje: 100*11/15 = 73.33333333333333 |
Definir la función
1 |
porcentajeInfectados :: String -> Double |
tal que (porcentajeInfectados xs) es el porcentaje final de infectados para el mapa inicial xs. Por ejemplo,
1 2 3 4 5 |
porcentajeInfectados "01000000X000X011X0X" == 73.33333333333333 porcentajeInfectados "01X000X010X011XX" == 72.72727272727273 porcentajeInfectados "XXXXX" == 0.0 porcentajeInfectados "0000000010" == 100.0 porcentajeInfectados "X00X000000X10X0100" == 42.857142857142854 |
Soluciones
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
import Data.List (genericLength) import Data.List.Split (splitOn) -- 1ª solución -- =========== porcentajeInfectados :: String -> Double porcentajeInfectados xs | nh == 0 = 0 | otherwise = 100 * ni / nh where ni = fromIntegral (numeroInfectados xs) nh = fromIntegral (numeroHabitantes xs) -- (continentes xs) es la lista de las poblaciones de los continentes -- del mapa xs. Por ejemplo, -- continentes "01000000X000X011X0X" == ["01000000","000","011","0"] -- continentes "01X000X010X011XX" == ["01","000","010","011"] -- continentes "XXXXX" == [""] -- continentes "0000000010" == ["0000000010"] -- continentes "X00X000000X10X0100" == ["","00","000000","10","0100"] continentes :: String -> [String] continentes [] = [] continentes xs = as : continentes (dropWhile (=='X') bs) where (as,bs) = break (=='X') xs -- (numeroInfectados xs) es el número final de infectados a partir del -- mapa xs. Por ejemplo, -- numeroInfectados "01000000X000X011X0X" == 11 numeroInfectados :: String -> Int numeroInfectados xs = sum [length ys | ys <- continentes xs , '1' `elem` ys] -- (numeroHabitantes xs) es el número final de habitantes del mapa -- xs. Por ejemplo, -- numeroHabitantes "01000000X000X011X0X" == 15 numeroHabitantes :: String -> Int numeroHabitantes xs = length (filter (/='X') xs) -- 2ª solución -- =========== porcentajeInfectados2 :: String -> Double porcentajeInfectados2 xs | nh == 0 = 0 | otherwise = 100 * ni / nh where ni = sum [genericLength ys | ys <- splitOn "X" xs, '1' `elem` ys] nh = genericLength (filter (/='X') xs) |
Otras soluciones
- Se pueden escribir otras soluciones en los comentarios.
- El código se debe escribir entre una línea con <pre lang="haskell"> y otra con </pre>
Pensamiento
«El avance de las matemáticas puede ser visto como un progreso de lo infinito a lo finito.»