From d7f1ba55ed5ae396c1c679c47928aed22e4bc6f5 Mon Sep 17 00:00:00 2001 From: James Griffin Date: Wed, 2 Dec 2020 12:04:50 -0400 Subject: [PATCH] Day 1: Part 1 --- .gitignore | 2 + go.mod | 3 + main.go | 11 +++ one/day_one.go | 67 +++++++++++++++ one/day_one_test.go | 35 ++++++++ one/expenses.txt | 200 ++++++++++++++++++++++++++++++++++++++++++++ one/sample.txt | 6 ++ 7 files changed, 324 insertions(+) create mode 100644 go.mod create mode 100644 main.go create mode 100644 one/day_one.go create mode 100644 one/day_one_test.go create mode 100644 one/expenses.txt create mode 100644 one/sample.txt diff --git a/.gitignore b/.gitignore index 66fd13c..e75e2aa 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,5 @@ # Dependency directories (remove the comment below to include it) # vendor/ + +aoc2020 \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..82eb2b5 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module github.com/thatguygriff/aoc2020 + +go 1.15 diff --git a/main.go b/main.go new file mode 100644 index 0000000..be8ef8f --- /dev/null +++ b/main.go @@ -0,0 +1,11 @@ +package main + +import ( + "fmt" + + "github.com/thatguygriff/aoc2020/one" +) + +func main() { + fmt.Println(one.PartOne()) +} diff --git a/one/day_one.go b/one/day_one.go new file mode 100644 index 0000000..e9bede9 --- /dev/null +++ b/one/day_one.go @@ -0,0 +1,67 @@ +package one + +import ( + "bufio" + "fmt" + "os" + "strconv" +) + +type expenseReport struct { + expenses []int +} + +func (e *expenseReport) load(filename string) error { + file, err := os.Open(filename) + if err != nil { + return err + } + defer file.Close() + + scanner := bufio.NewScanner(file) + for scanner.Scan() { + value, err := strconv.Atoi(scanner.Text()) + if err != nil { + return err + } + e.expenses = append(e.expenses, value) + } + + return nil +} + +func (e *expenseReport) searchAndMultiply(target int) (int, error) { + for i := 0; i < len(e.expenses); i++ { + if e.expenses[i] > target { + continue + } + + for j := i + 1; j < len(e.expenses); j++ { + if e.expenses[j] > target { + continue + } + + if (e.expenses[i] + e.expenses[j]) == target { + return e.expenses[i] * e.expenses[j], nil + } + } + } + + return -1, fmt.Errorf("Unable to find target pair that sums to %d", target) +} + +// PartOne Find the multiplied value of the two expenses totalling 2020 +func PartOne() string { + report := expenseReport{} + err := report.load("one/expenses.txt") + if err != nil { + return fmt.Sprintf("Unable to load expenses: %s", err.Error()) + } + + result, err := report.searchAndMultiply(2020) + if err != nil { + return err.Error() + } + + return fmt.Sprintf("The output of the expenses summing to 2020 is %d", result) +} diff --git a/one/day_one_test.go b/one/day_one_test.go new file mode 100644 index 0000000..35e29f5 --- /dev/null +++ b/one/day_one_test.go @@ -0,0 +1,35 @@ +package one + +import "testing" + +func Test_expenseReport_load(t *testing.T) { + report := expenseReport{} + if err := report.load("sample.txt"); err != nil { + t.Log(err) + t.FailNow() + } + + if len(report.expenses) != 6 { + t.Logf("Expected 6 expenses, Got %d expesnes", len(report.expenses)) + t.FailNow() + } +} + +func Test_expenseReport_searchAndMultiply(t *testing.T) { + report := expenseReport{ + expenses: []int{ + 1721, + 979, + 366, + 299, + 675, + 1456, + }, + } + + result, _ := report.searchAndMultiply(2020) + if result != 514579 { + t.Logf("Expected 514579, Got %d", result) + t.FailNow() + } +} diff --git a/one/expenses.txt b/one/expenses.txt new file mode 100644 index 0000000..4b6f874 --- /dev/null +++ b/one/expenses.txt @@ -0,0 +1,200 @@ +1728 +1621 +1856 +1683 +1940 +1097 +1711 +1906 +2008 +1608 +2003 +1990 +1864 +1035 +1981 +1978 +1955 +1907 +1198 +1087 +1835 +1961 +1941 +1903 +1675 +417 +1842 +1802 +1639 +1601 +1546 +1909 +1061 +1031 +1996 +1717 +1972 +1900 +1443 +1873 +1851 +2010 +1650 +1975 +1002 +1142 +1747 +1640 +1924 +1824 +1539 +1937 +1715 +1871 +1867 +1428 +1861 +1914 +1986 +1976 +1111 +1858 +1869 +1899 +1171 +1041 +1662 +1222 +1709 +1889 +1950 +1960 +1989 +1737 +1600 +1444 +1725 +1710 +1653 +1745 +1922 +1945 +1189 +1917 +1891 +1718 +1997 +1631 +1053 +1750 +1634 +1822 +1706 +1160 +1619 +1665 +1687 +1648 +1818 +1655 +1736 +1881 +489 +1598 +1923 +1962 +1918 +1689 +1616 +1825 +1723 +1767 +591 +1734 +1949 +1645 +1344 +1959 +1758 +1068 +1843 +1826 +1849 +2005 +1777 +144 +2009 +1982 +1911 +1288 +1595 +1094 +2000 +1713 +1973 +1971 +1916 +1666 +1105 +1806 +1868 +1944 +1654 +1809 +1726 +1672 +1060 +1065 +1521 +1921 +1966 +1113 +1149 +1607 +1980 +1023 +1855 +1948 +1638 +1930 +1866 +1954 +1697 +1884 +1832 +2004 +914 +1845 +1043 +1854 +1223 +1913 +1984 +1910 +1793 +1878 +1248 +617 +1927 +1527 +1819 +1350 +1807 +1722 +1016 +1700 +111 +1629 +1932 +1644 +1454 +1987 +1925 +1953 +1743 +1180 +1782 +1523 +1245 +1620 \ No newline at end of file diff --git a/one/sample.txt b/one/sample.txt new file mode 100644 index 0000000..0bb977d --- /dev/null +++ b/one/sample.txt @@ -0,0 +1,6 @@ +1721 +979 +366 +299 +675 +1456 \ No newline at end of file