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