ns' = tail ns, es la lista "ns" menos su primer elemto, es decir empieza por el segundo. Esto lo uso para restarle el segundo al primero con: zipWith (-) ns' ns que une en cremallera ns' y ns aplicado la resta a cada par de elementos es decir: 2º - 1º, 3º - 2º.. etc..
tras las restas, filter(>0) debería eliminar los resultados negativos , dejandonos los incrementos que finalement contamos con length...
Veamos ahora:
main :: IO ()
main = do
contents <- readFile "data1.txt"
let readings = (read <$> lines contents):: [Int]
print "Result: " ++ show $ part1 readings
Main corre en la mónada IO permitiendonos leer con readFile el fichero dentro de contents. el bloque do permite usar la "notación monádica" que asemeja un lenguaje imperativo. Para la segunda linea que es código puro usamos un "let" para mantenerlo separado del código monádico.
lines l nos separa en una lista de lienas un string de elementos separados por '\'. Ahora queremos mapear read que parsea datos en la lista:
map read (lines contents) ó
fmap read (lines contents) ó
read `fmap` (lines contents) ó notación aplicativa
read <$> (lines contents)
read es una funcion polimórfica capaz de producir muchos datos distintos , nosotros queremos leer enteros pero eso el compilador no lo sabe, así que se lo informarmos solicitando una cast explícito con :: [Int]
finalmente usamos nuestro calculadora "part1" dentro de una acción de impresion (seguimos en IO) como part1 devuelve un entero usamos la antitésis de read: show para convertir el valor de vuelta a String y poder concatenarlo "++" con el mensaje de print.
Bueno YMMV porque me lo he "inventao" al vuelo en Twitter y no lo he probado...
pero me imagino que cualquiera con conocimientos de #Haskell sabrá arreglarlo en incluso hacer algo bastante mejor..
Bueno pues Hoy he hecho un pequeño esfuerzo por teclear y he resuelto el AoC Sonar Sweep parte 1.
Es muy facil asi que he tratado de ser un poco exótico y ahorrarme teclear mucho que apenas he podido aguantar la parte 1
Bueno agregué a un workspace las rutinas del A0C2020 por si puedo ahorrarme esfuerzo (aún ando jodido) El main funciona independiente de cuantos modulos despliegues en el directorio de challenges +
Lo primero que el puzle necesita es un swich para leer el fichero y un comando para lanzar la parte1 y la parte2 por separado. Para eso el módulo registra un subparser que se encarga de esos detalles.. +