From cb9dee889be4bfb921e34aec8b6e5c0771aef543 Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Wed, 8 Dec 2021 15:34:05 -0800 Subject: [PATCH] Added Haskell Implementations and changed directory structure --- Haskell/2020/01/day1.hs | 8 ++ Haskell/2020/02/day2.hs | 19 +++++ Haskell/2021/01/day1.hs | 18 +++++ Haskell/2021/02/day2.hs | 24 ++++++ Haskell/2021/03/day3.hs | 57 ++++++++++++++ Haskell/2021/04/day4.hs | 99 ++++++++++++++++++++++++ Haskell/2021/05/day5.hs | 62 +++++++++++++++ Haskell/2021/05/day5_1.hs | 38 +++++++++ Haskell/2021/05/day5_2.hs | 49 ++++++++++++ Haskell/2021/06/day6.hs | 18 +++++ {2021 => Python/2021}/06/day6.py | 0 {2021 => Python/2021}/07/day7.py | 0 {2021 => Python/2021}/07/day7_initial.py | 0 {2021 => Python/2021}/08/day8.py | 0 14 files changed, 392 insertions(+) create mode 100644 Haskell/2020/01/day1.hs create mode 100644 Haskell/2020/02/day2.hs create mode 100644 Haskell/2021/01/day1.hs create mode 100644 Haskell/2021/02/day2.hs create mode 100644 Haskell/2021/03/day3.hs create mode 100644 Haskell/2021/04/day4.hs create mode 100644 Haskell/2021/05/day5.hs create mode 100644 Haskell/2021/05/day5_1.hs create mode 100644 Haskell/2021/05/day5_2.hs create mode 100644 Haskell/2021/06/day6.hs rename {2021 => Python/2021}/06/day6.py (100%) rename {2021 => Python/2021}/07/day7.py (100%) rename {2021 => Python/2021}/07/day7_initial.py (100%) rename {2021 => Python/2021}/08/day8.py (100%) diff --git a/Haskell/2020/01/day1.hs b/Haskell/2020/01/day1.hs new file mode 100644 index 0000000..1a0a24a --- /dev/null +++ b/Haskell/2020/01/day1.hs @@ -0,0 +1,8 @@ +nums = [1655,1384,1752,1919,1972,1766,1852,1835,1408,1721,1879,1846,1394,1577,1588,1097,1748,1585,765,1375,1806,1785,1824,1847,1037,1531,1989,1570,1625,1600,1832,1927,1691,1593,1936,1812,570,1391,1883,1592,1875,1185,1903,855,1331,1742,1884,1356,1944,1994,1556,1271,1572,1661,1914,1905,1581,1634,1252,1657,989,1907,1998,1040,1833,1612,1725,1680,1869,1900,1550,1768,1727,1930,1810,1841,734,1779,1774,1825,1446,1259,1552,1310,1885,1689,1929,1959,787,1642,1890,1164,1986,1796,1465,1217,1741,1480,1683,1808,1058,1970,1361,2003,1898,1668,1754,1773,1235,1158,1975,1479,1995,1648,1023,883,1553,1658,1794,1747,1978,1268,1966,1192,1886,1471,1548,1819,1551,1958,1732,1676,1745,1501,1858,1652,1596,473,1314,1814,1409,1877,1344,1735,1635,1273,871,1643,1599,1565,1695,1803,1764,1778,1823,1831,1701,282,1089,1623,1639,1568,1469,1674,1818,1992,1597,1711,1359,1851,1496,1630,1755,1529,1881,1718,1916,1325,1578,1441,1722,1545,1472,1783,1497,1791,1183,1926,1937,1255,1095,1451,1395,1665,1432,1693,1821,1938,1941,2002] + + +productOf2020Sum :: (Num a, Eq a) => [a] -> [a] +productOf2020Sum x = [d | a <- x, b <- x, let d = a*b, a+b == 2020] + +productOf2020Sum' :: (Num a, Eq a) => [a] -> [a] +productOf2020Sum' x = [d | a <- x, b <- x, c <- x, let d = a*b*c, a+b+c == 2020] diff --git a/Haskell/2020/02/day2.hs b/Haskell/2020/02/day2.hs new file mode 100644 index 0000000..59c9b66 --- /dev/null +++ b/Haskell/2020/02/day2.hs @@ -0,0 +1,19 @@ + +-- parseInput :: String -> (Int, Int, Char) +-- parseInput st = (ord (head st), read (tail (take 3 st)), tail (take 5 st)) + +parseMinimum :: String -> String -> Int +parseMinimum st out + | h == '-' = read (reverse out) + | h `elem` ['0'..'9'] = parseMinimum (tail st) (h:out) + | otherwise = error "Unexpected input" + where h = head st + +parseMax :: String -> String -> Int +parseMax st out + | h == ' ' = read (reverse out) + | h == '-' = parseMax (tail st) "" + | out == "!" = parseMax (tail st) "!" + | h `elem` ['0'..'9'] = parseMax (tail st) (h:out) + | otherwise = error "Unexpected input" + where h = head st diff --git a/Haskell/2021/01/day1.hs b/Haskell/2021/01/day1.hs new file mode 100644 index 0000000..2ec683e --- /dev/null +++ b/Haskell/2021/01/day1.hs @@ -0,0 +1,18 @@ +countIncreases :: [Integer] -> Integer +countIncreases [_] = 0 +countIncreases x + | previous < current = 1 + countIncreases (tail x) + | otherwise = countIncreases (tail x) + where previous = head x + current = head (tail x) + +--data1 = [199, 200, 208, 210, 200, 207, 240, 269, 260, 263] + +window :: [Integer] -> [Integer] +window [] = [] +window [_] = [] +window [_,_] = [] +window st = (a+b+c):window (tail st) + where a = head st + b = head (tail st) + c = head (tail (tail st)) diff --git a/Haskell/2021/02/day2.hs b/Haskell/2021/02/day2.hs new file mode 100644 index 0000000..4c16483 --- /dev/null +++ b/Haskell/2021/02/day2.hs @@ -0,0 +1,24 @@ +calcHorz :: [String] -> Int +calcHorz [] = 0 +calcHorz sts + | prefix == "forward" = read (drop 8 command) + calcHorz (tail sts) + | otherwise = calcHorz (tail sts) + where command = head sts + prefix = takeWhile (/=' ') command + +calcVert :: [String] -> Int -> Int +calcVert [] _ = 0 +calcVert sts aim + | prefix == "forward" = (aim * read (drop 8 command)) + calcVert (tail sts) aim + | prefix == "up" = calcVert (tail sts) (aim - (read (drop 3 command))) + | prefix == "down" = calcVert (tail sts) (aim + (read (drop 5 command))) + | otherwise = error ("Not forward up or down: " ++ command) + where command = head sts + prefix = takeWhile (/=' ') command + +data2 = ["forward 5", "down 5", "forward 8", "up 3", "down 8", "forward 2"] + +data3 = ["forward 8", "down 5", "forward 16", "up 10", "down 10", "forward 3"] + +data4 = ["forward 3","down 9","forward 5","up 1","forward 2","down 1","down 7","down 5","up 6","forward 3","down 6","forward 9","down 6","forward 2","down 4","forward 4","down 9","down 7","down 2","down 4","forward 3","forward 6","down 3","up 1","down 5","down 8","down 1","forward 9","forward 4","forward 3","down 3","down 6","down 3","up 2","down 3","down 9","down 1","down 9","up 8","down 1","down 9","forward 9","forward 2","down 1","forward 2","down 9","forward 9","up 7","forward 1","up 8","forward 7","forward 6","forward 2","down 8","forward 7","down 3","down 2","down 1","forward 2","down 6","forward 8","down 7","forward 9","down 7","down 9","forward 2","forward 2","up 3","down 4","down 8","forward 5","down 4","down 8","down 2","up 7","down 7","up 9","up 9","up 1","forward 2","up 4","forward 5","forward 9","forward 9","forward 3","down 6","up 3","down 1","forward 8","forward 2","down 7","forward 9","forward 1","forward 8","forward 8","down 2","down 6","forward 8","forward 8","forward 3","forward 4","down 3","up 3","forward 1","forward 4","down 1","down 4","down 2","down 3","forward 5","down 3","up 5","forward 9","down 8","up 6","down 6","up 7","up 7","forward 1","forward 7","down 1","up 3","down 1","forward 7","forward 1","forward 9","down 2","forward 9","down 3","down 5","forward 2","up 3","forward 5","forward 5","down 8","down 7","forward 6","down 2","down 5","up 4","up 5","down 6","forward 5","down 3","down 8","forward 7","down 5","down 5","down 9","down 9","down 2","down 7","up 4","forward 8","up 6","down 5","forward 1","up 2","down 6","up 8","up 7","down 6","forward 4","down 6","up 6","up 4","forward 5","forward 4","forward 6","down 3","down 7","down 9","forward 2","forward 6","down 3","forward 1","forward 2","forward 9","up 5","down 7","down 6","forward 2","forward 1","up 3","down 8","forward 9","down 7","forward 7","up 2","up 8","up 8","forward 7","forward 5","forward 9","down 7","down 7","forward 5","forward 4","forward 2","forward 8","up 3","up 7","forward 8","forward 6","forward 2","forward 6","up 3","up 1","forward 6","forward 9","down 1","forward 6","forward 4","up 6","forward 1","down 7","forward 7","up 5","down 5","down 3","forward 4","forward 6","up 6","forward 9","forward 2","down 7","forward 9","down 9","forward 2","up 1","down 4","forward 6","forward 4","down 6","forward 1","up 3","up 5","down 8","forward 2","up 7","down 5","down 2","down 6","forward 7","down 8","up 8","down 7","down 9","down 7","down 8","down 4","up 3","up 9","down 4","forward 7","down 5","up 8","down 3","forward 8","down 3","down 4","down 1","forward 5","down 4","down 8","up 7","forward 2","forward 8","down 1","down 3","forward 4","forward 5","forward 8","forward 1","down 1","down 9","up 8","forward 6","down 8","down 2","forward 9","down 5","down 8","up 8","up 5","forward 9","up 6","down 9","up 1","down 2","down 4","forward 9","forward 1","up 2","down 7","forward 9","down 9","down 6","down 9","down 8","forward 7","forward 6","forward 9","forward 9","forward 8","forward 5","up 2","forward 9","forward 2","down 1","down 1","down 5","down 1","down 7","up 2","up 7","forward 7","forward 8","down 2","down 2","down 3","up 8","up 8","up 3","forward 3","down 7","up 4","up 8","down 5","forward 4","forward 7","down 9","up 7","forward 8","forward 5","forward 8","forward 8","forward 6","forward 5","forward 2","down 3","up 2","forward 6","forward 5","down 9","down 2","down 7","down 2","forward 2","forward 6","forward 8","down 7","forward 4","down 3","down 5","forward 1","down 9","forward 5","down 4","forward 9","down 5","down 4","down 4","down 7","forward 9","down 3","down 5","down 6","down 4","forward 4","down 4","up 1","down 4","up 7","forward 4","forward 5","up 9","down 4","up 9","forward 9","down 8","down 1","up 7","down 4","up 4","forward 9","down 9","down 4","up 4","down 5","forward 2","up 4","down 3","forward 9","forward 8","down 2","forward 5","up 5","down 9","down 7","down 5","down 9","down 1","down 7","down 2","forward 4","up 7","forward 7","down 8","down 2","down 8","up 6","down 7","down 7","forward 3","up 3","forward 6","down 8","down 3","up 2","down 9","forward 3","down 9","down 6","up 8","forward 5","down 9","up 2","up 8","down 8","up 1","up 2","forward 5","up 3","down 7","forward 4","forward 2","up 1","forward 2","up 1","down 1","down 5","forward 6","up 2","down 7","down 8","down 9","up 9","down 2","up 2","forward 9","forward 6","forward 5","down 6","up 6","forward 6","forward 3","down 3","forward 2","forward 4","forward 1","down 9","forward 3","forward 2","down 5","up 2","forward 7","down 4","forward 5","down 4","forward 2","down 4","up 3","forward 6","forward 9","down 1","forward 2","up 8","forward 4","up 9","up 4","up 3","forward 5","down 7","forward 2","up 4","forward 7","down 8","forward 6","forward 4","up 5","down 4","down 6","down 3","forward 6","down 9","up 6","forward 3","down 4","forward 8","forward 1","down 3","down 4","up 4","forward 1","up 5","up 9","forward 4","up 9","forward 2","up 5","up 5","up 7","up 4","down 3","forward 8","forward 1","up 1","down 8","up 3","up 4","up 2","up 8","up 7","down 8","up 8","forward 9","down 8","up 5","forward 6","forward 4","down 8","down 9","down 4","down 6","forward 4","up 6","up 1","forward 7","up 4","down 6","up 3","down 4","forward 8","forward 4","up 2","down 3","up 3","up 9","down 4","forward 4","forward 5","forward 2","down 1","down 6","down 1","forward 6","down 2","forward 1","down 2","down 4","forward 1","down 8","up 2","down 5","forward 9","forward 4","down 9","forward 8","forward 2","forward 7","forward 1","forward 1","down 8","forward 2","forward 8","forward 7","forward 9","down 4","down 2","forward 1","forward 2","down 1","forward 1","forward 5","down 1","down 5","down 1","forward 2","up 9","forward 2","forward 4","down 9","up 7","down 1","up 4","forward 9","up 6","up 8","down 3","forward 9","up 6","down 1","forward 9","forward 3","up 5","forward 9","down 1","forward 5","up 5","down 1","up 4","forward 3","forward 1","up 4","forward 3","forward 9","down 2","forward 5","forward 4","forward 9","down 5","forward 8","forward 1","down 3","down 2","down 3","up 8","forward 3","forward 6","up 8","down 6","forward 8","forward 1","down 8","down 7","forward 8","down 2","forward 8","down 4","forward 1","down 1","up 6","forward 1","up 7","down 2","forward 5","up 9","down 5","forward 4","down 6","down 9","forward 8","up 2","up 7","forward 2","forward 5","up 9","down 4","forward 9","down 4","down 3","down 6","down 9","down 9","down 1","down 1","down 7","down 4","down 7","up 5","forward 6","down 9","forward 7","down 5","down 4","down 2","down 4","down 9","forward 1","down 9","down 8","forward 2","up 7","up 3","forward 9","forward 4","down 8","down 4","forward 2","down 8","up 3","forward 6","forward 4","down 2","up 9","down 5","up 8","up 6","up 3","down 2","forward 6","forward 4","forward 7","forward 2","down 5","down 2","forward 2","forward 6","down 5","down 4","forward 8","up 3","forward 7","down 1","forward 5","down 8","down 9","forward 5","down 7","forward 7","up 6","down 3","forward 1","down 2","down 9","down 2","down 1","forward 4","up 5","up 9","forward 1","down 5","forward 4","up 3","up 5","forward 7","forward 5","down 2","down 8","forward 5","down 7","up 8","down 5","down 6","forward 8","forward 9","down 8","up 3","down 8","down 2","forward 8","forward 8","forward 4","forward 9","up 7","up 1","down 5","down 8","down 5","forward 3","forward 2","down 8","down 3","down 2","down 5","forward 8","up 3","down 9","up 4","up 1","up 8","down 8","forward 5","down 2","forward 4","forward 1","down 7","forward 4","forward 5","up 2","down 6","up 9","forward 1","down 9","forward 4","down 7","down 9","up 9","forward 2","forward 7","down 7","forward 9","forward 1","forward 1","down 7","up 6","up 3","forward 2","forward 6","forward 9","forward 3","forward 4","forward 9","forward 9","forward 9","down 8","up 2","forward 7","down 8","down 3","up 8","down 8","forward 1","forward 9","forward 2","forward 3","down 8","forward 1","forward 4","down 9","down 4","up 7","forward 5","down 4","forward 5","down 2","forward 6","down 1","up 9","down 5","up 5","down 2","up 1","up 8","down 3","up 3","down 8","forward 4","forward 1","up 5","forward 1","down 5","up 5","forward 8","down 1","up 4","forward 9","forward 7","up 1","up 9","forward 7","forward 1","up 5","forward 6","down 2","up 5","down 4","down 6","down 3","forward 8","down 7","down 5","down 7","forward 1","down 7","up 5","down 4","down 4","down 4","forward 3","forward 4","up 6","forward 8","forward 2","up 1","forward 5","forward 6","forward 6","up 2","down 3","forward 3","up 8","forward 6","forward 5","up 2","up 5","down 6","down 8","down 1","forward 6","down 3","down 2","forward 4","down 4","down 7","forward 9","forward 4","forward 5","down 8","down 9","up 4","up 4","down 5","up 1","up 6","down 9","forward 9","forward 4","forward 9","forward 9","down 5","down 1","up 9","down 3","up 5","down 7","forward 6","forward 2","down 5","down 6","forward 7","forward 2","up 9","forward 6","down 7","up 4","forward 1","down 5","forward 2","forward 1","down 6","down 1","down 4","forward 8","forward 1","down 5","down 8","down 3","forward 4","down 2","forward 9","up 1","forward 8","down 4","down 3","down 1","forward 5","forward 9","down 3","forward 6","up 6","up 9","forward 8","forward 2","down 9","forward 3","down 4","down 5","down 4","forward 2","forward 6","down 9","down 5","forward 6","forward 3","forward 5","forward 6","forward 5","forward 1","up 4","up 1","down 2","up 6","down 5","down 1","forward 9","down 1","down 2","forward 6","up 2","down 4","up 3","forward 8","down 4","down 4","down 6","up 1","down 7","up 4","down 6","up 7","up 6","down 5","forward 3","forward 4","up 5","down 2","down 9","forward 9"] +data1 = ["forward 8","forward 1","down 9","down 8","down 5","forward 4","up 9","forward 7","forward 2","down 6","forward 7","forward 5","forward 8","down 7","up 8","forward 1","forward 6","down 8","up 3","forward 3","down 3","down 7","forward 5","down 1","down 9","forward 4","up 7","forward 9","forward 1","down 6","down 5","down 4","forward 9","forward 1","forward 4","up 3","up 6","forward 1","forward 9","forward 4","down 1","down 9","forward 7","forward 8","down 8","down 8","down 4","down 5","up 3","forward 4","down 1","forward 2","forward 1","forward 8","up 2","forward 5","forward 4","forward 5","forward 8","down 4","down 5","down 8","down 7","down 6","forward 4","up 8","forward 6","down 2","down 7","up 7","down 2","down 6","forward 5","forward 2","forward 8","down 5","down 6","down 6","up 7","down 7","forward 8","down 7","down 7","down 2","down 2","forward 3","up 5","down 3","up 3","down 4","up 9","down 1","up 1","forward 3","up 3","forward 9","up 6","down 3","down 6","forward 4","forward 5","forward 8","down 6","down 9","down 4","down 5","forward 7","down 3","forward 8","forward 3","up 9","forward 5","forward 8","forward 1","down 4","up 2","forward 1","down 1","forward 5","down 8","down 2","forward 3","forward 2","forward 1","down 7","forward 1","down 4","forward 7","forward 5","down 8","down 2","up 4","up 8","forward 6","up 2","down 8","up 9","forward 3","up 5","down 3","down 5","up 6","forward 3","up 9","down 4","forward 8","up 3","forward 6","forward 7","forward 8","forward 6","down 9","forward 4","up 8","forward 3","forward 3","forward 6","down 3","forward 5","down 4","down 4","up 4","down 8","down 4","down 1","down 7","down 7","up 9","down 7","forward 2","down 1","down 8","forward 8","forward 4","forward 6","forward 8","forward 6","forward 8","forward 7","forward 6","up 7","down 6","down 9","down 2","down 8","down 4","up 6","up 8","forward 3","down 7","down 3","forward 3","forward 3","down 4","down 1","up 3","forward 3","down 5","up 6","down 6","forward 1","down 3","down 6","down 9","down 3","forward 8","down 1","forward 7","forward 1","forward 3","up 3","down 8","forward 4","down 4","down 4","down 8","down 5","down 8","forward 6","forward 7","down 9","forward 2","up 9","down 5","forward 2","down 5","down 8","forward 1","forward 6","forward 2","forward 6","down 7","up 7","down 7","forward 7","up 8","forward 9","down 5","up 6","up 6","forward 3","down 5","forward 1","down 4","down 4","down 1","up 6","down 8","down 9","down 2","up 2","up 7","forward 5","down 5","up 2","forward 2","up 1","forward 2","up 4","up 7","forward 2","down 4","down 1","forward 4","up 6","forward 1","up 7","down 8","down 5","down 1","up 7","down 5","forward 4","forward 2","down 2","down 6","forward 1","forward 2","up 6","down 1","forward 2","down 5","down 9","down 6","up 8","forward 3","down 6","up 3","down 8","down 8","forward 2","forward 1","forward 7","forward 8","forward 2","forward 5","down 6","down 3","forward 5","up 8","forward 6","up 9","forward 7","up 3","down 7","down 3","up 8","down 5","forward 3","down 1","forward 1","forward 2","down 7","down 6","down 9","forward 3","down 7","down 7","down 5","forward 4","down 4","forward 5","forward 1","forward 4","down 8","up 4","down 6","down 8","up 1","forward 7","up 3","forward 6","forward 8","forward 9","forward 2","up 6","forward 7","forward 3","up 3","up 6","down 8","up 4","forward 9","down 9","up 3","up 3","down 4","up 3","down 2","down 4","up 9","down 1","forward 6","forward 3","down 3","forward 4","forward 3","forward 8","forward 1","down 1","up 4","up 9","down 8","forward 3","forward 2","down 4","down 1","forward 8","down 8","up 8","up 7","down 4","forward 6","up 5","down 1","down 3","down 9","forward 3","forward 9","down 1","down 6","forward 8","up 1","down 9","down 3","forward 5","forward 9","forward 8","up 7","down 2","down 5","forward 6","down 9","down 4","down 7","down 4","forward 7","down 8","up 8","forward 2","up 3","down 4","forward 2","forward 4","up 4","forward 4","forward 9","down 9","up 1","forward 1","down 8","up 7","up 9","down 8","down 7","forward 9","forward 1","up 3","forward 8","forward 6","forward 5","up 2","forward 8","up 7","down 8","down 2","up 9","down 7","forward 5","forward 4","down 9","forward 4","forward 5","up 1","down 8","down 8","down 4","forward 3","down 1","up 7","down 8","forward 4","down 5","forward 1","down 9","forward 9","up 7","up 1","down 3","forward 3","down 8","forward 9","down 3","up 7","forward 1","up 8","up 2","up 1","forward 8","down 3","forward 5","up 3","forward 6","forward 9","forward 2","forward 6","down 5","forward 2","down 7","up 6","forward 8","forward 6","down 3","forward 8","down 1","forward 2","down 9","up 5","down 6","up 4","forward 6","forward 5","forward 2","forward 9","forward 8","up 4","forward 4","forward 9","forward 4","forward 7","up 6","down 5","forward 8","down 8","up 3","down 4","up 8","up 5","forward 3","down 8","down 9","down 1","forward 7","down 8","up 4","down 8","up 4","down 5","forward 1","forward 3","down 6","down 5","forward 4","up 2","down 7","down 3","up 9","forward 5","forward 3","forward 2","up 2","down 9","up 1","down 2","forward 3","forward 8","forward 5","down 2","down 2","up 3","down 8","forward 4","forward 6","forward 5","up 9","down 7","up 7","up 2","down 2","up 4","forward 2","forward 2","down 7","forward 5","down 2","up 7","forward 6","forward 5","down 1","forward 8","forward 3","forward 2","up 3","down 1","forward 6","forward 5","forward 9","down 5","up 3","down 1","down 5","forward 1","down 1","down 1","forward 6","up 8","forward 9","up 5","up 5","forward 9","forward 3","forward 4","down 8","forward 9","forward 9","up 2","down 6","down 2","forward 1","down 7","up 4","forward 3","down 6","forward 5","down 6","up 5","forward 6","up 6","forward 7","forward 5","forward 1","down 9","forward 7","forward 4","forward 1","forward 6","up 7","forward 6","down 3","forward 4","down 1","down 9","down 8","forward 7","down 7","up 5","forward 1","forward 4","forward 8","forward 6","forward 2","forward 4","forward 2","forward 6","forward 5","down 4","down 3","forward 6","forward 3","up 6","down 3","down 2","forward 1","down 9","up 1","forward 8","forward 1","forward 1","forward 4","down 5","forward 7","forward 5","up 5","up 7","forward 7","forward 5","down 3","down 2","down 7","forward 7","forward 4","down 9","forward 2","down 6","forward 3","up 6","down 8","down 7","down 6","down 7","up 5","up 9","down 4","up 6","forward 1","forward 2","forward 4","up 5","down 2","down 3","forward 9","down 9","down 3","forward 5","forward 3","down 1","up 7","forward 7","forward 5","down 8","up 6","down 7","forward 5","up 7","up 6","forward 2","forward 6","down 1","up 8","down 9","down 1","forward 9","up 9","down 2","forward 6","up 3","down 1","up 9","down 6","up 2","up 6","forward 9","forward 8","up 7","forward 6","up 3","up 4","down 6","forward 1","forward 9","down 9","down 6","forward 1","forward 2","up 3","down 4","down 9","down 3","down 2","forward 7","down 9","forward 9","forward 5","down 9","forward 1","forward 6","down 6","up 8","up 8","up 3","forward 7","forward 7","forward 8","down 5","forward 3","down 4","down 6","forward 1","down 1","forward 7","forward 2","down 7","down 1","up 6","forward 3","down 6","forward 2","down 6","forward 8","down 4","up 8","forward 9","up 5","forward 3","down 6","forward 4","forward 4","down 8","up 5","up 9","down 8","forward 1","down 6","down 3","forward 1","down 4","up 6","down 6","down 6","down 5","forward 5","forward 6","down 1","down 9","down 4","up 7","down 2","forward 5","down 8","down 8","down 6","down 1","up 8","down 1","down 4","forward 6","down 3","down 6","up 4","down 6","up 7","down 3","forward 2","up 3","forward 7","up 7","up 4","forward 5","down 9","down 2","down 9","up 6","forward 9","forward 3","down 1","forward 7","forward 2","down 5","forward 3","forward 7","forward 4","forward 7","forward 6","forward 3","down 6","forward 3","down 1","up 6","up 9","down 1","forward 1","down 1","up 7","forward 8","forward 4","up 4","forward 7","down 3","up 8","up 1","down 6","forward 8","forward 7","up 7","down 4","down 4","down 8","up 3","forward 5","down 4","forward 9","forward 6","forward 6","forward 7","down 6","down 3","forward 2","up 8","forward 1","down 9","up 7","down 3","down 3","up 5","up 4","up 8","forward 2","down 5","forward 7","up 8","up 6","forward 5","down 5","forward 2","down 6","forward 7","down 6","forward 5","forward 3","forward 9","down 7","forward 7","forward 7","forward 7","forward 1","forward 2","forward 2","down 6","down 8","forward 3","down 9","down 5","up 5","forward 3","forward 9","down 7","down 9","down 9","down 9","forward 6","down 1","forward 6","forward 8","forward 8","down 4","forward 8","down 9","forward 6","down 2","down 1","down 5","forward 5","forward 8","forward 7","forward 7","forward 8","down 5","forward 3","up 5","forward 5","down 9","up 8","down 2","forward 8","forward 5","up 5","forward 4","down 3","forward 4","up 3","forward 1","forward 8","forward 3","down 2","up 8","forward 2","down 8","forward 3","up 2","up 1","down 9","down 8","forward 1","forward 1","down 8","forward 9","up 2","forward 4","forward 2","up 2","down 8","down 1","forward 1","forward 3","forward 6","up 6","down 2","up 1","down 3","forward 3","up 5","down 9","down 7","forward 8","up 5","up 4","forward 8","forward 5","down 8","up 8","forward 7","up 8","down 6","down 2","down 3","forward 9","down 4","down 2","down 1","up 2","up 4","forward 3","forward 1","forward 9","forward 1","down 7","up 7","forward 5","down 3","forward 3","down 4","down 1","up 5","down 8","down 2","forward 4","up 9","down 3","down 3","down 2","forward 7","down 2","forward 6","up 8","forward 5","forward 5","up 9","forward 8","forward 9","down 5","forward 5","down 3","forward 5","down 1","forward 6","forward 6","forward 1","forward 2","up 5","forward 9"] diff --git a/Haskell/2021/03/day3.hs b/Haskell/2021/03/day3.hs new file mode 100644 index 0000000..c07e811 --- /dev/null +++ b/Haskell/2021/03/day3.hs @@ -0,0 +1,57 @@ +getBit :: String -> Int -> Char +getBit x n = head (drop (n - 1) x) + +data1 = ["00100", "11110", "10110", "10111", "10101", "01111", "00111", "11100", "10000", "11001", "00010", "01010"] + +mostCommon :: String -> Int -> Int -> Char +mostCommon [] x y + | x > y = '1' + | y > x = '0' + | otherwise = '1' +mostCommon st x y + | bit == '1' = mostCommon (tail st) (x + 1) y + | bit == '0' = mostCommon (tail st) x (y + 1) + | otherwise = error "Not 1 or 0" + where bit = head st + +leastCommon :: String -> Int -> Int -> Char +leastCommon [] x y + | x < y = '1' + | y < x = '0' + | otherwise = '0' +leastCommon st x y + | bit == '1' = leastCommon (tail st) (x + 1) y + | bit == '0' = leastCommon (tail st) x (y + 1) + | otherwise = error "Not 1 or 0" + where bit = head st + +oxygenRating :: [String] -> Int -> String +oxygenRating [st] _ = st +oxygenRating sts x + | bit == '1' = oxygenRating [ st | st <- sts, (getBit st x) == '1'] (x + 1) + | bit == '0' = oxygenRating [ st | st <- sts, (getBit st x) == '0'] (x + 1) + | otherwise = error "Not 1 or 0" + where bit = mostCommon [getBit y x | y <- sts] 0 0 + +c02Rating :: [String] -> Int -> String +c02Rating [st] _ = st +c02Rating sts x + | bit == '1' = c02Rating [ st | st <- sts, (getBit st x) == '1'] (x + 1) + | bit == '0' = c02Rating [ st | st <- sts, (getBit st x) == '0'] (x + 1) + | otherwise = error "Not 1 or 0" + where bit = leastCommon [getBit y x | y <- sts] 0 0 + +makeList :: [String] -> Int -> String +makeList _ 0 = [] +makeList l x = mostCommon [getBit y x | y <- l] 0 0 : makeList l (x - 1) + +inverse :: String -> String +inverse [] = [] +inverse l + | bit == '1' = '0' : inverse (tail l) + | bit == '0' = '1' : inverse (tail l) + where bit = head l + + + +data2 = ["101000111100","000011111101","011100000100","100100010000","011110010100","101001100000","110001010000","111110011011","000110100110","110100000001","110100001001","010000100011","000010011100","111001110001","011001000010","100011100110","101010100111","001011001101","001101100100","111010110100","010101011100","001010010000","101001111001","101110010001","110100011100","001010111110","011110110100","110110101110","000000101101","001100000110","110010110001","010110101110","100111000111","000010101111","010101111011","011101000100","010000011011","110011111111","000001100100","100100110110","100001101001","110001000010","010111110110","101101011001","010101101101","010001101100","100010000000","111111001001","111101001011","010110011001","011000000100","011100101000","111101001000","111000110010","110000000110","001101011000","101110010011","100010011111","111110010000","000011010011","111110100010","111111001111","101001011110","111001101001","111010011100","001011001111","001010011110","110111101010","101111101101","011101110101","001111110101","010111110011","000010011000","111111111000","000101001100","110011001000","100010100110","100110101110","001010101101","110000111000","101100010110","000000100101","111001101101","111010001101","111110000111","010101000010","100000101101","000011100011","011011000111","011000011111","100101011100","101011000110","111110001110","001010011101","101001101001","001101111110","000100000010","011110000001","010111101101","010101100010","000110000011","100001111010","011001011000","001011110100","001101111011","001110110010","001010101000","100001001100","101010100110","100010101011","111000010000","100101100111","010001011001","010010101101","001001000111","100010111100","001011100011","100100001101","110000110010","100010011101","111001011100","101101011011","010011111111","010100111111","000101100011","111001110111","000010100100","101100000000","111110100011","110101111111","001101001101","010110000110","110100010100","011100011100","110011001100","000001010111","110100001000","110110100111","010000001111","100011111110","001000010000","011101001001","100110101111","000010101101","100011010101","010101001000","110101011101","111111101010","101011101101","010101001001","101101000110","110110101000","110100100101","000011110101","001110101001","011101011110","111111110100","010111000011","100101010000","010011111010","111001101100","100100010101","100101100001","001111000111","110100101001","010010011100","011001000101","111101010001","001100010000","111100000011","000101001000","010011010111","101110011000","110000111010","110010001011","111110110010","000000001011","011001111001","001001001110","100111001111","110110001010","110110010101","110011001101","010001101001","000010100111","100111111110","111011100001","011000100000","111111000100","111100100010","110110110110","001100111110","101000100001","000010000101","111101011101","001001001101","101011001101","000010010001","011010110001","110000000010","000111001000","111110101100","011111000111","010101111000","010100010110","111111100100","110011010001","010110001110","000100010011","100101100011","101010001011","001010111101","111110111000","101001100011","011100110010","101001101010","111011110000","011101110000","000001101111","111101101100","110101000101","011000110101","000111100101","111110011101","000111101010","010011100101","101001001001","100010101000","111111100011","011011101111","001011111001","001001101011","100101100101","100011111000","010110100001","000100111111","010100111101","010100100000","110000101000","100001011000","100010011000","100011101111","001100010001","010001010001","011011001001","001001110110","111011011100","000110010000","111110011111","001111101000","010010010001","000011001110","101011101100","001000110110","111000010001","010111000101","110000001110","000011111010","010000010100","011101001110","000111011011","000111110010","111110110101","101110100001","111101011100","010001111001","010011011000","111110111011","111000100110","000110001001","100000111110","001101101010","101100111010","000101011111","001101010111","011001010011","001111010110","010101000000","010011100001","010011001000","110110011011","110100111000","101110000111","100101110111","000001011100","111110111110","000001011010","010101101000","010010100100","011100010011","110111001000","110011100001","111100111010","010001110100","000100100111","000001110011","110011100111","010010101111","100010001101","111101101011","110100010101","101010111110","111010011110","111101101101","000100010000","111101010010","011100001111","101010110001","000111111100","010100001101","111100010000","101011110110","010100011000","100111101001","011100000000","000110110110","001111010011","111100111101","101111101100","001000101100","111100011000","010101110000","001110110001","000000011110","010010111101","000001001001","110100101101","100010010100","010100001001","100110001000","000011001011","101011001111","100010100111","011101100000","110111101111","001110100010","100101101110","110100000000","001010100100","011100110100","011100011111","010101100110","011000001000","100000111010","011011100000","000011110011","010111011111","011100101111","111011111001","110010111101","101101110101","101100100010","001001111100","100100111001","101101111110","001100100110","011011100101","110111010010","101100111111","000011110111","001110111101","100110000000","001100010100","110001101101","011010100000","000100011010","011001011010","011111111111","011000001100","111111110001","000000101110","000110011111","001110100000","001110011101","000000011000","101001110011","000101101010","000100001110","101100011011","110010101111","011101000001","110001011000","111011011111","111110100100","010101011111","110011111000","000101111111","001101011101","010111011011","101000110011","001110010001","010010001001","000010011010","000010101001","110111110100","100101001000","000101000100","101111001001","101111111111","010000010010","101001110000","100100001110","001001110010","111010110010","110011011111","101001110100","011100111111","100000111111","110101101100","000100110100","100110101010","100100000100","010010000110","010110001100","000010001001","001100001010","100001101000","100010011001","010101101110","010000111001","101110110010","111100100000","110000101110","101001101111","100101001100","111011101111","001111000001","011101111101","011000010111","101011111001","101011010110","010000000011","100010011011","001111001011","101000011101","001101100010","100111010101","000111100001","101111010011","000101101100","111110000101","110100011110","011101101000","100000111001","111000101001","000011010100","110101011011","010011100011","111011010110","010110111000","110111010101","001111111110","000011011101","001011000100","000101101111","101100011100","001001101100","011110111100","010001000001","100100101101","001101010101","101101111001","111001101011","100111001010","100110111001","110000101111","001001110101","011101101111","101101100011","101000011111","101010111101","011100010111","011010110000","100111101111","110101110100","011111011000","110010100000","010110100000","100010101111","100101001110","000101000000","100111110111","000101100100","010111101111","110100101000","110111001010","010011000000","000110110100","000110011010","110000010110","111000100100","001110001110","100011100111","100101000100","100110110100","110010110011","001100101000","000101001001","110101000100","100101010101","000101011101","111110000001","000101110001","011001011100","101001110010","010111001000","100000000111","101110101000","111000001011","101111110111","111000111010","011101000111","101111110001","011010101111","111100100100","100111000101","000011100110","011110110010","110110100001","011111010000","100111010000","011000101000","011001000111","000000001000","000100101010","010011001111","100100011100","011110100011","000010111101","000110010110","110010100010","001100011011","101101000001","110111101011","110101100000","100101011000","110111011111","111011100000","011101101101","110101001000","000100111000","101100101001","111101101111","000100111100","000101111110","011100101011","111101000101","111000101000","010111110001","111011001001","110001010010","110101001101","101101000010","110101010100","001100011010","001100001001","101011000101","110101010001","010111011100","001110110011","111110101000","101101010111","001110001010","011000011101","101111000011","101000000000","001000000010","000110111001","110100110110","111000100010","110011010000","101000101111","001100101111","111111111001","110001001000","010100010101","000100101100","101110111111","101001001100","010111100011","101100101101","101101001111","010110011010","000101001010","100111110010","101110000110","000000110111","001001010110","010101000110","001101000101","001011101000","101010110110","010111000000","111110001001","011101110001","000101110100","101110101011","100010101001","111001100101","011010010101","111010010000","001010110111","100111101101","001011001001","111100110001","000000000100","011010110111","100101011111","011000001110","100111010010","111111000111","011110110110","011000110011","000101101011","011011101101","001110111010","111011110100","001100101001","111001111011","111111101111","011011000101","011000110010","100011110001","111101110001","100010101100","010111111001","001001100100","100010111110","110111100111","100110000100","111110011000","110000100011","011000010010","011110011001","101011011111","010111001001","010001011101","111000100101","001011000111","010011111110","011110011110","011011111100","011000110000","101100111110","010101111110","110111100010","000111001101","111100000101","001001010010","001101111111","101000011001","000111010110","010101100011","011101110110","101100110010","100001010001","010110001010","010101011110","111110101101","000011111110","010010000100","010111000111","000110001011","010000101001","000000010000","100011100000","000001100110","101100011000","011001110001","010011011001","110000000111","000101101110","010011000111","110100011010","001110100111","000100010101","000110110111","100001010000","001110001000","111101100100","001001100000","100011111010","101111001110","100010111011","011110000110","101110100000","001100001100","011010010000","011001111100","110011011110","110110001111","001100010111","101110001100","101110101010","000010000111","101010000101","010011011010","010010011000","010100101011","001110000101","000110111111","011011110110","111111100110","100011110101","001011011110","111001111100","110011101001","011010001011","110001100001","101100101100","011100001001","010101011000","111111111011","110001111011","110111110011","111100001010","110011011000","100011001000","011100100000","110110110010","101011110101","001101100101","111001010000","111010100110","011011011101","001000011001","000111011100","111001001100","101111010000","100101101101","000010010110","101110111010","010011000011","001000011010","000101000010","100000110100","100000011101","110001001111","010100101100","100100010111","010111100001","010000111101","001000100101","101101111100","111001110101","111101010110","010101001100","100101011011","100001100101","001100101011","111101011110","001100100100","000000101100","010000101100","011010011011","111101101001","110010110111","010101111111","011001101000","011000010001","001111011011","001001011111","110101000000","110101000010","100111110100","111010011010","000011001111","101010110010","100101111001","100110100110","111001110011","011000100010","001110010011","001110001111","100101000101","111000011101","101111101010","011001100111","001000000011","010000010101","100111111100","011011011111","010110100110","010111101110","010001101010","000001101000","101011000111","111011000010","101101100000","000100010100","000010011011","111000101101","001100110000","111010100011","101100000110","100011100011","100011100001","111011110111","100111100100","111001110000","010111100000","111001011110","110011100101","111101010000","010101001010","100110101011","100101101001","101000001001","011110111101","010000110110","011111000000","111100101101","011100110011","011011000011","111000000001","001010101010","111011111101","110001110000","000001010001","101000100100","000001001100","101010010011","001000000100","010001111000","011100000001","111100111100","100011000011","111011110110","100000101111","111101000001","100100110100","010110111111","111100010011","100001000001","111101000000","110010001101","011110010011","110010111010","011011001111","110111101100","000000111001","010111111100","100110101000","110000110110","010010110100","101101001101","101100000010","000101000001","001001010100","000110111101","100100001011","100100110001","110001000001","111101011010","001010110001","110111000111","010101000011","111101101110","101011000000","010101100101","110010100110","001010001000","110000101001","010100100111","111110010111","000010110010","001101010001","101111110101","100011001010","110011111001","111001011010","100011101010","100111100101","001101110111","111000110101","010000100001","000000110110","010111110100","000111110011","000101000101","010101000101","001101101101","111000010111","000100000011","111011000001","001111001110","101110010101","010011010001","110111111110","001011100001","101010011110","110010010101","101100110001","001111111010","001111011111","010110111001","100101010010","110101110111","000110111011","100000010010","111000110100","000100111001","011011001010","110000000000","101001010011","100100001001","011111101100","011101110011","011101000101","000100100001","001011001011","110101101111","110010111111","100100100110","110110001000","001001101111","111001000000","001101111000","101110011010","110001101111","000000101010","110001001010","000110111110","101111010110","010000001000","111011110010","110111011110","010011000001","010101001111","001101110110","001000011111","010110110011","111000001101","010000110111","000101110110","000011011110","111110010010","100100110000","000100001111","011100101101","001101010000","100101001001","001001010000","000100001001","011100011101","101000111010","100111011110","000000001111","100001100100","111101100011","111001111010","110110100011","101110101111","101000001110","000011010101","010001000110","010110100101","010000110010","100110011001","100100101111","110110001001","111111010111","011010011111","111110011010","011011011011","111101001110","110111100001","011111101010","010010111000","000010010000","111110101010","011011101100","100100111000","110100000110","110111010100","101101011110","100100111011","101001011011","011000111001","111100111011","110101011010","101010101010","001010010010","101001110111","001001100010","001010101110","000001001111","011010001111","010110100111","011110110000","111001000101","001110100110","111001010010","101001010010","001011000010","111010101010","101010110000","111100010100","000111100111","110111100100"] diff --git a/Haskell/2021/04/day4.hs b/Haskell/2021/04/day4.hs new file mode 100644 index 0000000..a5d0831 --- /dev/null +++ b/Haskell/2021/04/day4.hs @@ -0,0 +1,99 @@ +checkBingo :: [[Integer]] -> Bool +checkBingo st + | checkHorzBingo st = True + | checkHorzBingo (transpose st) = True + | otherwise = False + +checkHorzBingo :: [[Integer]] -> Bool +checkHorzBingo [] = False +checkHorzBingo st + | checkLine (head st) = True + | otherwise = checkHorzBingo (tail st) + +checkLine :: [Integer] -> Bool +checkLine [] = True +checkLine xs + | x == -1 = checkLine (tail xs) + | otherwise = False + where x = head xs + +transpose :: [[a]] -> [[a]] +transpose [] = [] +transpose ([] : xss) = transpose xss +transpose ((x : xs) : xss) = combine x hds xs tls + where + (hds, tls) = unzip [(hd, tl) | hd : tl <- xss] + combine y h ys t = (y:h) : transpose (ys:t) + +winRank :: [[Integer]] -> [Integer] -> Integer +winRank board input = winRank' board input 0 + +winRank' :: [[Integer]] -> [Integer] -> Integer -> Integer +winRank' _ [] _ = -1 +winRank' board inputList rank + | checkBingo modifiedBoard = rank + | otherwise = winRank' modifiedBoard (tail inputList) (rank + 1) + where input = head inputList + modifiedBoard = modifyBoard board input + +calcScore :: [[Integer]] -> [Integer] -> Integer +calcScore _ [] = 0 +calcScore board inputList + | checkBingo modifiedBoard = calcScore' modifiedBoard input + | otherwise = calcScore modifiedBoard (tail inputList) + where input = head inputList + modifiedBoard = modifyBoard board input + +calcScore' :: [[Integer]] -> Integer -> Integer +calcScore' board lastNum = (sumUnmarkedBoard board) * lastNum + +sumUnmarkedBoard :: [[Integer]] -> Integer +sumUnmarkedBoard [] = 0 +sumUnmarkedBoard x = sumUnmarkedLine (head x) + sumUnmarkedBoard (tail x) + +sumUnmarkedLine :: [Integer] -> Integer +sumUnmarkedLine [] = 0 +sumUnmarkedLine line + | x == -1 = 0 + sumUnmarkedLine (tail line) + | otherwise = x + sumUnmarkedLine (tail line) + where x = (head line) + +modifyBoard :: [[Integer]] -> Integer -> [[Integer]] +modifyBoard board match = [[if x == match then -1 else x | x <- row] | row <- board] + +calcWinList :: [[[Integer]]] -> [Integer] -> [Integer] +calcWinList [] _ = [] +calcWinList boards input = winRank (head boards) input : calcWinList (tail boards) input + +calcBoards :: [[[Integer]]] -> [Integer] -> Integer +calcBoards boards input = calcScore (head (drop (findMinIndex (calcWinList boards input)) boards)) input + +calcBoardsLoser :: [[[Integer]]] -> [Integer] -> Integer +calcBoardsLoser boards input = calcScore (head (drop (findMaxIndex (calcWinList boards input)) boards)) input + +findMinIndex :: [Integer] -> Int +findMinIndex x = findMinIndex' x 10000000 0 0 + +findMinIndex' :: [Integer] -> Integer -> Int -> Int -> Int +findMinIndex' [] _ x _ = x +findMinIndex' list currentMin minIndex currentIndex + | current < currentMin = findMinIndex' (tail list) current currentIndex (currentIndex + 1) + | otherwise = findMinIndex' (tail list) currentMin minIndex (currentIndex + 1) + where current = (head list) + +findMaxIndex :: [Integer] -> Int +findMaxIndex x = findMaxIndex' x 0 0 0 + +findMaxIndex' :: [Integer] -> Integer -> Int -> Int -> Int +findMaxIndex' [] _ x _ = x +findMaxIndex' list currentMax maxIndex currentIndex + | current > currentMax = findMaxIndex' (tail list) current currentIndex (currentIndex + 1) + | otherwise = findMaxIndex' (tail list) currentMax maxIndex (currentIndex + 1) + where current = (head list) + +inputList1 = [7,4,9,5,11,17,23,2,0,14,21,24,10,16,13,6,15,25,12,22,18,20,8,19,3,26,1] +inputBoards1 = [[[22,13,17,11,0],[8,2,23,4,24],[21,9,14,16,7],[6,10,3,18,5],[1,12,20,15,19]],[[3,15,0,2,22],[9,18,13,17,5],[19,8,7,25,23],[20,11,10,24,4],[14,21,16,12,6]],[[14,21,17,24,4],[10,16,15,9,19],[18,8,23,26,20],[22,11,13,6,5],[2,0,12,3,7]]] + +inputList2 = [4,75,74,31,76,79,27,19,69,46,98,59,83,23,90,52,87,6,11,92,80,51,43,5,94,17,15,67,25,30,48,47,62,71,85,58,60,1,72,99,3,35,42,10,96,49,37,36,8,44,70,40,45,39,0,63,2,78,68,53,50,77,20,55,38,86,54,93,26,88,12,91,95,34,9,14,33,66,41,13,28,57,29,73,56,22,89,21,64,61,32,65,97,84,18,82,81,7,16,24] + +inputBoards2 = [[[30,46,94,20, 2],[53,67,69,75,65],[27,24,85,28,60],[57,58,42,36,78],[35,98,87,91,93]],[[72,71,91,73,19],[ 2,13,14, 8,74],[42,34,31,56, 9],[82,59,44,67,79],[49, 6,98,10,30]],[[95,24,25,11,34],[57,65,41,92, 8],[91,26, 1,62,38],[47,93, 4,37, 0],[15,44,33,20,97]],[[24,69,55, 7,25],[45,64,56,71,18],[94,10,62,19,36],[53,74,49,61,80],[50,68,60,76,84]],[[86,78,29, 1,71],[ 2, 9,24,34,96],[47,75,61,13,26],[10,66,28,83,14],[91,63,45,76,50]],[[61,60,22,11,95],[25,81,13,15,53],[59,89,65,18,39],[58,50, 1,47,52],[48,16,29,75,56]],[[62, 0,93,41,53],[69,47,29,50,46],[81, 8,20,38,23],[ 4,64, 5,37,27],[32,75,48,33,15]],[[97,75,15,55,36],[98,77,76, 3,69],[11,39,88,18,93],[94,99,59,50,63],[33,26,35,58,14]],[[58,91, 7,36,81],[44,90,46,57,93],[16,35,28,61,34],[60, 3,96,65,14],[24,49,94,11,77]],[[ 5,91,53,85,36],[ 6,64,41, 7,50],[87,94,96,15,49],[18,78,37,52,75],[28,34,16,71,48]],[[75,14, 2,52,49],[79,37,13,53,12],[91,73,94,72,36],[48,54, 3,93, 5],[40,85,42, 9,50]],[[26,53,24,58,95],[15,54,65,80,30],[90,72,27,40,47],[81,22,57, 1,17],[82,46,20,94,49]],[[60,25,86,18,92],[ 2,85,89, 5,55],[12,71,74,46,68],[33,52,82,84,29],[76,43,40,11,31]],[[21,23,93,46,60],[99,20,75,55, 4],[73, 9,74,92,16],[25,35, 0,70,90],[27,86,42,94,15]],[[69,73,42,46,53],[ 5,71,50, 6,74],[14,44,99,62,87],[54,84,86,94,21],[29,51,38,67, 8]],[[43,28,24,46,22],[61,15, 4,52,17],[62,77,18,56,85],[93,60,33,71,41],[63, 2, 6,68,92]],[[60,92,52,36,38],[66,34,26,19,25],[24,65,90,39,74],[17,97,96, 7,48],[50,55,57,73,64]],[[19,77,60,66,16],[41,54, 5,49, 6],[69,61,94,86,98],[67,37,87,71,72],[44,96,90,40,74]],[[90,49,68,74,32],[31,85,42,65,53],[76,43,41,36,20],[16,75,46,47,86],[54,44,95,13,23]],[[56, 0,88,99,76],[10,42,96,30,14],[67,73,16,21,35],[80,41,64,40,78],[13,19, 4,24,20]],[[79,98,28,58,41],[24,97,85,22,89],[12,81,68,50,47],[ 2,34,16, 6,95],[64,51,11,43,26]],[[ 6,39,79,95, 3],[82, 9,61,80,33],[94,87,13,70,11],[ 0, 8,37,35,19],[62,75,84,55,93]],[[44,51,54,27,94],[77,32,81,71,62],[98,91,68,41,89],[ 6,39,40,56,53],[73,88, 5,49,80]],[[97,29,15,61,83],[46,69,51,71,17],[40,94,49,14,66],[52,20,57,62,80],[19,72,75,84,36]],[[27,26,95,78,92],[98,18,31,51,45],[39,43,94,33,13],[50,16,71,30,22],[70,81,36,38,64]],[[90, 7,71,11,63],[25,39,61,17,46],[51,86,56,81,84],[14,33,37,23,60],[52,64, 8,65,29]],[[41,92,40,71,33],[90, 2,24,37,25],[ 0,94,74,53,69],[81,61, 1,70,88],[44,34,99,29,75]],[[63,39,44, 3,82],[68,95,67,28,49],[22,53,76,81,47],[15,75, 0,54, 6],[86,37,65,52,77]],[[11,64,39,47,72],[97,59,83,19,58],[12,65,92,89,28],[ 9,78,40,79,99],[17,50,71,18,68]],[[31,78,27,32,18],[97,20,60,68,88],[12, 5,99,49,82],[35, 6,87, 2,61],[70,53,63,36,93]],[[89, 4,50,54,80],[85,36,17, 5,71],[44,95,57,73,60],[46,92,25, 8,59],[98,82,21,93,99]],[[27,12,82,95,47],[ 8,21,69,83,64],[11, 7,88,26,30],[70,96,18,75,53],[28,22,56,52,29]],[[56, 1,30,13,53],[37,86,98,19, 9],[ 3,67,16,71,85],[83,79,48,54,14],[47,62,44,95,65]],[[51,18,87,35,55],[52,85,79,56,82],[83,26,24,29,43],[80,76, 4,45,13],[11,12,99,94,47]],[[14, 1,52,95,63],[54,27,67,92,98],[34,61,26,32,33],[76,77,49,83, 2],[97,59,12,71,80]],[[78,16,59,44, 5],[73,21,53,37,50],[25,86,88,61,74],[80,30,69,56,57],[98,39,26,58,51]],[[71,48,28,14,81],[69,67, 6,77,47],[94,83, 8,40,20],[30,58, 9,99,76],[51,24,91,21,52]],[[84,76,33,14,72],[37,36,25,12,34],[39,54,89,81,30],[ 2,15,46,10,22],[41,75,27,66,69]],[[ 8,20,53,16,86],[38,99, 4,11,60],[55,14,47, 1,48],[51,50,69,52,37],[ 3,56,32,79,68]],[[69,40,17,70,98],[12,86,41,35,50],[60,44, 8,20,81],[14,82,25,55, 4],[87,67,85, 3, 5]],[[72,90,14,78,94],[ 2,85,91,97,42],[84, 9,27,70,95],[55,56,74,73, 1],[11,59,13,67,18]],[[ 5,84,21,73,13],[11,46,35,79,99],[57,25,48,52, 2],[51,70,56,54,94],[37,62,47,43,41]],[[99,30,74,11,51],[48,90, 1,27,76],[71,63,28,86,10],[52, 5,83,16,69],[70,93,92,73,43]],[[52,70,58,95,82],[74,18,90,99,39],[12,51,71,48,47],[92,11,91,16,61],[41,62,97,68, 0]],[[20,32,76,50,55],[ 4,70,14,36,82],[74,10,97,26,87],[61,83,56,98,71],[64,38, 8,65,92]],[[63,68,84,36,41],[71,44,12,77,50],[18,92,54,58,23],[89,98,72,69,25],[62,38,42, 5,52]],[[59,65,60,84,49],[51,69,12,15,38],[70, 1,79,22,35],[66,88,85,83,32],[ 3,33,78,48,16]],[[79,91,35,90,77],[22,59,58,96,97],[99,84,34, 2,74],[10,92, 5, 4,45],[53,21,42,71,56]],[[43,23,45,81,34],[ 1,52, 7,24,51],[42,22,17,20,77],[31,21,29,19,79],[58,87,30,60,49]],[[81,64,86,76,70],[44,14,43,90, 2],[96,16,42,22, 7],[ 5,57,19,84,21],[95,74,80,28,72]],[[ 3,57,12,95,35],[61,72,98,39,17],[62,87,30,66, 4],[26,58,16,20,47],[37,46,13,42,85]],[[55,24,36,49,85],[19,39,88,73,61],[ 1,60,45,72,29],[47,12,53,76,44],[28,98,70,54, 0]],[[77,29,17,36,96],[35,64,93,37,83],[12,10,57,82, 7],[90,69, 0,86,32],[74,66,72,63,97]],[[53,18,82,30, 4],[ 6,47,28,80,71],[39,36,22,20,51],[ 7,57,26,34,79],[72,10,56,89, 1]],[[92,20,76,27,51],[72,82,39,95,38],[19,33,70,62,26],[79,99,40,30, 8],[94,80,10,91, 4]],[[56,21,15,54,60],[69,64,55, 0,59],[39,95,98,34,99],[24,76, 3, 6,30],[65,45,96,82,26]],[[59,55,44,79,12],[87,73,37,76,91],[68,92,51,49,36],[99,54, 3,71,64],[25,60,94,45,81]],[[23,67,96,86,98],[14,47,45,66,62],[73,76,74,54,50],[64,60,35,10,58],[99,81,34, 9,13]],[[71,44,19,13, 2],[18,80,24,11,85],[36, 1,99,26,52],[48,76,84,88,63],[61,30,49,86,35]],[[20,85,55,47,99],[18,49,38,65,61],[37,48,32, 6,15],[80,94,66,89,91],[ 1,44,36,92,21]],[[72,65, 4,76,16],[80,97,15,56,33],[14,40,50,11,57],[34,37,68,88,44],[ 6,38,21,49, 7]],[[39,80,87,32,21],[41,97,66,15,83],[68,69,28,88,62],[18, 2,48,58,77],[63,64,17,13,95]],[[44, 3,41,55,85],[83,75,13, 0,81],[95, 9,23, 8,26],[71,94,37,70,45],[77,82,62,87,19]],[[65,16,30,91,52],[78,67,24,58,11],[75,47,90, 0, 8],[83,88,73,60, 2],[46,59,77,32,19]],[[82,80, 0,24,85],[92,99,50,94,38],[19,98,10,51,32],[36,73,67,43,57],[46,21,13,69,37]],[[89,94,78, 1, 9],[16,34,18,15,38],[69,82,35,92,27],[66,64,68,63,26],[62,21,65,36,71]],[[15, 4,25,50,41],[69,98,12,74,21],[ 2,13,66,55,83],[93,90,23,27,33],[82,52,68,61,60]],[[57,21,28,29, 5],[67,35,19,62,68],[91,83, 3,33,99],[20,30,79,50,85],[60,89, 4, 7,36]],[[43, 4,81,19,77],[89,92,46,52,35],[ 1,21, 2,75,88],[ 8,97,26,62,71],[ 9,93,30,50,66]],[[42,46,38,85,82],[18,80,91, 1,40],[72,81,89,51,31],[37,20,24,67,92],[32,43,95,70,84]],[[90,48,63,15,45],[67,52, 2,26,31],[30,13,36,77,49],[60, 8,86,70,99],[94,27,85,78,34]],[[76,65,22,60,55],[81,88,54, 4,26],[72,39,86,12, 8],[68,46,98,28,99],[45,69,21, 7,35]],[[47,22,34,19,95],[30,15,39,51,10],[11,37,48,44,71],[ 2,89,92,78,35],[21,73,33,20,69]],[[ 6,70,84,25, 3],[21,12,55,78,49],[80,60,98,58,83],[17,96,69, 9,66],[76,59,39,86,51]],[[97,60,93,22,99],[ 2, 4,25,45,78],[43,53,63,41, 6],[64,74,16,56,28],[77,12,20,35,49]],[[82,10,91,16,77],[17,85,48,24, 1],[61,96,38,68,99],[41,42,25,66,56],[97,18,63,93,29]],[[95,37,83,61,17],[11,15,43, 6,24],[ 0,28,51,87, 9],[76,52, 2,64,32],[85,41,99,29, 7]],[[11,86, 3,39,80],[35,78,26,34,65],[46,79,44,64,66],[29,74,63,20, 0],[92,28,41,69,50]],[[99,58,15,51,28],[ 1,36,45,38,34],[46,94,35,44,88],[39,20, 8,59,61],[ 3, 4,37,14,63]],[[31,91,85,61,29],[66,54, 9,49, 2],[81,62,70,98,38],[68, 1,16,95,78],[59,52,53,21,36]],[[69,59,50,48,56],[17,61,16,92,47],[63,60,62, 5, 3],[37,97,38,83,58],[73,18,71,19,94]],[[55, 9,34,57,85],[31,37,30,16,64],[44,91,94, 6, 7],[90,87,77,59,50],[12,79,43,17,89]],[[90,53,57,28,58],[56,49,29, 8,12],[77,27,62,30,82],[71,98,63,37,83],[ 9,15,84,36,74]],[[80,56,52,44,71],[40, 5,26,28,46],[11,70,57,95,93],[85,29,21,84,35],[20,15,81,54,91]],[[60,86,80,79,11],[90,82,84,48,43],[92,81,39,57,47],[64,36, 4,71, 9],[78,62,53,51,66]],[[84,51,19,73,55],[42,18,75,96, 9],[47,46,12,98,93],[62,57,24, 6,74],[50,53,30,70,80]],[[57,60, 1,49,20],[93, 0,39, 6,74],[86, 9,56,41,25],[53,99,83,38,80],[37,79,18,23,45]],[[33,95,37,86,45],[62,65,16, 3,77],[ 4,14,82,61,13],[18,71,11, 8,23],[50,67,35,75,76]],[[43,30,48,38,86],[62,46,72,21,97],[ 0,18,91,17,42],[ 6,99,56,22,64],[15,25,79,13,55]],[[54,34,98,43,86],[39,47,56,52,95],[62,92, 6,70,29],[65,78,57,99,35],[72,55,20,88,77]],[[87,97,67,99,20],[58,50,30,78,31],[ 4, 6,96,85,70],[80,59,77,88,93],[ 9, 0,90,86, 3]],[[18,17,81,50, 8],[12,62,73,32,72],[41,90,42,11,79],[ 1, 7,94,13, 0],[77,33,23,83,74]],[[71,84,22,14,54],[98,34,56,81,33],[58,39, 6,46,96],[15, 7,11,13,37],[70, 5, 2, 9,68]],[[28,58,11,63,26],[ 6,14,44,70,93],[32,52,60,96, 3],[76, 0,75,66,71],[50,54,34,30,98]],[[91,26, 2,53,92],[45,67,68,32,50],[80,30,15,78,73],[10,14,28,27, 0],[21,38,88,22, 5]],[[42,11,23,88,41],[54,58, 8,74,40],[ 6,13,80,89,82],[81, 3, 5,53,76],[47,39, 9,25,46]],[[82,14,52,43,95],[15,37,12,58,80],[64,97,45,61,49],[71,65,29,25, 9],[21,11,51, 1,87]],[[20,80,50,27,90],[21,35, 9,40,81],[89,16,26,74,84],[29,97,88,19,32],[85,63,10,46,52]],[[16,66, 0,53,40],[94,42,80,86,25],[11,15,68,35, 5],[60,89,41,92,79],[51,77,88,36,67]],[[51,65,33,97,81],[78,96,86,64,22],[10,28,93, 2,14],[71,29,92, 6,62],[98,38,35, 0,70]]] diff --git a/Haskell/2021/05/day5.hs b/Haskell/2021/05/day5.hs new file mode 100644 index 0000000..a260727 --- /dev/null +++ b/Haskell/2021/05/day5.hs @@ -0,0 +1,62 @@ +horzLineToDiagram :: Integer -> Integer -> Integer -> [(Integer, Integer)] +horzLineToDiagram row current finish + | current == finish = (row, finish) : [] + | current > finish = horzLineToDiagram row finish current + | otherwise = (row, current) : horzLineToDiagram row (current + 1) finish + +vertLineToDiagram :: Integer -> Integer -> Integer -> [(Integer, Integer)] +vertLineToDiagram column current finish + | current == finish = (finish, column) : [] + | current > finish = vertLineToDiagram column finish current + | otherwise = (current, column) : vertLineToDiagram column (current + 1) finish + +upRightLineToDiagram :: Integer -> Integer -> Integer -> Integer -> [(Integer, Integer)] +upRightLineToDiagram curRow curColumn finishRow finishColumn + | curRow == finishRow = (finishRow, finishColumn) : [] + | curRow > finishRow = upRightLineToDiagram finishColumn finishRow curRow curColumn + | otherwise = (curRow, curColumn) : upRightLineToDiagram (curRow + 1) (curColumn + 1) finishRow finishColumn + +downRightLineToDiagram :: Integer -> Integer -> Integer -> Integer -> [(Integer, Integer)] +downRightLineToDiagram curRow curColumn finishRow finishColumn + | curRow == finishRow = (finishRow, finishColumn) : [] + | curColumn > finishColumn = downRightLineToDiagram finishColumn finishRow curRow curColumn + | otherwise = (curRow, curColumn) : downRightLineToDiagram (curRow - 1) (curColumn + 1) finishRow finishColumn + +calculateDiagram :: [((Integer,Integer),(Integer,Integer))] -> [(Integer, Integer)] +calculateDiagram [] = [] +calculateDiagram ls + | x1 == x2 = horzLineToDiagram x1 y1 y2 ++ calculateDiagram (tail ls) + | y1 == y2 = vertLineToDiagram y1 x1 x2 ++ calculateDiagram (tail ls) + | diagUpRight (head ls) = upRightLineToDiagram x1 y1 x2 y2 ++ calculateDiagram (tail ls) + | diagDownRight (head ls) = downRightLineToDiagram x1 y1 x2 y2 ++ calculateDiagram (tail ls) + | otherwise = calculateDiagram (tail ls) + where ((x1,y1),(x2,y2)) = head ls + +diagUpRight :: ((Integer,Integer),(Integer,Integer)) -> Bool +diagUpRight ((x1,y1), (x2,y2)) + | x1-x2 == y1-y2 = True + | otherwise = False + +diagDownRight :: ((Integer,Integer),(Integer,Integer)) -> Bool +diagDownRight ((x1,y1), (x2,y2)) + | abs (x1-x2) == abs (y1-y2) = True + | otherwise = False + +instances :: (Eq a) => a -> [a] -> Int +instances _ [] = 0 +instances x (y:ys) + | x == y = 1 + (instances x ys) + | otherwise = instances x ys + +numOccurances :: [(Integer,Integer)] -> Int +numOccurances [] = 0 +numOccurances ls + | occurances >= 2 = 1 + numOccurances newLs + | otherwise = numOccurances newLs + where item = head ls + occurances = instances item ls + newLs = [x | x <- ls, x /= item] + +dummyInput = [((0,9),(5,9)),((8,0),(0,8)),((9,4),(3,4)),((2,2),(2,1)),((7,0),(7,4)),((6,4),(2,0)),((0,9),(2,9)),((3,4),(1,4)),((0,0),(8,8)),((5,5),(8,2))] + +input = [((427,523),(427,790)),((94,639),(94,951)),((757,371),(465,663)),((503,935),(503,148)),((655,565),(655,951)),((167,754),(710,211)),((634,433),(245,433)),((449,889),(449,509)),((152,753),(207,808)),((301,90),(301,982)),((566,405),(482,405)),((758,741),(847,652)),((342,686),(921,107)),((741,317),(741,533)),((976,917),(976,664)),((273,272),(273,899)),((326,616),(326,478)),((483,906),(391,814)),((20,165),(20,349)),((860,533),(860,137)),((846,834),(846,610)),((155,923),(241,923)),((989,984),(17,12)),((711,681),(82,52)),((312,788),(312,281)),((319,746),(892,746)),((568,555),(757,555)),((659,450),(940,450)),((870,260),(870,487)),((110,794),(604,794)),((509,141),(509,99)),((29,68),(29,713)),((340,688),(820,688)),((428,46),(902,520)),((539,525),(539,210)),((181,822),(806,822)),((551,338),(551,79)),((894,542),(894,151)),((700,625),(700,60)),((143,736),(143,770)),((810,975),(54,219)),((44,373),(44,514)),((849,794),(120,794)),((347,690),(97,440)),((10,625),(57,625)),((541,202),(799,202)),((375,491),(809,925)),((271,474),(271,905)),((980,825),(980,908)),((600,751),(624,751)),((120,978),(958,140)),((262,916),(262,794)),((399,350),(399,666)),((623,270),(158,735)),((585,792),(585,381)),((168,34),(168,88)),((256,806),(566,806)),((196,397),(326,397)),((583,677),(172,677)),((45,242),(311,508)),((530,469),(433,566)),((46,101),(877,932)),((607,655),(485,777)),((773,672),(461,360)),((340,30),(659,30)),((846,952),(846,917)),((457,700),(125,368)),((571,656),(561,656)),((251,30),(576,30)),((79,197),(79,87)),((518,51),(518,904)),((916,802),(181,67)),((23,626),(485,626)),((956,106),(956,811)),((849,384),(743,278)),((893,153),(893,608)),((17,989),(933,73)),((701,119),(701,704)),((494,580),(494,821)),((605,740),(605,363)),((823,58),(823,166)),((250,363),(566,363)),((418,178),(783,178)),((273,82),(273,115)),((545,489),(656,489)),((468,671),(966,671)),((376,744),(178,942)),((62,728),(589,201)),((588,150),(467,29)),((202,664),(751,115)),((519,547),(916,150)),((803,483),(380,60)),((599,459),(922,459)),((162,680),(162,385)),((823,94),(18,899)),((802,734),(415,347)),((115,964),(115,935)),((749,595),(749,770)),((229,64),(582,64)),((103,496),(551,48)),((137,581),(707,11)),((501,563),(895,957)),((59,222),(620,222)),((874,249),(874,938)),((201,927),(927,201)),((630,619),(655,619)),((666,331),(413,78)),((517,650),(425,558)),((803,256),(803,598)),((303,460),(606,763)),((124,975),(967,132)),((867,528),(867,363)),((239,140),(239,211)),((975,779),(364,168)),((971,49),(531,49)),((408,932),(143,932)),((927,663),(392,128)),((497,246),(497,389)),((849,935),(15,101)),((582,517),(543,517)),((410,85),(237,85)),((292,316),(841,316)),((753,708),(753,38)),((266,328),(267,327)),((789,980),(16,207)),((514,963),(514,180)),((865,532),(687,710)),((544,620),(956,208)),((132,287),(557,287)),((268,710),(268,684)),((234,746),(234,688)),((51,906),(51,911)),((191,159),(428,159)),((834,956),(834,565)),((916,242),(230,928)),((227,789),(227,689)),((206,767),(705,268)),((291,403),(578,403)),((35,890),(956,890)),((185,618),(402,401)),((989,858),(284,858)),((391,284),(391,74)),((717,158),(670,111)),((188,146),(785,743)),((602,696),(602,367)),((975,972),(975,317)),((146,301),(146,205)),((328,215),(861,215)),((15,653),(990,653)),((48,101),(48,34)),((929,547),(506,970)),((901,519),(670,519)),((801,560),(19,560)),((953,829),(876,829)),((856,317),(856,787)),((618,171),(86,703)),((823,622),(369,168)),((209,291),(846,928)),((944,601),(944,544)),((678,223),(987,223)),((893,143),(54,982)),((30,740),(244,740)),((974,974),(15,15)),((497,557),(63,557)),((846,193),(846,964)),((83,119),(946,982)),((864,179),(864,387)),((583,312),(77,818)),((612,154),(612,641)),((487,136),(487,938)),((502,611),(215,898)),((648,978),(648,885)),((373,372),(318,372)),((582,988),(168,574)),((453,261),(899,261)),((467,578),(33,578)),((876,138),(683,331)),((708,248),(132,824)),((686,56),(686,211)),((687,964),(687,485)),((626,76),(626,222)),((630,176),(630,485)),((968,608),(968,382)),((943,69),(943,856)),((173,344),(173,902)),((193,918),(326,918)),((811,748),(379,316)),((484,941),(113,570)),((277,635),(156,514)),((770,573),(691,573)),((37,475),(464,475)),((720,856),(676,856)),((988,13),(25,976)),((414,74),(140,74)),((169,158),(29,298)),((611,910),(611,718)),((851,161),(507,161)),((76,969),(76,114)),((270,243),(976,949)),((375,607),(325,657)),((738,450),(196,450)),((153,776),(153,325)),((862,123),(862,535)),((705,933),(931,933)),((900,26),(35,891)),((870,66),(79,857)),((815,569),(347,569)),((950,290),(757,290)),((719,446),(317,848)),((243,531),(671,531)),((320,807),(380,807)),((221,984),(221,858)),((832,308),(832,950)),((522,694),(584,694)),((412,48),(412,328)),((898,690),(646,690)),((602,191),(106,191)),((58,961),(58,879)),((177,413),(147,383)),((48,159),(48,639)),((18,935),(883,70)),((26,68),(406,68)),((579,73),(579,523)),((975,825),(975,737)),((390,125),(737,472)),((127,179),(127,111)),((506,557),(576,487)),((161,210),(324,47)),((524,165),(524,67)),((938,790),(184,36)),((302,431),(548,677)),((559,363),(559,913)),((936,10),(176,770)),((828,976),(657,976)),((864,14),(864,607)),((28,46),(28,347)),((732,742),(732,615)),((91,712),(91,279)),((982,884),(772,674)),((917,47),(683,47)),((631,697),(83,697)),((463,413),(463,949)),((719,348),(197,870)),((980,25),(24,981)),((64,608),(410,954)),((103,882),(103,842)),((279,10),(830,561)),((409,573),(409,247)),((673,291),(222,291)),((315,143),(942,770)),((216,89),(80,225)),((134,936),(967,103)),((387,566),(82,566)),((282,259),(862,839)),((930,225),(930,775)),((460,370),(460,922)),((276,254),(518,496)),((647,881),(293,527)),((983,977),(90,84)),((336,836),(336,392)),((96,888),(963,21)),((42,47),(978,983)),((923,280),(726,83)),((311,486),(505,292)),((496,637),(861,637)),((575,438),(575,498)),((228,754),(228,599)),((965,963),(21,19)),((834,171),(730,171)),((497,234),(497,448)),((977,970),(977,618)),((335,422),(335,640)),((931,954),(36,59)),((140,966),(871,235)),((352,88),(449,88)),((631,332),(735,332)),((765,823),(48,106)),((496,685),(103,685)),((89,416),(89,37)),((121,544),(569,544)),((643,712),(596,712)),((662,656),(739,656)),((42,386),(42,697)),((959,875),(959,527)),((874,967),(120,213)),((962,649),(240,649)),((627,714),(266,714)),((148,301),(148,383)),((883,491),(883,605)),((242,401),(348,401)),((660,931),(420,931)),((475,72),(955,552)),((912,949),(912,881)),((928,330),(45,330)),((474,203),(131,203)),((805,459),(818,459)),((534,645),(639,750)),((68,911),(933,46)),((717,276),(21,972)),((233,615),(957,615)),((902,495),(902,867)),((230,427),(230,421)),((630,917),(845,917)),((884,903),(34,53)),((157,205),(157,409)),((857,588),(608,588)),((422,863),(422,469)),((890,83),(722,251)),((546,318),(138,726)),((691,881),(52,242)),((171,435),(209,435)),((978,15),(702,15)),((581,86),(581,282)),((61,767),(61,903)),((835,289),(835,941)),((176,351),(707,882)),((571,84),(571,788)),((700,373),(700,650)),((40,40),(945,945)),((82,616),(809,616)),((351,402),(455,402)),((517,242),(73,686)),((489,795),(814,795)),((543,734),(611,734)),((688,849),(688,571)),((631,903),(883,903)),((312,636),(667,281)),((213,575),(699,89)),((752,128),(161,719)),((754,931),(754,474)),((748,666),(748,54)),((123,667),(57,667)),((140,497),(140,644)),((634,961),(187,514)),((822,865),(822,126)),((58,162),(632,736)),((417,164),(166,164)),((943,597),(943,274)),((355,756),(355,167)),((340,546),(232,438)),((166,125),(166,96)),((354,394),(354,579)),((147,844),(155,844)),((652,723),(719,656)),((584,582),(667,665)),((514,373),(685,202)),((308,404),(966,404)),((124,179),(916,971)),((706,597),(455,597)),((52,822),(510,364)),((419,900),(860,900)),((153,649),(872,649)),((915,160),(56,160)),((422,346),(422,38)),((940,73),(940,784)),((922,581),(922,753)),((949,821),(949,621)),((591,778),(145,778)),((93,685),(164,756)),((287,469),(287,948)),((953,952),(446,445)),((935,47),(12,970)),((458,109),(458,639)),((71,643),(644,70)),((812,214),(812,655)),((488,496),(158,496)),((113,868),(755,226)),((666,429),(666,920)),((962,246),(517,246)),((400,261),(400,713)),((601,617),(943,275)),((904,847),(120,63)),((556,334),(278,612)),((416,463),(59,463)),((724,401),(871,548)),((701,210),(426,485)),((786,116),(786,904)),((976,979),(157,160)),((674,377),(674,891)),((321,829),(891,829)),((404,84),(404,800)),((975,850),(906,781)),((753,331),(978,331)),((87,240),(87,383)),((167,390),(167,20)),((258,931),(107,780)),((672,313),(696,313)),((589,88),(589,13)),((637,65),(637,808)),((532,610),(532,756)),((612,482),(318,482)),((522,322),(135,322)),((89,49),(89,679)),((475,506),(475,973)),((385,348),(229,348)),((633,978),(633,255)),((978,833),(978,436)),((746,553),(707,553)),((970,820),(970,548)),((589,59),(589,19)),((674,890),(16,890)),((838,315),(413,740)),((39,129),(860,950)),((923,755),(425,257)),((757,929),(940,746)),((639,390),(104,925)),((650,512),(260,902)),((718,90),(987,90)),((352,228),(795,671)),((141,629),(491,279)),((755,616),(368,616)),((117,113),(707,703)),((206,73),(926,793)),((372,415),(372,130)),((894,632),(611,632)),((974,554),(878,554)),((823,710),(823,972)),((730,711),(582,859)),((94,912),(108,912)),((782,190),(88,884)),((668,567),(336,567)),((87,266),(327,506)),((738,303),(36,303)),((320,358),(445,358)),((566,725),(695,725)),((94,364),(94,64)),((884,184),(159,909)),((947,575),(947,662)),((658,741),(658,470)),((512,776),(512,960)),((96,757),(950,757)),((349,604),(349,760)),((459,247),(355,143)),((90,12),(95,12)),((28,27),(981,980)),((388,959),(508,959)),((704,194),(148,194)),((349,546),(349,259)),((30,38),(720,728)),((307,631),(307,282)),((520,417),(154,417)),((746,771),(924,771)),((838,932),(20,114)),((406,141),(406,75)),((15,35),(963,983)),((264,143),(948,827)),((545,899),(742,899)),((759,356),(309,356)),((686,707),(224,245)),((226,985),(962,249)),((826,628),(826,637)),((985,329),(683,631)),((586,283),(586,258)),((602,703),(243,703)),((419,883),(419,556)),((475,375),(211,111)),((981,15),(19,977)),((989,10),(10,989)),((238,350),(479,591)),((720,714),(603,714)),((969,985),(35,51)),((844,356),(837,349)),((450,354),(450,834)),((385,870),(385,758)),((911,856),(89,34)),((948,124),(989,124)),((439,556),(439,310)),((990,233),(990,633)),((747,723),(943,527)),((418,23),(804,23)),((876,96),(38,934)),((556,92),(532,92)),((727,155),(727,279)),((674,545),(940,811)),((118,879),(420,879)),((141,50),(426,335)),((591,180),(591,537)),((662,511),(681,511)),((776,858),(776,956)),((872,329),(87,329)),((183,985),(114,985)),((186,179),(186,801)),((354,933),(491,933)),((10,223),(759,972)),((112,626),(702,36)),((498,78),(161,78)),((196,61),(814,679)),((629,71),(116,71)),((23,281),(23,32)),((819,810),(432,423)),((187,276),(187,912)),((95,683),(576,683)),((125,813),(856,82)),((98,882),(140,882)),((843,909),(198,909)),((192,904),(192,335)),((375,342),(375,668)),((61,804),(61,832)),((475,387),(966,878)),((822,740),(822,186))] diff --git a/Haskell/2021/05/day5_1.hs b/Haskell/2021/05/day5_1.hs new file mode 100644 index 0000000..c07f7e2 --- /dev/null +++ b/Haskell/2021/05/day5_1.hs @@ -0,0 +1,38 @@ +fand :: Bool -> Bool -> Bool +fand a b + | a == b = True + | otherwise = false + +numberIntersections :: ((Integer, Integer), (Integer, Integer)) -> ((Integer, Integer), (Integer, Integer)) -> Int +numberIntersections ls1 ls2 + | fand (orien11 /= orien12) (orien21 /= orien22) = 1 + | + where orien11 = orientation (fst ls1) (snd ls1) (fst ls2) + orien12 = orientation (fst ls1) (snd ls1) (snd ls2) + orien21 = orientation (fst ls2) (snd ls2) (fst ls1) + orien22 = orientation (fst ls2) (snd ls2) (snd ls1) + +onSegment :: (Integer, Integer) -> (Integer, Integer) -> (Integer, Integer) -> Int +onSegment p q r = + +onSegmentFst :: Integer -> Integer -> Integer -> Bool +onSegmentFst p q r = fand (onSegmentLE (fst q) (fst p) (fst r)) (onSegmentGE (fst q) (fst p) (fst r)) + +onSegmentSnd :: Integer -> Integer -> Integer -> Bool +onSegmentSnd p q r = fand (onSegmentLE (snd q) (snd p) (snd r)) (onSegmentGE (snd q) (snd p) (snd r)) + +onSegmentGE :: Integer -> Integer -> Integer -> Bool +onSegmentGE a b c = a >= (min b c) + +onSegmentLE :: Integer -> Integer -> Integer -> Bool +onSegmentLE a b c = a <= (max b c) + +orientation :: (Integer, Integer) -> (Integer, Integer) -> (Integer, Integer) -> Int +orientation p q r + | value == 0 = 0 -- Collinear + | value > 0 = 1 -- Clockwise + | otherwise = -1 -- CounterClockwise + where value = ((snd q) - (snd p)) * ((fst r) - (fst q)) - ((fst q) - (fst p)) * ((snd r) - (snd q)) + + +dummyInput = [((0,9),(5,9)),((8,0),(0,8)),((9,4),(3,4)),((2,2),(2,1)),((7,0),(7,4)),((6,4),(2,0)),((0,9),(2,9)),((3,4),(1,4)),((0,0),(8,8)),((5,5),(8,2))] diff --git a/Haskell/2021/05/day5_2.hs b/Haskell/2021/05/day5_2.hs new file mode 100644 index 0000000..0bd7e55 --- /dev/null +++ b/Haskell/2021/05/day5_2.hs @@ -0,0 +1,49 @@ +fand :: Bool -> Bool -> Bool +fand a b + | a == b = a + | otherwise = False + +betweenxAndy :: Int -> Int -> Int -> Bool +betweenxAndy x y n = fand (n >= x) (n <= y) + +between0And1 :: Int -> Bool +between0And1 = betweenxAndy 0 1 + +crossProduct :: (Integer, Integer) -> (Integer, Integer) -> Integer +crossProduct (x1, y1) (x2, y2) = x1*y2 - x2*y1 + +dotProduct :: (Integer, Integer) -> (Integer, Integer) -> Integer +dotProduct (x1, y1) (x2, y2) = x1*x2 + y1*y2 + +pointDifference :: (Integer, Integer) -> (Integer, Integer) -> (Integer, Integer) +pointDifference (x1, y1) (x2, y2) = (x1-x2, y1-y2) + +pointSum :: (Integer, Integer) -> (Integer, Integer) -> (Integer, Integer) +pointSum (x1, y1) (x2, y2) = (x1+x2, y1+y2) + +overlapNums :: ((Integer,Integer),(Integer,Integer)) -> ((Integer,Integer),(Integer,Integer)) -> Int +overlapNums (p, r) (q, s) + | collinear = + | paraNonInter = 0 + | intersect = 1 + | otherwise = 0 + where bottom = crossProduct r s + tTop = crossProduct (pointDifference q p) s + top = crossProduct (pointDifference q p) r + collinear = fand (bottom == 0) (top == 0) + paraNonInter = fand (bottom == 0) (top /= 0) + u = top / bottom + t = tTop / bottom + intersect = fand (bottom /= 0) (fand (between0And1 u) (between0And1 t)) + +collineComp :: ((Integer,Integer),(Integer,Integer)) -> ((Integer,Integer),(Integer,Integer)) -> Int +collineComp (p, r) (q, s) + | fand (t0' < 0) (t1 >= 0) = 0-- overlapping + | fand (t0' >= 0) (t1 <= 1) = 0-- overlapping + | otherwise = 0 -- Disjoint + where t0 = (dotProduct (pointDifference p q) r) / dotProduct r r + t1 = (dotProduct (pointDifference (pointSum q s) p) r) / dotProduct r r + t0' = if t0 > t1 then t1 else t0 + t1' = if t0 > t1 then t0 else t1 + +collineComp :: ((Integer,Integer),(Integer,Integer)) -> ((Integer,Integer),(Integer,Integer)) -> Int diff --git a/Haskell/2021/06/day6.hs b/Haskell/2021/06/day6.hs new file mode 100644 index 0000000..4baaea9 --- /dev/null +++ b/Haskell/2021/06/day6.hs @@ -0,0 +1,18 @@ +fishGrowth :: [Integer] -> [Integer] +fishGrowth [] = [] +fishGrowth (x:xs) + | x == 0 = 6 : 8 : fishGrowth xs + | otherwise = (x-1) : fishGrowth xs + +runFishGrowth :: [Integer] -> Int -> [Integer] +runFishGrowth ls 0 = ls +runFishGrowth ls x = runFishGrowth (fishGrowth ls) (x-1) + +fishGrowth' :: [(Int, Integer)] -> Int -> Int -> [(Int, Integer)] +fishGrowth' [] new _ = (8,x) : [] +fishGrowth' (stage,num):xs new reset + | stage == 0 = fishGrowth' xs new num + | stage == 7 = (6, num + reset) : fishGrowth' xs new 0 + | otherwise = ((stage-1), num) : fishGrowth' xs new 0 + +input = [1,2,1,3,2,1,1,5,1,4,1,2,1,4,3,3,5,1,1,3,5,3,4,5,5,4,3,1,1,4,3,1,5,2,5,2,4,1,1,1,1,1,1,1,4,1,4,4,4,1,4,4,1,4,2,1,1,1,1,3,5,4,3,3,5,4,1,3,1,1,2,1,1,1,4,1,2,5,2,3,1,1,1,2,1,5,1,1,1,4,4,4,1,5,1,2,3,2,2,2,1,1,4,3,1,4,4,2,1,1,5,1,1,1,3,1,2,1,1,1,1,4,5,5,2,3,4,2,1,1,1,2,1,1,5,5,3,5,4,3,1,3,1,1,5,1,1,4,2,1,3,1,1,4,3,1,5,1,1,3,4,2,2,1,1,2,1,1,2,1,3,2,3,1,4,5,1,1,4,3,3,1,1,2,2,1,5,2,1,3,4,5,4,5,5,4,3,1,5,1,1,1,4,4,3,2,5,2,1,4,3,5,1,3,5,1,3,3,1,1,1,2,5,3,1,1,3,1,1,1,2,1,5,1,5,1,3,1,1,5,4,3,3,2,2,1,1,3,4,1,1,1,1,4,1,3,1,5,1,1,3,1,1,1,1,2,2,4,4,4,1,2,5,5,2,2,4,1,1,4,2,1,1,5,1,5,3,5,4,5,3,1,1,1,2,3,1,2,1,1] diff --git a/2021/06/day6.py b/Python/2021/06/day6.py similarity index 100% rename from 2021/06/day6.py rename to Python/2021/06/day6.py diff --git a/2021/07/day7.py b/Python/2021/07/day7.py similarity index 100% rename from 2021/07/day7.py rename to Python/2021/07/day7.py diff --git a/2021/07/day7_initial.py b/Python/2021/07/day7_initial.py similarity index 100% rename from 2021/07/day7_initial.py rename to Python/2021/07/day7_initial.py diff --git a/2021/08/day8.py b/Python/2021/08/day8.py similarity index 100% rename from 2021/08/day8.py rename to Python/2021/08/day8.py