day13, example two
This commit is contained in:
parent
d4c162db33
commit
85dd9a31e3
@ -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
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user