From 88c0747d2269656e3d129731a85d9182938dc419 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tristan=20Dani=C3=ABl=20Maat?= Date: Wed, 8 Dec 2021 04:22:05 +0000 Subject: [PATCH] day7: Complete puzzles --- 7/Parsing.hs | 23 ++++++++++++++++++++++ 7/crabfuel.hs | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++ 7/input.txt | 1 + 3 files changed, 78 insertions(+) create mode 100644 7/Parsing.hs create mode 100644 7/crabfuel.hs create mode 100644 7/input.txt diff --git a/7/Parsing.hs b/7/Parsing.hs new file mode 100644 index 0000000..8ad0f3f --- /dev/null +++ b/7/Parsing.hs @@ -0,0 +1,23 @@ +module Parsing ( + splitByString + ) where + +import Data.List (isPrefixOf) + +splitByString :: String -> String -> [String] +splitByString _ "" = [] +splitByString splitter string = + let (chunk, rest) = spanNextSplit string + in + chunk:(splitByString splitter rest) + where + spanNextSplit :: String -> (String, String) + spanNextSplit [] = ([], []) + spanNextSplit everything@(char:rest) + | splitter `isPrefixOf` rest = + ([char], (drop ((length splitter) + 1) everything)) + | otherwise = + let + (start, end) = spanNextSplit rest + in + (char:start, end) diff --git a/7/crabfuel.hs b/7/crabfuel.hs new file mode 100644 index 0000000..21a77b2 --- /dev/null +++ b/7/crabfuel.hs @@ -0,0 +1,54 @@ +import Data.List (nub) +import Parsing (splitByString) + +main :: IO () +main = do + input <- getContents + let + crabs = parseCrabs input + (putStrLn . show . solution1) crabs + (putStrLn . show . solution2) crabs + +solution1 :: [Int] -> Int +solution1 = minFuel crabFuel1 + +solution2 :: [Int] -> Int +solution2 = minFuel crabFuel2 + +parseCrabs :: String -> [Int] +parseCrabs = (map read) . (splitByString ",") + +minFuel :: (Int -> Int -> Int) -> [Int] -> Int +minFuel crabf crabs = minimum (map total positions) + where + uniqueCrabs = nub crabs + positions = [minimum uniqueCrabs..maximum uniqueCrabs] + total position = totalFuel crabf position crabs + +totalFuel :: (Int -> Int -> Int) -> Int -> [Int] -> Int +totalFuel crabf position = sum . (map (crabf position)) + +crabFuel1 :: Int -> Int -> Int +crabFuel1 crab position = abs (crab - position) + +crabFuel2 :: Int -> Int -> Int +crabFuel2 crab position = + -- Just the sum of 1.. + -- (using that Gauß-attributed sum) + end * (end + 1) `quot` 2 + where + end :: Int + end = crabFuel1 crab position + +-- Tests + +testInput = "16,1,2,0,4,2,7,1,2,14" +parsedInput = parseCrabs testInput + +test1 = solution1 parsedInput +test2 = solution2 parsedInput + +testTotalFuel1 = totalFuel crabFuel1 2 parsedInput +testTotalFuel2 = totalFuel crabFuel1 1 parsedInput +testTotalFuel3 = totalFuel crabFuel1 3 parsedInput +testTotalFuel4 = totalFuel crabFuel1 10 parsedInput diff --git a/7/input.txt b/7/input.txt new file mode 100644 index 0000000..bc3625f --- /dev/null +++ b/7/input.txt @@ -0,0 +1 @@ +1101,1,29,67,1102,0,1,65,1008,65,35,66,1005,66,28,1,67,65,20,4,0,1001,65,1,65,1106,0,8,99,35,67,101,99,105,32,110,39,101,115,116,32,112,97,115,32,117,110,101,32,105,110,116,99,111,100,101,32,112,114,111,103,114,97,109,10,346,92,161,1,634,8,35,96,1341,1149,237,33,593,459,801,98,1160,322,67,98,1219,475,12,274,24,1111,1134,14,195,234,654,202,1057,598,15,471,1583,70,4,244,96,407,51,1158,275,962,1034,694,696,271,591,389,1067,317,99,1321,177,18,257,1569,238,492,1006,857,33,31,984,296,146,1910,214,367,600,62,1365,478,31,238,384,1013,732,445,214,645,123,1069,391,80,1052,70,886,18,1472,547,94,1483,729,1220,1246,694,615,775,581,1056,405,428,138,1227,23,0,273,466,963,1250,324,1628,1122,498,588,0,236,499,390,92,64,1190,387,47,501,62,269,470,720,567,694,666,280,0,57,203,377,1061,781,857,698,50,291,370,1494,8,1124,665,113,381,457,901,151,932,95,555,72,156,192,170,606,1033,39,542,19,453,1286,797,1055,190,1,1075,1007,932,1503,224,209,138,559,532,342,115,772,728,470,479,122,76,174,810,270,1284,210,1182,176,683,1548,73,605,252,879,180,482,544,479,755,282,1617,486,183,551,369,916,32,234,516,1,212,6,1094,224,1316,694,195,1256,371,413,287,916,250,1143,126,574,1523,14,659,152,90,76,333,15,122,222,165,1184,476,682,75,298,1630,285,777,1167,381,606,161,287,136,329,641,560,516,1491,142,39,203,1147,459,505,586,186,234,99,591,213,323,355,653,1030,586,29,136,1021,773,1241,1099,564,65,226,8,337,179,117,1599,29,871,503,189,1033,193,278,786,1270,517,427,93,43,35,66,77,128,9,3,1277,1564,1005,219,1205,1517,739,60,25,401,408,441,143,108,506,1638,588,406,828,11,147,1167,1434,458,678,244,214,42,67,129,121,280,563,445,216,712,158,914,981,454,362,775,582,409,1659,1236,9,408,519,885,163,918,1001,1044,109,451,805,114,1375,251,331,147,1580,14,368,3,723,21,1771,20,188,228,247,124,726,615,543,297,347,765,816,668,649,1061,1732,328,1197,690,497,367,1219,957,1206,188,133,196,222,47,479,1901,243,859,1331,976,541,556,584,1337,156,1675,349,1321,817,764,303,359,42,992,367,271,138,163,329,444,591,15,1137,1418,1051,24,254,1867,149,169,295,230,1243,1372,263,43,973,485,676,463,563,380,402,446,518,698,1318,49,172,479,215,377,1110,1774,1154,707,158,879,259,473,362,245,1466,1074,527,636,307,1522,1371,1228,556,522,423,161,39,1602,1135,437,89,273,320,1031,838,133,123,189,816,539,239,568,878,917,82,905,291,825,268,1391,326,26,793,55,1356,629,84,241,261,1220,295,23,642,403,809,168,28,86,434,1178,12,1145,106,1091,942,168,1761,788,666,376,1353,44,12,209,658,23,205,964,964,566,367,336,62,462,565,151,505,1264,23,40,251,140,104,20,328,222,734,296,14,89,199,715,382,200,246,34,3,549,173,650,1219,52,626,23,65,802,334,286,1039,254,408,528,608,1554,516,83,429,1454,384,709,414,384,397,27,706,586,125,91,81,278,178,111,263,102,190,1235,287,1113,34,50,258,126,191,268,1262,745,1205,217,16,45,829,263,52,229,822,639,955,729,1251,98,112,94,550,247,269,1001,22,1282,420,700,41,445,493,19,44,75,1518,36,943,68,1697,172,558,1232,1229,122,234,755,499,845,3,1448,100,662,654,983,92,126,89,391,1672,1546,324,149,136,412,649,288,633,1226,10,1725,717,88,50,890,820,1114,1519,15,162,1769,963,610,241,350,502,73,249,263,143,324,180,615,426,139,94,5,954,117,657,418,170,635,5,276,8,723,344,32,822,3,323,11,22,471,811,51,52,49,1,575,20,1,287,664,277,252,551,366,836,181,559,35,27,28,28,856,1057,349,447,602,447,258,1874,1493,452,138,846,1530,40,482,60,101,840,120,23,115,281,389,44,1170,37,558,467,357,1090,18,120,526,284,930,885,152,169,674,14,97,639,1935,61,320,1275,1009,13,672,351,194,872,30,214,158,658,302,70,1404,137,3,818,162,910,199,987,392,310,922,962,751,1772,260,108,686,932,204,312,130,794,6,82,49,24,167,188,905,772,422,735,54,931,1040,723,16,640,858,428,81,119,85,45,1550,138,142,508,899,626,9,401,957,158,24,132,548,139,376,115,1661,203,485,1334,860,213,93,128,8,799,611,1470,2,800,353,75,166,26,120,14,869,222,21,1146,78,1500,321,0,738,309,1337,323,460,301,1025,205,717,436,125,166,1282,265,482,373,1247,173,228,729,78,125,366