From 455d0734269a8ad62eb512ae088c11601357b966 Mon Sep 17 00:00:00 2001 From: Oscar Blue Date: Sat, 16 Mar 2024 21:45:55 +0000 Subject: [PATCH] Day 3 --- 2023/day03/part01/src/code-file.txt | 140 +++++++++++++ 2023/day03/part01/src/main.go | 198 +++++++++++++++++++ 2023/day03/part02/demo-input.txt | 10 + 2023/day03/part02/input copy.txt | 140 +++++++++++++ 2023/day03/part02/input.txt | 140 +++++++++++++ 2023/day03/part02/src/code-file.txt | 140 +++++++++++++ 2023/day03/part02/src/main.go | 291 ++++++++++++++++++++++++++++ 7 files changed, 1059 insertions(+) create mode 100644 2023/day03/part01/src/code-file.txt create mode 100644 2023/day03/part01/src/main.go create mode 100644 2023/day03/part02/demo-input.txt create mode 100644 2023/day03/part02/input copy.txt create mode 100644 2023/day03/part02/input.txt create mode 100644 2023/day03/part02/src/code-file.txt create mode 100644 2023/day03/part02/src/main.go diff --git a/2023/day03/part01/src/code-file.txt b/2023/day03/part01/src/code-file.txt new file mode 100644 index 0000000..6a7a782 --- /dev/null +++ b/2023/day03/part01/src/code-file.txt @@ -0,0 +1,140 @@ +613,439,498,438,617,343,942, +790,269,735,679,444,147,441, +539,422,662,691,124,15,675,404,872,237,930, +334,861,479,424,402,314,905,833,293, +906,950,712,437,142,359,551,14, +509,890,9,847,154,568,102,280, +950,67,161,530,426, +614,59,591,259,342,427,29,946, +896,808,6,35,538,572,510,677,380, +534,814,879,615,90,580,413, +810,714,260,498,386,877,754,793,943, +845,483,55,643,421,527,938,993,706, +339,370,540,337,39,404,483,308,567, +994,855,356,768,114,195,976,496,61,610,369,200, +15,890,447,303,821,251,8, +962,260,716,893,304,537,805,388, +201,281,471,959,238,180,641, +278,132,65,920,831,97,828,533,368,66, +627,343,111,100,693,780, +974,474,537,759,101,366,183,461,178,850,644,57, +67,879,54,100,355,794,826,530, +494,549,670,194,173,329,14,811,303,891,541,975, +403,591,667,630,667,819,19, +572,271,910,578,551,818,534,217,809,262, +105,748,637,515,119,143,258, +20,115,714,525,491,768,647,433,583,404,268, +650,311,275,283,306,659,499,652,176, +100,193,637,828,806,725,418,370,86,977, +350,229,724,981,582,38,38,503, +380,311,968,647,33,634,13,72, +203,52,295,888,277,938,662,3,619,320,766, +149,883,817,163,959,8,811,354,392, +727,789,739,537,326,925,938, +383,505,166,565,491,136,693,870,654,313, +801,962,787,181,186,103,826,599,289,311,768,986, +292,414,214,439,130,52,989, +221,149,405,393,714,652,607,412,682,982, +491,906,909,885,747,19, +567,193,1,925,78,117,797,208, +943,571,919,487,433,922,795, +66,92,367,883,625,479,852,277,635,860,940,21,995, +206,595,691, +766,649,241,56,724,713,836,863,676,824,506,247,132, +278,917,864,219,973,744, +912,979,953,733, +995,905,552,391,40,388,141,731,640,511, +123,662,989,672,611,910,5,584, +306,289,673,970,51, +916,23,14,828,908,181,227,26,190,723,877,513,977,319,867,997,76, +158,605,264,569,1, +453,815,430,946,840,456,152,23, +216,389,930,211,635,472,185,444,783,966, +72,527,636,746,575,5,276,821,568, +765,991,686,142,588,366,395,983,266, +383,330,337,853,337,927,703,513,855, +652,431,48,512,541,835, +205,510,92,901,778,588,968,603,820,75,844, +560,597,698,427,249, +817,50,208,149,169,835,522, +470,151,731,395,979,200, +242,698,763,531,252,533,64,233,262,498, +994,620,639,575,934,606,99,770,72, +658,355,597,645,292,354,409,515, +453,594,571,552,193,8,820,69,877,846,525,446,386, +652,500,361,290, +833,652,410,924,72,104,231,223,775,375, +470,663,179,10,256,770,243,354, +5,962,529,39,255,73, +253,766,659,497,241,656,630,262,212,154, +755,375,936,159,786,981, +78,426,39,885,835,432,439,335, +574,785,736,860,395,381,114,825, +557,187,640,514,36,834,630,194,164,440, +744,908,185,165,635,464,354,104,996, +805,604,375,326,970, +751,776,661,777,434,952,662,2,923,99,463,514, +55,414,522,378,89, +331,403,94,547,551,300,600,452,976,213,815,757, +209,760,963,906,785, +958,319,334,640,798,611,678,630,389,426, +961,608,472,45,390, +597,191,861,279,689,972,560,900,548,97,240,51,2,411,233, +379,770,989,955,214,588, +982,82,850,450,755,799,539,298,993,788, +901,382,569,428,281,599,98,789,956,450, +497,664,610,944,778,713,375, +637,443,905,883,389,563,388,559,386, +241,597,876,731,192,483,958,828,100, +89,994,228,18,413,1,157,453, +573,198,447,488,672,383,589,511,46, +449,228,662,321,34,838, +592,659,188,248,836,141,344, +564,481,861,93,936, +618,287,490,304,662,196,72,918,339,999,28, +556,812,272,235,510,51,804,209,323, +471,474,446,855,265,588,24,522, +86,755,664,311,793,361,685,859,158,667,871, +529,624,578,334,843, +32,12,818,406,888,555,678,796,159,142,289, +797,246,473,485,683,526,987, +272,763,546,203,560,294,921, +439,144,909,221,245,847,971,812, +66,20,337,591,226,113,321,756,518, +325,166,848,267,857,34,471,579,851,322,125, +157,77,567,646,783,634,5, +598,497,275,908,172,324,263,207,340,160,80, +484,833,998,945,135,108,104, +908,645,264,581,332,519,811,214,57, +543,807,768,23,578,545,988, +547,818,669,395,88,964,230,105,471, +231,645,982,398,442,311,466,168,788,474, +233,638,254,824,676,413,818, +672,137,866,862,376,933,455,158,682,180,333, +454,18,677,664,867, +318,107,793,361,372,509,765,203,737, +216,831,509,392,508,780,219,635, +334,862,945,162,529,164,627,381,591,83,155, +278,476,363,785,431,529,194,982,91, +994,480,236,825,450,797,634,249,626, +408,699,527,900,145,880,833,456,914,432,391,537, +836,955,126,557,870,38,388, +275,526,66,587, +400,933,535,455,209,699,90,10,207,67, +757,719,38,22,254,736,201,80, +86,584,531,335,949,500,544,22,11,774,434,337,331, +183,553,691,131,186,591,171, +645,365,654,843,649,673,867,218, +533,206,528,618,891,41,988,596,391,506,672,103,926, +49,445,678,61, +63,998,927,295,600,303,352,358,464,234,517,778,32,641, +693,70,417,417,940, +529,561,706,894,740,117,251,642,763,183, +544,651,951,438,505,309,800,534, +864,930,36,418,703,431, +463,73,476,942,55,127,560,959,255, +176,969,35,242,147,914,191, +71,686,260,62,423,823,186, +521,447,940,123,62,855,452,455,264,9,165, +608,675,72,484, +302,476,64,159,815,445,965,558,824,281,98, \ No newline at end of file diff --git a/2023/day03/part01/src/main.go b/2023/day03/part01/src/main.go new file mode 100644 index 0000000..43892e1 --- /dev/null +++ b/2023/day03/part01/src/main.go @@ -0,0 +1,198 @@ +package main + +import ( + "bufio" + "fmt" + "log" + "os" + "strconv" + "strings" +) + +const demo = false + +type part struct { + value int + startIndex int + endIndex int + row int +} + +var searchPattern = [][]int{ + {-1, -1}, // top left + {-1, 0}, // top centre + {-1, 1}, // top right + {0, -1}, // mid left + {0, 1}, // mid right + {1, -1}, // bottom left + {1, 0}, // bottom centre + {1, 1}, // bottom right +} + +func readLines(path string) ([]string, error) { + file, err := os.Open(path) + if err != nil { + return nil, err + } + defer file.Close() + + var lines []string + + scanner := bufio.NewScanner(file) + for scanner.Scan() { + lines = append(lines, scanner.Text()) + } + return lines, scanner.Err() +} + +func readInputFileLines() []string { + var input_name string + if demo == true { + input_name = "demo-input.txt" + } else { + input_name = "input.txt" + } + // path := year + "/" + day + "/" + part + "/" + input_name + path := "../" + input_name + + lines, err := readLines(path) + if err != nil { + log.Fatalf("readLines: %s", err) + } + + return lines +} + +func isNumeric(s string) bool { + _, err := strconv.Atoi(s) + return err == nil +} + +func createMatrix(lines []string) [][]string { + matrix := make([][]string, len(lines)) + var row []string + + for i := 0; i < len(lines); i++ { + row = strings.Split(lines[i], "") + matrix[i] = row + } + + return matrix +} + +func getNumbersAndIndexes(matrix [][]string) []part { + var parts []part + + for i := range matrix { + row := matrix[i] + var currentNum []string + var rowParts []part + var searchingNumber bool = false + var startIndex int + + for j := range row { + var part part + if isNumeric(row[j]) { + if !searchingNumber { + startIndex = j + } + searchingNumber = true + currentNum = append(currentNum, row[j]) + if j == len(row)-1 { + part.startIndex = startIndex + part.endIndex = j - 1 + numberString := strings.Join(currentNum, "") + part.value, _ = strconv.Atoi(numberString) + part.row = i + rowParts = append(rowParts, part) + currentNum = nil + searchingNumber = false + } + } else if searchingNumber { + part.startIndex = startIndex + part.endIndex = j - 1 + numberString := strings.Join(currentNum, "") + part.value, _ = strconv.Atoi(numberString) + part.row = i + rowParts = append(rowParts, part) + currentNum = nil + searchingNumber = false + } + + } + + parts = append(parts, rowParts...) + + } + + return parts +} + +func checkIfPartNumber(part part, matrix [][]string) bool { + + row := part.row + for column := part.startIndex; column <= part.endIndex; column++ { + for index, element := range searchPattern { + if row == 0 && (index == 0 || index == 1 || index == 2) { + // if row = 0 {!searchPattern[0, 1, 2]} + continue + } else if row == len(matrix)-1 && (index == 5 || index == 6 || index == 7) { + // if row = len(matrix) {!searchPattern[5, 6, 7]} + continue + } else if column == 0 && (index == 0 || index == 3 || index == 5) { + // if column = 0 {!searchPattern[0, 3, 5]} + continue + } else if column == len(matrix[row])-1 && (index == 2 || index == 4 || index == 7) { + // if column = len(row) {!searchPattern[2, 4, 7]} + continue + } + adjacentChar := matrix[row+element[0]][column+element[1]] + if !isNumeric(adjacentChar) && adjacentChar != "." { + return true + } + } + } + + return false + +} + +func main() { + lines := readInputFileLines() + matrix := createMatrix(lines) + // fmt.Println(matrix[0][1]) // [row][column] + numbers := getNumbersAndIndexes(matrix) + var total int + + for _, element := range numbers { + if checkIfPartNumber(element, matrix) { + total += element.value + } + } + + // f, err := os.Create("code-file.txt") + // if err != nil { + // log.Fatal(err) + // } + + // defer f.Close() + + // row := 0 + // for _, element := range numbers { + // if element.row > row { + // f.WriteString("\n") + // row = element.row + // } + // f.WriteString(fmt.Sprintf("%d,", element.value)) + // } + + // fmt.Println(numbers) + fmt.Println(total) + + // fmt.Println(checkIfPartNumber(numbers[1], matrix)) +} + +// Save numbers +// Save index of first and last character +// Check adjacent characters +// if symbol, save if not discard diff --git a/2023/day03/part02/demo-input.txt b/2023/day03/part02/demo-input.txt new file mode 100644 index 0000000..624ea4f --- /dev/null +++ b/2023/day03/part02/demo-input.txt @@ -0,0 +1,10 @@ +467..114.. +...*...... +..35..633. +......#... +617*...... +.....+.58. +..592..... +......755. +...$.*.... +.664.598.. \ No newline at end of file diff --git a/2023/day03/part02/input copy.txt b/2023/day03/part02/input copy.txt new file mode 100644 index 0000000..dc4e0b8 --- /dev/null +++ b/2023/day03/part02/input copy.txt @@ -0,0 +1,140 @@ +613,439,498,438,617,343,942 +790,269,735,679,444,147,441 +539,422,662,691,124,15,675,404,872,237,930 +334,861,479,424,402,314,905,833,293 +906,950,712,437,142,359,551,14 +509,890,9,847,154,568,102,280 +950,67,161,530,426 +61459,591,259,342,427,29,946 +896,808,6,35,538,572,510,677,380 +534,814,879,615,90,580,413 +810,714,260,498,386,877,754,793,943 +845,483,55,643,421,527,938,993,706 +339,370,540,337,39,404,483,308,567 +994,855,356,768,114,195,976,496,61,610,369,200 +15,890,447,303,821,251,8 +962,260,716,893,304,537,805,388 +201,281,471,959,238,180,641 +278,132,65,920,831,97,828,533,368,66 +627,343,111,100,693,780 +974,474,537,759,101,366,183,461,178,850,644,57 +67,879,54,100,355,794,826,530 +494549,670,194,173,329,14,811,303,891,541,975 +403,591,667,630,667,819,19 +572271,910,578,551,818,534,217,809,262 +105,748,637,515,119,143,258 +20,115,714,525,491,768,647,433,583,404,268 +650,311,275,283,306,659,499,652,176 +100,193,637,828,806,725,418,370,86,977 +350,229,724,981,582,38,38,503 +380,311,968,647,33,634,13,72 +203,52,295,888,277,938,662,3,619,320,766 +149,883,817,163,959,8,811,354,392 +727,789,739,537,326,925,938 +383,505,166,565,491,136,693,870,654,313 +801,962,787,181,186,103,826,599,289,311,768,986 +292,414,214,439,130,52,989 +221,149,405,393,714,652,607,412,682,982 +491,906,909,885,747,19 +567,193,1,925,78,117,797,208 +943,571,919,487,433,922,795 +66,92,367,883,625,479,852,277,635,860,940,21,995 +206,595,691 +766,649,241,56,724,713,836,863,676,824,506,247,132 +278,917,864,219,973,744 +912,979,953,733 +995,905,552,391,40,388,141,731,640,511 +123662,989,672,611,910,5,584 +306,289,673,970,51 +916,23,14,828,908,181,227,26,190,723,877,513,977,319,867,997,76 +158,605,264,569, +453,815,430,946,840,456,152,23 +216389,930,211,635,472,185,444,783,966 +72,527,636,746,575,5,276,821,568 +765,991,686,142,588,366,395,983,266 +383,330,337,853,337,927,703,513,855 +652,431,48,512,541,835 +205,510,92,901,778,588,968,603,820,75,844 +560,597,698,427,249 +817,50,208,149,169,835,522 +470,151,731,395,979,200 +242,698,763,531,252,533,64,233,262,498 +994,620,639,575,934,606,99,770,72 +658,355,597,645,292,354,409,515 +453,594,571,552,193,8,820,69,877,846,525,446,386 +652,500,361,290 +833,652,410,924,72,104,231,223,775,375 +470,663,179,10,256,770,243,354 +5,962,529,39,255,73 +253,766,659,497,241,656,630,262,212,154 +755,375,936,159,786,981 +78,426,39,885,835,432,439,335 +574,785,736,860,395,381,114,825 +557,187,640,514,36,834,630,194,164,440 +744,908,185,165,635,464,354,104,996 +805,604,375,326,970 +751,776,661,777,434,952,662,2,923,99,463,514 +55,414,522,378,89 +331,403,94,547,551,300,600,452,976,213,815,757 +209,760,963,906,785 +958319,334,640,798,611,678,630,389,426 +961,608,472,45,390 +597,191,861,279,689,972,560,900,548,97,240,51,2,411,23 +379,770,989,955,214,588 +982,82,850,450,755,799,539,298,993,788 +901,382,569,428,281,599,98,789,956,450 +497,664,610,944,778,713,375 +637,443,905,883,389,563,388,559,386 +241,597,876,731,192,483,958,828,100 +89,994,228,18,413,1,157,453 +573,198,447,488,672,383,589,511,46 +449,228,662,321,34,838 +592,659,188,248,836,141,344 +564,481,861,93,936 +618,287,490,304,662,196,72,918,339,999,28 +556,812,272,235,510,51,804,209,323 +471,474,446,855,265,588,24,522 +86,755,664,311,793,361,685,859,158,667,871 +529,624,578,334,843 +32,12,818,406,888,555,678,796,159,142,289 +797,246,473,485,683,526,987 +272,763,546,203,560,294,921 +439,144,909,221,245,847,971,812 +66,20,337,591,226,113,321,756,518 +325,166,848,267,857,34,471,579,851,322,125 +157,77,567,646,783,634,5 +598,497,275,908,172,324,263,207,340,160,80 +484,833,998,945,135,108,104 +908,645,264,581,332,519,811,214,57 +543,807,768,23,578,545,988 +547,818,669,395,88,964,230,105,471 +231,645,982,398,442,311,466,168,788,474 +233,638,254,824,676,413,818 +672,137,866,862,376,933,455,158,682,180,333 +454,18,677,664,86 +318,107,793,361,372,509,765,203,737 +216,831,509,392,508,780,219,63 +334862,945,162,529,164,627,381,591,83,155 +278,476,363,785,431,529,194,982,91 +994,480,236,825,450,797,634,249,626 +408699,527,900,145,880,833,456,914,432,391,537 +836,955,126,557,870,38,388 +275,526,66,587 +400,933,535,455,209,699,90,10,207,67 +757,719,38,22,254,736,201,80 +86,584,531,335,949,500,544,22,11,774,434,337,331 +183,553,691,131,186,591,171 +645,365,654,843,649,673,867,218 +533,206,528,618,891,41,988,596,391,506,672,103,926 +49,445,678,61 +63,998,927,295,600,303,352,358,464,234,517,778,32,641 +693,70,417,417,940 +529,561,706,894,740,117,251,642,763,183 +544651,951,438,505,309,800,534 +864,930,36,418,703,431 +463,73,476,942,55,127,560,959,255 +176,969,35,242,147,914,191 +71,686,260,62,423,823,186 +521,447,940,123,62,855,452,455,264,9,165 +608,675,72,484 +302,476,64,159,815,445,965,558,824,281,98 \ No newline at end of file diff --git a/2023/day03/part02/input.txt b/2023/day03/part02/input.txt new file mode 100644 index 0000000..61751ac --- /dev/null +++ b/2023/day03/part02/input.txt @@ -0,0 +1,140 @@ +.....613...................................439............498.........................438......617....343.............942................... +.......*............790...........269..735..*........................../679..............*444.*.........*.......147...*.............441..... +....539......422.......*......662*........*..691..........*124.15..675.................=.......404...872............237......930.....+...... +........334.............861.........%....479..........424.......+.@.......402.......314...905................833........*293................ +..........#.......................906.................*...............950.....................712...437.........*142.359........551.14...... +....509.....=...........890...................&........9................./..847.154..568............@...102................280...*.......... +.....*..950.67.............-......161.......530....=...................=............*...../..............@.......................426........ +614...............................*.............59.591.....259*.......342...427..........29../.........-....................946............. +.......896........808..............6.............*.............35............./......538.....572....510...677*380...........=............... +.......*.............*534..814................879...............................615/....*............................90.........580...413... +.......810..........................................714.260..498..........386..........877......754........793...943.*............/.....*... +.....................845..#..483........55...643.......*......&.....421..+.....+...527.....938............*.......*...993...............706. +....339*..370..........-.540.@.....337..........*........39........*........404......&.......*...483...308.....567................../....... +..........*......994..............*......855..356.768.....*.....114...@195..................976....-...............496.61...610...369.200... +..........15........*...@890...447.........*.........*.303......................821..251*....................8........*....+................ +...962.............260...................@..716....893..............304............*.....537.........805.....#..........................388. +............201*........................281.............471........*...../.....=....959...............%..238....180..641@................... +....278.........132..........65...&.........*920.......*.......831..97..828.....533......#368............../.......*......66-............... +.....*................*......*..627......343..........111.....*.....................................*.100$........693..........780.......... +...974........474..537.759.101.......366....................183...............461*178..850.......644.........57............................. +..........67$.@.........................*...879..................54.100..355.................794.............=.....................826.530.. +494*549...............670...=194.....173............329=....*14....*........*....811*303....*....891..541........975........................ +........................*................403.............591................667............630....*.....$.667*....#...*......819.........19. +572...@.......%.......271..........910.........578.551..........818.534...........................217.........809.....262.....+............. +.....105.......748..............%........637...*...*........515....*...................119............*143..@.....258....................... +.20........115........714....525...491....*..768...647.....*...................433..../............583.......404..#..............268........ +.......650..*.....%......%............*.311............275.283.306..=659.....................499........@................652.176............ +..100.....#.193.637..........828...806.............725*........*..............................@......418........370.......@........86&..977. +......350................229..$.............................%...724.....#.981*582..$...............................*.38.....38.503......$... +.......#..380...........*.............311........%..........968......647..........33..................634*13......72./...%...*..*........... +............*.203*52.......+........./...........295.....................888..........277...938..662.........3.........619.320...766........ +....149...883..............817...........163............959..........8.....*.811%............*......&...354..+.....392...................... +....................727........789......*...............@...............739.........537....326.............*......*.......&925.........938.. +..383..505.166......-.........*.......565......491........136.....693..........870.%...........#...........654..&..313.................*.... +.........=..$..801....962.....787..........181......186.../..........*103........+............826....599.......289.....311.768..........986. +.292.414..........*......*................*..................214.....................439.@130...........+...52........*.....*.....989*...... +.........221......149....405...@...........393..........714.....&.......652............*............607....*.........412....682.......982... +.........*......................491.......................*..............-......906..909.......885.....%.747......19........................ +......567.........193........1..................925.........78......117.....797*................@............208............................ +.............943..*.....571...*.....919.487............/....+.........*.......................................*......433.922.......795...... +....66......*....92..........367.......*....883.625.....479....852@.............277.635............860.......940..21....*....995.....&...... +.........206............595%...................*............./.......................*......691.......*..........*..........*............... +.....766.............&................=...........*...649-.241...56..@724..713..836.863.......=....676...+..824.506......247..$132.......... +.....................278..........917..864.....219...............+............%.*......................973.........................744...... +.........912...............%......*................979....-953...................733.............&................................*......... +.........@........$........995....905......552...................391.........40=.......388.......141...................731*640.....511...... +123..662...989.672............................*........611......+.....%910.............*....5......................584...................... +...*...*../...........................306.....289.*....*.............................673.....*........970..51....@....*...............#..... +...916.23.......14..828........908.................181.227......26....190.....723..*.......877...513...@...*..977......319..867/...997..76.. +..........158........=............$..............................%............#...605....................264.......569.....................1 +.....453..*............................815.430*........946..840.........................456.........152................23................... +216.....*.389...........930............*.......211.......-...*.....635..472*185.................................@444...*.....783...966...... +...*...72.................*..........527...+...............636.......*.............746....575.....5...276.821........568.+......*...-....... +..765...........991........686..142*......588......@...........366....395.............*..*...............................983...266.......... +.................+..................383.............330..&......%...............337.853.337........927.@703.&513......................855... +...652................=../..@.............431....48......512...............541....%.................+.............-...835/.......%......*... +.....*..205.....510.92..901.778............*......./............588.........#..........@....................968.603........820...75....844.. +...560............/........................597...................&.......#............698..........427........*...../249.................... +..............817..........50..........208..................149..........169........................*......835..............522............. +.....-......................*............*.....470......%..*.......151.................731.......395..979.........200.........#.......$..... +..242.........698........763............531.....*....252...533.....*.........64.........*...233.........*............*262.............498... +........994.....*...............620.639......575................934..606.99....*....770.72.#......@.............................-........... +.......*.........658..355.........#...*............*...*597..............*...645......*........292........-..354...@.......409...515........ +........453..594.......#..............571..=552.193...8.............820...69.........877....%..........846.....*...525.446....*........*386. +....&...........#..................................................*....-.................652.................500............361....290..... +...833..................652.....410..924*72..........*.../104.....231.223....@...%....775................375................................ +.................470...........*..................663.......................179.10....&.........256..770*............243.........354........ +...*5.............*............962......-....................../.....529...................../.....*.........39.255./.......73......&....... +...............253..766....$.............659........$497..241.656....&....630................262.212...154.......*............*............. +...................*....755...................375...........*................@...........................*.....936...159.......786...981.... +...................78....................426.....*39....885..835....432..............439.................335............@................... +.......*574.785............................................*................736......*.....860....395...........381...........@..114...825.. +....557........@.............187.....640......514.36*.....834.........630...@....*..194......#....-......*......*....164....440.%.....*..... +...................744.908....*........*......*......185......................165........635..........464.354..104.................996...... +.........................*.805..604..375...326........................*.................../....970.....................*.................... +....751.....776.......661.......*.................777*........434..952.662....2......................$.923...........99.463.........&.514... +....*........*.....55..........414..............................*..............$......&522........378............+............*....89..*.... +.331.......403..94..................547.551..............300...600........=......452.......976.+...............213.........815.757.......... +.....209-......*...760...............@...*.............................963........+..........*.906.......785...........................+.... +958...........319....@.....+.334..........640.................................798.........611......678.....*..630.......389............426.. +.........../............961..*..................608..472...........45...........*...................*....390.............*.................. +.....597..191......&861.......279.689.............=....*.972*..........560......900.............548..97.......240...51....2....411.......233 +......*.......379.................*......+...........770.....989...955...&.214#.........*588.......*.............%..$....................... +....982.&.......................82....850...450......................*...............755.....799....539.....298.........993........788...... +.........901....382.......569...............&........428............281.....=599.........98.../....................789.@......956.=....450.. +.................*..497/..*...664....*...............%.........610................/944.....*....778......713*375.....*.................*.... +.......@......637........443.../...905............................*883.......389...........563......................388...$.....*559....386. +........241.......*597.........................876..............$........731*.....192.483..............#958...%..*......828..100............ +...89&.........994.........*228...............#...........18...413..............1....*...........*..........157...453....................... +..........573...........198............447........488.672../.#......&383.........%.....589........511..................46................... +.....*449......$...228*................+.............*........662.........%.............*....321........34%....838&...*..................... +..592.......659...............=...........................................188..248....836......*....................141..%......344......... +............................564....481..............-..........................................861............%...........93.....$...$.936.. +..........618.287......490$.......-............*..304.........662.........@....196...@...72*.........918.339.999.-.................28....... +.............*..............................556.......812.272.....235@.510...#.....51.......804...........#.......209......323=............. +.../471..474.................446.......*........855....*....#..............265..................588.24.......522............................ +............*........86..755..+........664........*.....311........793.361.....685.......859..../...@..158......=...667#...........871...... +...........529.........&.*.........................624........578....*...................*..................334..........843................ +....32#........12..818...406......888.........555........678...*...................@....796.%........159.......-.......$.......@142..289.... +..........797..@...*..........246....*..........*.............473............485..683.......526.......*................987...........*...... +...272....-.......763...........*...............546....203......................%..................560.....294........................921... +......+...............439...144..909....221...............*245.............847....971..........812............*............................. +...........66....+.........*.........20......337.....591.......*.226.&.....*.......-..+113........./........321..756...518....*............. +......325......166..........848................*.267*........857..*..34.....471.............579+.851...322........#...*........125.......... +.........*..........157......................77..................567....646...........................*......783....634.5....@.............. +.598.497.275.......&......908=............................................$.......172*324...$263.....207......&.........@...340...160....80. +....*..................#........484..833.998....*.....#.......945.135.......108..................104........................................ +..............908....645..264*..........*....581.332...519.......*.........*...........811..................214&..$............57........... +....%543.......@..............807..768.......................23............578.........&.....545...................988........*.........#... +...........547..........&.818........*................669....*........395.........88........*.....964*.....................230..105....471.. +......................231.&.........645....*982..398...@.....442..........................311.........466....168..788..474......-........... +..233......638.254......................824..........%...........676.....413......818.............................*.......*................. +..............*.........672.137..............866...862...376........*.........933*............455.................158....682..180*333....... +........454$...........*.......................*........#.............................../18.....*.....677...664.........................%867 +..............318....107...........*793.....361...............................*................372.......*.....*509......765.203....737..... +.................%........*.216.831....................509.....392............508...........&...........780.........219.....*......&....*635 +334............&........862................945.....162*.........*.......529.......164.......627.381*........591........*83...........155.... +.......278...476....363....../.........785.%................431...........*..........*529...........194......*..............982*91.......... +.......*..................994..480.....*......*.......236...*........825.450......&.......&..797*.......634.249.......................626... +408.699........*527............*....900....145.880...*......833......*...........456....914......432...*...............391..537........*.... +.........................836..955.....................126............557.............................870...38..........*.....*.......388.... +.................+275.......*..................=................/............526..................................-....66....587............ +..........................400....&............933.......*.....535........455*.....&...209.699........90....*10..207...............*.67...... +..............757................719.-............*..-...38.....................22.....*..+...254.....$.736..................201.80.+....... +.....86.584............+..*..........531........335.949.......500...........544.....22.11....*......%.........774*434...337...........331... +.183...*............553....691..131..........................*.................*..............186..591..=171............................*... +...*..........645........*.........*.......365............654......*........843..649.............................673.....867........#.218... +....533..206..*...528=...618........891.41*......................988.596........$......%......391..506..672...../...........*103..926....... +............$.49..............*.....................445................@..../......&..678...................61.............................. +..63.............998.......927...295..600....303..........352..............358...464......234.......-.......*....517.......-778....32..641.. +....*693............*..............*...*...+.../..70......@...417......*.......$.........*..........417...940.....@....................*.... +.................529...561.......706...894.740.......117=....+.......251....642...&763..183..................................$.............. +544.651.......+........*....951..................438............505..................................309......800..........534.............. +...*...........864.....930....*...36*.......418....*...............*................703...............*.........%..431................=..... +...........463................73.....476............942...55.....127..........................560..959................*.............255..... +......%...*.......176..969#...............@35...............*........-.........242...............=.........147.......914....191............. +....71....686................*.................260.........62.423...823..............-.....................*...................=.186........ +.................521..447....940...123........*.................+..........62....855..452...............455.......264....9..........*165.... +.......$608..675*.....*.../.......*............72......../...........*484....*....=................................*......*.....%........... +...................302..476.......64.....................159......815......445..........965........................558...824....281......98. \ No newline at end of file diff --git a/2023/day03/part02/src/code-file.txt b/2023/day03/part02/src/code-file.txt new file mode 100644 index 0000000..6a7a782 --- /dev/null +++ b/2023/day03/part02/src/code-file.txt @@ -0,0 +1,140 @@ +613,439,498,438,617,343,942, +790,269,735,679,444,147,441, +539,422,662,691,124,15,675,404,872,237,930, +334,861,479,424,402,314,905,833,293, +906,950,712,437,142,359,551,14, +509,890,9,847,154,568,102,280, +950,67,161,530,426, +614,59,591,259,342,427,29,946, +896,808,6,35,538,572,510,677,380, +534,814,879,615,90,580,413, +810,714,260,498,386,877,754,793,943, +845,483,55,643,421,527,938,993,706, +339,370,540,337,39,404,483,308,567, +994,855,356,768,114,195,976,496,61,610,369,200, +15,890,447,303,821,251,8, +962,260,716,893,304,537,805,388, +201,281,471,959,238,180,641, +278,132,65,920,831,97,828,533,368,66, +627,343,111,100,693,780, +974,474,537,759,101,366,183,461,178,850,644,57, +67,879,54,100,355,794,826,530, +494,549,670,194,173,329,14,811,303,891,541,975, +403,591,667,630,667,819,19, +572,271,910,578,551,818,534,217,809,262, +105,748,637,515,119,143,258, +20,115,714,525,491,768,647,433,583,404,268, +650,311,275,283,306,659,499,652,176, +100,193,637,828,806,725,418,370,86,977, +350,229,724,981,582,38,38,503, +380,311,968,647,33,634,13,72, +203,52,295,888,277,938,662,3,619,320,766, +149,883,817,163,959,8,811,354,392, +727,789,739,537,326,925,938, +383,505,166,565,491,136,693,870,654,313, +801,962,787,181,186,103,826,599,289,311,768,986, +292,414,214,439,130,52,989, +221,149,405,393,714,652,607,412,682,982, +491,906,909,885,747,19, +567,193,1,925,78,117,797,208, +943,571,919,487,433,922,795, +66,92,367,883,625,479,852,277,635,860,940,21,995, +206,595,691, +766,649,241,56,724,713,836,863,676,824,506,247,132, +278,917,864,219,973,744, +912,979,953,733, +995,905,552,391,40,388,141,731,640,511, +123,662,989,672,611,910,5,584, +306,289,673,970,51, +916,23,14,828,908,181,227,26,190,723,877,513,977,319,867,997,76, +158,605,264,569,1, +453,815,430,946,840,456,152,23, +216,389,930,211,635,472,185,444,783,966, +72,527,636,746,575,5,276,821,568, +765,991,686,142,588,366,395,983,266, +383,330,337,853,337,927,703,513,855, +652,431,48,512,541,835, +205,510,92,901,778,588,968,603,820,75,844, +560,597,698,427,249, +817,50,208,149,169,835,522, +470,151,731,395,979,200, +242,698,763,531,252,533,64,233,262,498, +994,620,639,575,934,606,99,770,72, +658,355,597,645,292,354,409,515, +453,594,571,552,193,8,820,69,877,846,525,446,386, +652,500,361,290, +833,652,410,924,72,104,231,223,775,375, +470,663,179,10,256,770,243,354, +5,962,529,39,255,73, +253,766,659,497,241,656,630,262,212,154, +755,375,936,159,786,981, +78,426,39,885,835,432,439,335, +574,785,736,860,395,381,114,825, +557,187,640,514,36,834,630,194,164,440, +744,908,185,165,635,464,354,104,996, +805,604,375,326,970, +751,776,661,777,434,952,662,2,923,99,463,514, +55,414,522,378,89, +331,403,94,547,551,300,600,452,976,213,815,757, +209,760,963,906,785, +958,319,334,640,798,611,678,630,389,426, +961,608,472,45,390, +597,191,861,279,689,972,560,900,548,97,240,51,2,411,233, +379,770,989,955,214,588, +982,82,850,450,755,799,539,298,993,788, +901,382,569,428,281,599,98,789,956,450, +497,664,610,944,778,713,375, +637,443,905,883,389,563,388,559,386, +241,597,876,731,192,483,958,828,100, +89,994,228,18,413,1,157,453, +573,198,447,488,672,383,589,511,46, +449,228,662,321,34,838, +592,659,188,248,836,141,344, +564,481,861,93,936, +618,287,490,304,662,196,72,918,339,999,28, +556,812,272,235,510,51,804,209,323, +471,474,446,855,265,588,24,522, +86,755,664,311,793,361,685,859,158,667,871, +529,624,578,334,843, +32,12,818,406,888,555,678,796,159,142,289, +797,246,473,485,683,526,987, +272,763,546,203,560,294,921, +439,144,909,221,245,847,971,812, +66,20,337,591,226,113,321,756,518, +325,166,848,267,857,34,471,579,851,322,125, +157,77,567,646,783,634,5, +598,497,275,908,172,324,263,207,340,160,80, +484,833,998,945,135,108,104, +908,645,264,581,332,519,811,214,57, +543,807,768,23,578,545,988, +547,818,669,395,88,964,230,105,471, +231,645,982,398,442,311,466,168,788,474, +233,638,254,824,676,413,818, +672,137,866,862,376,933,455,158,682,180,333, +454,18,677,664,867, +318,107,793,361,372,509,765,203,737, +216,831,509,392,508,780,219,635, +334,862,945,162,529,164,627,381,591,83,155, +278,476,363,785,431,529,194,982,91, +994,480,236,825,450,797,634,249,626, +408,699,527,900,145,880,833,456,914,432,391,537, +836,955,126,557,870,38,388, +275,526,66,587, +400,933,535,455,209,699,90,10,207,67, +757,719,38,22,254,736,201,80, +86,584,531,335,949,500,544,22,11,774,434,337,331, +183,553,691,131,186,591,171, +645,365,654,843,649,673,867,218, +533,206,528,618,891,41,988,596,391,506,672,103,926, +49,445,678,61, +63,998,927,295,600,303,352,358,464,234,517,778,32,641, +693,70,417,417,940, +529,561,706,894,740,117,251,642,763,183, +544,651,951,438,505,309,800,534, +864,930,36,418,703,431, +463,73,476,942,55,127,560,959,255, +176,969,35,242,147,914,191, +71,686,260,62,423,823,186, +521,447,940,123,62,855,452,455,264,9,165, +608,675,72,484, +302,476,64,159,815,445,965,558,824,281,98, \ No newline at end of file diff --git a/2023/day03/part02/src/main.go b/2023/day03/part02/src/main.go new file mode 100644 index 0000000..a54f715 --- /dev/null +++ b/2023/day03/part02/src/main.go @@ -0,0 +1,291 @@ +package main + +import ( + "bufio" + "fmt" + "log" + "os" + "strconv" + "strings" +) + +const demo = true + +type part struct { + value int + startIndex int + endIndex int + row int +} + +var searchPattern = [][]int{ + {-1, -1}, // top left + {-1, 0}, // top centre + {-1, 1}, // top right + {0, -1}, // mid left + {0, 1}, // mid right + {1, -1}, // bottom left + {1, 0}, // bottom centre + {1, 1}, // bottom right +} + +func readLines(path string) ([]string, error) { + file, err := os.Open(path) + if err != nil { + return nil, err + } + defer file.Close() + + var lines []string + + scanner := bufio.NewScanner(file) + for scanner.Scan() { + lines = append(lines, scanner.Text()) + } + return lines, scanner.Err() +} + +func readInputFileLines() []string { + var input_name string + if demo == true { + input_name = "demo-input.txt" + } else { + input_name = "input.txt" + } + // path := year + "/" + day + "/" + part + "/" + input_name + path := "../" + input_name + + lines, err := readLines(path) + if err != nil { + log.Fatalf("readLines: %s", err) + } + + return lines +} + +func isNumeric(s string) bool { + _, err := strconv.Atoi(s) + return err == nil +} + +func createMatrix(lines []string) [][]string { + matrix := make([][]string, len(lines)) + var row []string + + for i := 0; i < len(lines); i++ { + row = strings.Split(lines[i], "") + matrix[i] = row + } + + return matrix +} + +func getNumbersAndIndexes(matrix [][]string) []part { + var parts []part + + for i := range matrix { + row := matrix[i] + var currentNum []string + var rowParts []part + var searchingNumber bool = false + var startIndex int + + for j := range row { + var part part + if isNumeric(row[j]) { + if !searchingNumber { + startIndex = j + } + searchingNumber = true + currentNum = append(currentNum, row[j]) + if j == len(row)-1 { + part.startIndex = startIndex + part.endIndex = j - 1 + numberString := strings.Join(currentNum, "") + part.value, _ = strconv.Atoi(numberString) + part.row = i + rowParts = append(rowParts, part) + currentNum = nil + searchingNumber = false + } + } else if searchingNumber { + part.startIndex = startIndex + part.endIndex = j - 1 + numberString := strings.Join(currentNum, "") + part.value, _ = strconv.Atoi(numberString) + part.row = i + rowParts = append(rowParts, part) + currentNum = nil + searchingNumber = false + } + + } + + parts = append(parts, rowParts...) + + } + + return parts +} + +func checkIfPartNumber(part part, matrix [][]string) bool { + + row := part.row + for column := part.startIndex; column <= part.endIndex; column++ { + for index, element := range searchPattern { + if row == 0 && (index == 0 || index == 1 || index == 2) { + // if row = 0 {!searchPattern[0, 1, 2]} + continue + } else if row == len(matrix)-1 && (index == 5 || index == 6 || index == 7) { + // if row = len(matrix) {!searchPattern[5, 6, 7]} + continue + } else if column == 0 && (index == 0 || index == 3 || index == 5) { + // if column = 0 {!searchPattern[0, 3, 5]} + continue + } else if column == len(matrix[row])-1 && (index == 2 || index == 4 || index == 7) { + // if column = len(row) {!searchPattern[2, 4, 7]} + continue + } + adjacentChar := matrix[row+element[0]][column+element[1]] + if !isNumeric(adjacentChar) && adjacentChar != "." { + return true + } + } + } + + return false + +} + +func getGearIdentifier(matrix [][]string) [][]int { + var gears [][]int + for i := range matrix { + for j := range matrix[i] { + if matrix[i][j] == "*" { + gears = append(gears, []int{i, j}) + } + } + } + + return gears +} + +func rangeGen(start int, end int) []int { + array := make([]int, end-start+1) + for i := range array { + array[i] = i + start + } + + return array +} + +func isCoordInArray(coord []int, array [][]int) bool { + for _, element := range array { + if element[0] == coord[0] && element[1] == coord[1] { + return true + } + } + + return false +} + +func getGearPower(gears [][]int, parts []part) int { + var totalGearPower int + for _, gear := range gears { + gearRow := gear[0] + gearCol := gear[1] + var gearSearchIndexes [][]int + var partNumbers []part + + // Find gear search indexes + for _, element := range searchPattern { + row := gearRow + element[0] + col := gearCol + element[1] + gearSearchIndexes = append(gearSearchIndexes, []int{row, col}) + } + + // Find if parts are in those search indexes + for _, part := range parts { + // find all coordinates for part + partRange := rangeGen(part.startIndex, part.endIndex) + var partCoordRange [][]int + for _, e := range partRange { + partCoordRange = append(partCoordRange, []int{part.row, e}) + } + + // Check if any of part's coordinates are in range + for _, partCoord := range partCoordRange { + if isCoordInArray(partCoord, gearSearchIndexes) { + if len(partNumbers) >= 2 { + partNumbers = nil + } else { + partNumbers = append(partNumbers, part) + } + + } + } + + } + + // Calculate power + if len(partNumbers) == 2 { + gearPower := partNumbers[0].value * partNumbers[1].value + totalGearPower += gearPower + } + + } + + return totalGearPower +} + +func main() { + lines := readInputFileLines() + matrix := createMatrix(lines) + // // fmt.Println(matrix[0][1]) // [row][column] + // var total int + + // for _, element := range numbers { + // if checkIfPartNumber(element, matrix) { + // total += element.value + // } + // } + + // f, err := os.Create("code-file.txt") + // if err != nil { + // log.Fatal(err) + // } + + // defer f.Close() + + // row := 0 + // for _, element := range numbers { + // if element.row > row { + // f.WriteString("\n") + // row = element.row + // } + // f.WriteString(fmt.Sprintf("%d,", element.value)) + // } + + // fmt.Println(numbers) + // fmt.Println(getGearIdentifier(matrix)) + + parts := getNumbersAndIndexes(matrix) + gears := getGearIdentifier(matrix) + total := getGearPower(gears, parts) + // getGearPower(gears, parts) + // var partCoordRange [][]int + // partRange := rangeGen(numbers[3].startIndex, numbers[3].endIndex) + // for _, e := range partRange { + // partCoordRange = append(partCoordRange, []int{numbers[3].row, e}) + // } + // fmt.Println(partCoordRange) + + fmt.Println(total) + + // fmt.Println(checkIfPartNumber(numbers[1], matrix)) +} + +// Save numbers +// Save index of first and last character +// Check adjacent characters +// if symbol, save if not discard