open System.IO let revSublist nums pos n = let c = Array.copy nums for i in [0..n-1] do nums.[(pos + i) % 256] <- c.[(pos + n - i - 1) % 256] let hash nRounds input = let nums = [|0..255|] let mutable pos = 0 let mutable skipsize = 0 for _ in [1..nRounds] do for n in input do revSublist nums pos n pos <- pos + n + skipsize skipsize <- skipsize + 1 nums let part1 (input: string) = input.Split(',') |> Array.map int |> hash 1 |> Array.take 2 |> Array.reduce (*) let part2 (input: string) = input |> Seq.map (fun c -> byte c) |> (fun a -> Seq.append a [|17uy; 31uy; 73uy; 47uy; 23uy|]) |> Seq.map int |> hash 64 |> Array.chunkBySize 16 |> Array.map (Array.reduce (^^^)) |> Array.fold (fun str digit -> str + sprintf "%02x" digit) "" let lengths = File.ReadAllText "day10.txt" part1 lengths |> printfn "%d" part2 lengths |> printfn "%s"