Alexander Avery
1 year ago
3 changed files with 116 additions and 0 deletions
@ -0,0 +1,94 @@ |
|||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"bufio" |
||||
|
"fmt" |
||||
|
"io" |
||||
|
"strconv" |
||||
|
"strings" |
||||
|
) |
||||
|
|
||||
|
func isdigit(b byte) bool { |
||||
|
return b >= 48 && b <= 57 |
||||
|
} |
||||
|
|
||||
|
func engineparts(buf *bufio.Reader) []int { |
||||
|
parts := make([]int, 0, 150) |
||||
|
|
||||
|
outer: |
||||
|
for { |
||||
|
head, err := buf.ReadByte() |
||||
|
if err != nil { |
||||
|
return parts |
||||
|
} |
||||
|
|
||||
|
if isdigit(head) { |
||||
|
// start recording digits
|
||||
|
b := make([]byte, 0, 10) |
||||
|
b = append(b, head) |
||||
|
|
||||
|
// continue reading until number is exhausted
|
||||
|
for { |
||||
|
digit, err := buf.ReadByte() |
||||
|
if !isdigit(digit) || err == io.EOF { |
||||
|
value, _ := strconv.Atoi(string(b)) |
||||
|
for range b { |
||||
|
parts = append(parts, value) |
||||
|
} |
||||
|
|
||||
|
buf.UnreadByte() |
||||
|
continue outer |
||||
|
} |
||||
|
|
||||
|
b = append(b, digit) |
||||
|
} |
||||
|
|
||||
|
} else if head != '.' { |
||||
|
// head is a symbol
|
||||
|
parts = append(parts, -1) |
||||
|
|
||||
|
} else { |
||||
|
// head is a '.'
|
||||
|
parts = append(parts, 0) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
type day03 struct{} |
||||
|
|
||||
|
func (d day03) solve1(r io.Reader) string { |
||||
|
sum := 0 |
||||
|
parts := make([][]int, 0, 100) |
||||
|
scanner := bufio.NewScanner(r) |
||||
|
|
||||
|
for scanner.Scan() { |
||||
|
line := scanner.Text() |
||||
|
buf := bufio.NewReader(strings.NewReader(line)) |
||||
|
lineparts := engineparts(buf) |
||||
|
parts = append(parts, lineparts) |
||||
|
} |
||||
|
|
||||
|
for i := 1; i < len(parts)-1; i++ { |
||||
|
for j := 1; j < len(parts[i])-1; j++ { |
||||
|
cursor := parts[i][j] |
||||
|
if cursor == -1 { |
||||
|
row: |
||||
|
for i2 := -1; i2 <= 1; i2++ { |
||||
|
for j2 := -1; j2 <= 1; j2++ { |
||||
|
val := parts[i+i2][j+j2] |
||||
|
if val > 0 { |
||||
|
sum += val |
||||
|
continue row |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return fmt.Sprintf("%d", sum) |
||||
|
} |
||||
|
|
||||
|
func (d day03) solve2(r io.Reader) string { |
||||
|
return "" |
||||
|
} |
Loading…
Reference in new issue