diff --git a/day13/dayThirteen.go b/day13/dayThirteen.go index de9afc4..6ed2688 100644 --- a/day13/dayThirteen.go +++ b/day13/dayThirteen.go @@ -8,7 +8,7 @@ import ( ) func Run() int { - filename := "day13/input" + filename := "day13/example" fmt.Println("hello day 13.", filename) bytes, err := os.ReadFile(filename) if err != nil { @@ -42,7 +42,7 @@ func Calc(field Field) int { isMirrored := symb == mirroredSymb if !isMirrored { // log.Printf("found not mirrored : %s != %s\n", string(symb), string(mirroredSymb)) - horizontalMirrorUnderCheck.FailedLineChecks[rowNum] = struct{}{} + horizontalMirrorUnderCheck.FailedLineChecks[rowNum] += 1 } } } @@ -59,8 +59,9 @@ func Calc(field Field) int { rowsAboveHorizontals := 0 for _, mirr := range horizontals { - fmt.Println(mirr.String()) + fmt.Println("horizontal: ", mirr.String()) if mirr.isFullMirror() { + log.Printf(">> found perfect Horizontal %+v\n", mirr) rowsAboveHorizontals += (mirr.Smaller + 1) } } @@ -77,7 +78,7 @@ func Calc(field Field) int { isMirrored := symb == mirroredSymb if !isMirrored { // log.Printf("found not mirrored : %s != %s\n", string(symb), string(mirroredSymb)) - verticalMirrorUnderCheck.FailedLineChecks[rowNum] = struct{}{} + verticalMirrorUnderCheck.FailedLineChecks[rowNum] += 1 } } } @@ -93,8 +94,9 @@ func Calc(field Field) int { } colsToLeftOfHorizontals := 0 for _, mirr := range verticals { - fmt.Println(mirr.String()) + fmt.Println("vertical: ", mirr.String()) if mirr.isFullMirror() { + log.Printf(">> found perfect Vertical %+v\n", mirr) colsToLeftOfHorizontals += (mirr.Smaller + 1) } } @@ -146,7 +148,7 @@ func (f *Field) initMirrors() (vertical []Mirror, horizontal []Mirror) { Smaller: rowNum, Bigger: rowNum + 1, SuccessfulLineChecks: make(map[int]any), - FailedLineChecks: make(map[int]any), + FailedLineChecks: make(map[int]int), MaxDistToCheck: maxDist, } } @@ -157,7 +159,7 @@ func (f *Field) initMirrors() (vertical []Mirror, horizontal []Mirror) { Smaller: colNum, Bigger: colNum + 1, SuccessfulLineChecks: make(map[int]any), - FailedLineChecks: make(map[int]any), + FailedLineChecks: make(map[int]int), MaxDistToCheck: min(colNum, maxDist), } } @@ -172,24 +174,34 @@ type Mirror struct { // i.e if mirror between 0 and 1 - only rows 0 & 1 have to be checked, row 2 is 'mirrored' outside of the field and 'ok' // value 0 means one step from 'mirror' so rows 0 and 1 SuccessfulLineChecks map[int]any - FailedLineChecks map[int]any + FailedLineChecks map[int]int // from line num, to amount of errors in that line } func (m *Mirror)isFullMirror() bool { - return len(m.FailedLineChecks) == 0 + correctFailedLinesCount := len(m.FailedLineChecks) == 2 + if correctFailedLinesCount { + for failedLine, failedSymbols := range m.FailedLineChecks { + reflectedLine, _ := m.reflectCoord(failedLine) + doublyReflected, _ := m.reflectCoord(reflectedLine) + log.Printf(">>>> checking failed line %d, reflected is %d; doubly %d. amount failed is %d\n", failedLine, reflectedLine, doublyReflected, failedSymbols) + if failedSymbols == 1 && (doublyReflected == failedLine) { + return true + } + } + } + return false } func (m *Mirror)String() string { - return fmt.Sprintf("Mirror between %d and %d. successful lines: %+v ; failed lines: %+v. Max check dist: %d\n", - m.Smaller, m.Bigger, m.SuccessfulLineChecks, m.FailedLineChecks, m.MaxDistToCheck) + return fmt.Sprintf("Mirror (full %t) between %d and %d. successful lines: %+v ; failed lines: %+v. Max check dist: %d\n", + m.isFullMirror(), m.Smaller, m.Bigger, m.SuccessfulLineChecks, m.FailedLineChecks, m.MaxDistToCheck) } func (m *Mirror) reflectCoord(coord int) (reflected int, shouldCheck bool) { dist := m.Smaller - coord - _, distFailed := m.FailedLineChecks[dist] _, distConfirmed := m.SuccessfulLineChecks[dist] - if distFailed || distConfirmed { + if distConfirmed { return 0, false // either line already fully confirmed, or failed. no need for additional checks }