Browse Source

Solved for sample

Piotr Czajkowski 1 year ago
parent
commit
99368288cb
1 changed files with 86 additions and 1 deletions
  1. 86 1
      13/code.go

+ 86 - 1
13/code.go

@@ -26,6 +26,7 @@ func readInput(file *os.File) []Pattern {
 		if line == "" {
 			patterns = append(patterns, current)
 			current = Pattern{}
+			continue
 		}
 
 		var row []byte
@@ -39,6 +40,90 @@ func readInput(file *os.File) []Pattern {
 
 	return patterns
 }
+
+func checkVertical(index int, note [][]byte, width int) bool {
+	left := 0
+	prev := index - 1
+	right := index + prev
+	if right >= width {
+		right = width - 1
+	}
+
+	for {
+		if prev < left || index > right {
+			break
+		}
+
+		for i := range note {
+			if note[i][prev] != note[i][index] {
+				return false
+			}
+		}
+
+		prev--
+		index++
+	}
+
+	return true
+}
+
+func checkHorizontal(index int, note [][]byte, height int, width int) bool {
+	up := 0
+	prev := index - 1
+
+	down := index + prev
+	if down >= height {
+		down = height - 1
+	}
+
+	for {
+		if prev < up || index > down {
+			break
+		}
+
+		for i := range note[index] {
+			if note[index][i] != note[prev][i] {
+				return false
+			}
+		}
+
+		prev--
+		index++
+	}
+
+	return true
+}
+
+func part1(patterns []Pattern) int {
+	var result int
+	for i := range patterns {
+		width := len(patterns[i].note[0])
+		height := len(patterns[i].note)
+
+		gotVertical := false
+		for index := 1; index < width; index++ {
+			if checkVertical(index, patterns[i].note, width) {
+				result += index
+				gotVertical = true
+				break
+			}
+		}
+
+		if gotVertical {
+			continue
+		}
+
+		for index := 1; index < height; index++ {
+			if checkHorizontal(index, patterns[i].note, height, width) {
+				result += index * 100
+				break
+			}
+		}
+	}
+
+	return result
+}
+
 func main() {
 	if len(os.Args) < 2 {
 		log.Fatal("You need to specify a file!")
@@ -52,5 +137,5 @@ func main() {
 	}
 
 	patterns := readInput(file)
-	fmt.Println(patterns)
+	fmt.Println("Part1:", part1(patterns))
 }