Alexander Avery
1 year ago
3 changed files with 1136 additions and 0 deletions
@ -0,0 +1,68 @@ |
|||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"bufio" |
||||
|
"fmt" |
||||
|
"io" |
||||
|
"strconv" |
||||
|
"unicode" |
||||
|
) |
||||
|
|
||||
|
type day01 struct { |
||||
|
} |
||||
|
|
||||
|
type buffer struct { |
||||
|
first bool |
||||
|
d1 rune |
||||
|
|
||||
|
last bool |
||||
|
d2 rune |
||||
|
} |
||||
|
|
||||
|
func (b *buffer) value() (value uint64) { |
||||
|
var d2 rune |
||||
|
|
||||
|
if b.last { |
||||
|
d2 = b.d2 |
||||
|
} else { |
||||
|
d2 = b.d1 |
||||
|
} |
||||
|
|
||||
|
str := fmt.Sprintf("%c%c", b.d1, d2) |
||||
|
value, _ = strconv.ParseUint(str, 10, 64) |
||||
|
|
||||
|
b.first, b.last = false, false |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
func (b *buffer) record(digit rune) { |
||||
|
if !b.first { |
||||
|
b.d1 = digit |
||||
|
b.first = true |
||||
|
} else { |
||||
|
b.d2 = digit |
||||
|
b.last = true |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
func (d day01) solve(r io.Reader) string { |
||||
|
var ( |
||||
|
buffer buffer |
||||
|
total uint64 |
||||
|
buf = bufio.NewReader(r) |
||||
|
) |
||||
|
|
||||
|
for { |
||||
|
b, _, err := buf.ReadRune() |
||||
|
if err != nil { |
||||
|
return fmt.Sprintf("%d", total+buffer.value()) |
||||
|
} |
||||
|
|
||||
|
if unicode.IsDigit(b) { |
||||
|
buffer.record(b) |
||||
|
} else if b == '\n' { |
||||
|
total += buffer.value() |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
File diff suppressed because it is too large
@ -0,0 +1,68 @@ |
|||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"flag" |
||||
|
"fmt" |
||||
|
"io" |
||||
|
"log" |
||||
|
"os" |
||||
|
"path/filepath" |
||||
|
"strconv" |
||||
|
) |
||||
|
|
||||
|
type puzzle interface { |
||||
|
solve(r io.Reader) string |
||||
|
} |
||||
|
|
||||
|
var ( |
||||
|
// pick which day to run with a flag
|
||||
|
day = flag.String("d", "", "which day to solve") |
||||
|
|
||||
|
// slice of all puzzles
|
||||
|
puzzles = []puzzle{ |
||||
|
&day01{}, |
||||
|
} |
||||
|
) |
||||
|
|
||||
|
func init() { |
||||
|
flag.Parse() |
||||
|
|
||||
|
} |
||||
|
|
||||
|
func inputs(day int64) []io.Reader { |
||||
|
inputs := make([]io.Reader, 0, 2) |
||||
|
path := fmt.Sprintf("input/%d-[1-2]", day) |
||||
|
|
||||
|
matches, err := filepath.Glob(path) |
||||
|
if err != nil { |
||||
|
log.Fatalf("matching puzzle input files: %s", err.Error()) |
||||
|
} |
||||
|
|
||||
|
fmt.Println(matches) |
||||
|
|
||||
|
for _, match := range matches { |
||||
|
f, err := os.Open(match) |
||||
|
if err == nil { |
||||
|
inputs = append(inputs, f) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return inputs |
||||
|
} |
||||
|
|
||||
|
func main() { |
||||
|
puzzleIndex, err := strconv.ParseInt(*day, 10, 32) |
||||
|
if err != nil { |
||||
|
log.Fatalf("invalid puzzle day: %s", *day) |
||||
|
} |
||||
|
inputs := inputs(puzzleIndex) |
||||
|
|
||||
|
puzzle := puzzles[puzzleIndex-1] |
||||
|
|
||||
|
fmt.Fprintf(os.Stdout, "Day %d:\n", puzzleIndex) |
||||
|
for i := range inputs { |
||||
|
ans := puzzle.solve(inputs[i]) |
||||
|
fmt.Fprintf(os.Stdout, "Solution %d:\n%s", i+1, ans) |
||||
|
} |
||||
|
fmt.Fprintln(os.Stdout) |
||||
|
} |
Loading…
Reference in new issue