day13, example two

This commit is contained in:
efim 2023-12-13 14:33:14 +00:00
parent d4c162db33
commit 85dd9a31e3

View File

@ -8,7 +8,7 @@ import (
) )
func Run() int { func Run() int {
filename := "day13/input" filename := "day13/example"
fmt.Println("hello day 13.", filename) fmt.Println("hello day 13.", filename)
bytes, err := os.ReadFile(filename) bytes, err := os.ReadFile(filename)
if err != nil { if err != nil {
@ -42,7 +42,7 @@ func Calc(field Field) int {
isMirrored := symb == mirroredSymb isMirrored := symb == mirroredSymb
if !isMirrored { if !isMirrored {
// log.Printf("found not mirrored : %s != %s\n", string(symb), string(mirroredSymb)) // 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 rowsAboveHorizontals := 0
for _, mirr := range horizontals { for _, mirr := range horizontals {
fmt.Println(mirr.String()) fmt.Println("horizontal: ", mirr.String())
if mirr.isFullMirror() { if mirr.isFullMirror() {
log.Printf(">> found perfect Horizontal %+v\n", mirr)
rowsAboveHorizontals += (mirr.Smaller + 1) rowsAboveHorizontals += (mirr.Smaller + 1)
} }
} }
@ -77,7 +78,7 @@ func Calc(field Field) int {
isMirrored := symb == mirroredSymb isMirrored := symb == mirroredSymb
if !isMirrored { if !isMirrored {
// log.Printf("found not mirrored : %s != %s\n", string(symb), string(mirroredSymb)) // 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 colsToLeftOfHorizontals := 0
for _, mirr := range verticals { for _, mirr := range verticals {
fmt.Println(mirr.String()) fmt.Println("vertical: ", mirr.String())
if mirr.isFullMirror() { if mirr.isFullMirror() {
log.Printf(">> found perfect Vertical %+v\n", mirr)
colsToLeftOfHorizontals += (mirr.Smaller + 1) colsToLeftOfHorizontals += (mirr.Smaller + 1)
} }
} }
@ -146,7 +148,7 @@ func (f *Field) initMirrors() (vertical []Mirror, horizontal []Mirror) {
Smaller: rowNum, Smaller: rowNum,
Bigger: rowNum + 1, Bigger: rowNum + 1,
SuccessfulLineChecks: make(map[int]any), SuccessfulLineChecks: make(map[int]any),
FailedLineChecks: make(map[int]any), FailedLineChecks: make(map[int]int),
MaxDistToCheck: maxDist, MaxDistToCheck: maxDist,
} }
} }
@ -157,7 +159,7 @@ func (f *Field) initMirrors() (vertical []Mirror, horizontal []Mirror) {
Smaller: colNum, Smaller: colNum,
Bigger: colNum + 1, Bigger: colNum + 1,
SuccessfulLineChecks: make(map[int]any), SuccessfulLineChecks: make(map[int]any),
FailedLineChecks: make(map[int]any), FailedLineChecks: make(map[int]int),
MaxDistToCheck: min(colNum, maxDist), 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' // 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 // value 0 means one step from 'mirror' so rows 0 and 1
SuccessfulLineChecks map[int]any 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 { 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 { func (m *Mirror)String() string {
return fmt.Sprintf("Mirror between %d and %d. successful lines: %+v ; failed lines: %+v. Max check dist: %d\n", return fmt.Sprintf("Mirror (full %t) 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) m.isFullMirror(), m.Smaller, m.Bigger, m.SuccessfulLineChecks, m.FailedLineChecks, m.MaxDistToCheck)
} }
func (m *Mirror) reflectCoord(coord int) (reflected int, shouldCheck bool) { func (m *Mirror) reflectCoord(coord int) (reflected int, shouldCheck bool) {
dist := m.Smaller - coord dist := m.Smaller - coord
_, distFailed := m.FailedLineChecks[dist]
_, distConfirmed := m.SuccessfulLineChecks[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 return 0, false // either line already fully confirmed, or failed. no need for additional checks
} }