Browse Source

Refactored for part2

Piotr Czajkowski 1 week ago
parent
commit
b55544ff37
2 changed files with 39 additions and 23 deletions
  1. 39 23
      06/code.go
  2. 0 0
      06/input

+ 39 - 23
06/code.go

@@ -9,9 +9,9 @@ import (
 	"strings"
 )
 
-func readInput(file *os.File) ([][]string, []string) {
+func readInput(file *os.File) ([]string, []string) {
 	scanner := bufio.NewScanner(file)
-	var numbers [][]string
+	var numberLines []string
 	var symbols []string
 
 	for scanner.Scan() {
@@ -21,35 +21,46 @@ func readInput(file *os.File) ([][]string, []string) {
 		}
 
 		if line[0] == '+' || line[0] == '*' {
-			parts := strings.Split(line, " ")
-			for _, part := range parts {
-				if part == "" || part == " " {
-					continue
+			var symbol []byte
+			for i := range line {
+				if i > 0 && line[i] == '+' || line[i] == '*' {
+					symbols = append(symbols, string(symbol))
+					symbol = []byte{}
 				}
 
-				symbols = append(symbols, strings.Trim(part, " "))
+				symbol = append(symbol, line[i])
 			}
+
+			symbols = append(symbols, string(symbol))
 		} else {
-			var lineNumbers []string
-			var number string
-			for i := range line {
-				if line[i] == ' ' {
-					if i > 0 && line[i-1] >= '0' && line[i-1] <= '9' {
-						lineNumbers = append(lineNumbers, number)
-						number = ""
-						continue
-					}
-				}
+			numberLines = append(numberLines, line)
+		}
+	}
 
+	return numberLines, symbols
+}
+
+func parseNumbers(numberLines, symbols []string) [][]string {
+	var numbers [][]string
+
+	for _, line := range numberLines {
+		var start, end int
+		var lineNumbers []string
+		for _, symbol := range symbols {
+			end += len(symbol)
+			var number string
+			for i := start; i < end; i++ {
 				number += string(line[i])
 			}
 
 			lineNumbers = append(lineNumbers, number)
-			numbers = append(numbers, lineNumbers)
+			start = end
 		}
+
+		numbers = append(numbers, lineNumbers)
 	}
 
-	return numbers, symbols
+	return numbers
 }
 
 func part1(numbers [][]string, symbols []string) int {
@@ -58,14 +69,18 @@ func part1(numbers [][]string, symbols []string) int {
 	for i, symbol := range symbols {
 		var result int
 		for row := range numbers {
+			if numbers[row][i] == "" {
+				continue
+			}
+
 			number, err := strconv.Atoi(strings.Trim(numbers[row][i], " "))
 			if err != nil {
-				log.Fatalf("Failed to convert %s to int!\n", numbers[row][i])
+				log.Fatalf("Failed to convert %s to int (row: %d, col: %d)!\n", numbers[row][i], row, i)
 			}
 
-			if symbol == "+" {
+			if symbol[0] == '+' {
 				result += number
-			} else if symbol == "*" {
+			} else if symbol[0] == '*' {
 				if result == 0 {
 					result = 1
 				}
@@ -90,6 +105,7 @@ func main() {
 		log.Fatalf("Failed to open %s!\n", filePath)
 	}
 
-	numbers, symbols := readInput(file)
+	numberLines, symbols := readInput(file)
+	numbers := parseNumbers(numberLines, symbols)
 	fmt.Println("Part1:", part1(numbers, symbols))
 }

File diff suppressed because it is too large
+ 0 - 0
06/input


Some files were not shown because too many files changed in this diff