day 20 day one
This commit is contained in:
parent
cc7256461e
commit
e13255ab2f
165
20/main.go
Normal file
165
20/main.go
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
start := time.Now()
|
||||||
|
partOne()
|
||||||
|
duration := time.Since(start)
|
||||||
|
partTwo()
|
||||||
|
duration2 := time.Since(start)
|
||||||
|
fmt.Printf("p1: %s, p2: %s\n", duration, duration2-duration)
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeScanner(test bool) *bufio.Scanner {
|
||||||
|
var f *os.File
|
||||||
|
if test {
|
||||||
|
f, _ = os.Open("inputs/testinput")
|
||||||
|
} else {
|
||||||
|
f, _ = os.Open("inputs/input")
|
||||||
|
}
|
||||||
|
reader := bufio.NewReader(f)
|
||||||
|
return bufio.NewScanner(reader)
|
||||||
|
}
|
||||||
|
|
||||||
|
type coord struct {
|
||||||
|
x int
|
||||||
|
y int
|
||||||
|
}
|
||||||
|
|
||||||
|
// grid SHOULD be like this:
|
||||||
|
// x ->
|
||||||
|
// y
|
||||||
|
// |
|
||||||
|
// V
|
||||||
|
|
||||||
|
type image struct {
|
||||||
|
background rune // what all uninitialized cells are set to; defaults to '.'
|
||||||
|
grid map[coord]rune
|
||||||
|
topleft coord
|
||||||
|
size int
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetNeighbors(c coord) []coord {
|
||||||
|
return []coord{
|
||||||
|
{x: c.x - 1, y: c.y - 1},
|
||||||
|
{x: c.x, y: c.y - 1},
|
||||||
|
{x: c.x + 1, y: c.y - 1},
|
||||||
|
|
||||||
|
{x: c.x - 1, y: c.y},
|
||||||
|
{x: c.x, y: c.y},
|
||||||
|
{x: c.x + 1, y: c.y},
|
||||||
|
|
||||||
|
{x: c.x - 1, y: c.y + 1},
|
||||||
|
{x: c.x, y: c.y + 1},
|
||||||
|
{x: c.x + 1, y: c.y + 1},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (img *image) GetNewRune(coord coord, enhancementMap string) rune {
|
||||||
|
index := 0
|
||||||
|
coords := GetNeighbors(coord)
|
||||||
|
for i := 0; i < len(coords); i++ {
|
||||||
|
value := img.grid[coords[i]]
|
||||||
|
if value == 0 {
|
||||||
|
value = img.background
|
||||||
|
}
|
||||||
|
if value == '#' {
|
||||||
|
index += (1 << (8 - i))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rune(enhancementMap[index])
|
||||||
|
}
|
||||||
|
|
||||||
|
func (img *image) CountBrightPixels() int {
|
||||||
|
count := 0
|
||||||
|
for _, v := range img.grid {
|
||||||
|
if v == '#' {
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count
|
||||||
|
}
|
||||||
|
|
||||||
|
func (img *image) Print() {
|
||||||
|
fmt.Println(strings.Repeat(string(img.background), img.size+2))
|
||||||
|
for y := img.topleft.y; y < img.size+img.topleft.y; y++ {
|
||||||
|
fmt.Print(string(img.background))
|
||||||
|
for x := img.topleft.x; x < img.size+img.topleft.x; x++ {
|
||||||
|
fmt.Printf("%s", string(img.grid[coord{x, y}]))
|
||||||
|
}
|
||||||
|
fmt.Printf("%s\n", string(img.background))
|
||||||
|
}
|
||||||
|
fmt.Println(strings.Repeat(string(img.background), img.size+2))
|
||||||
|
}
|
||||||
|
|
||||||
|
func Enhance(img *image, m string) *image {
|
||||||
|
next := &image{
|
||||||
|
topleft: coord{
|
||||||
|
x: img.topleft.x - 1,
|
||||||
|
y: img.topleft.y - 1,
|
||||||
|
},
|
||||||
|
size: img.size + 2,
|
||||||
|
grid: map[coord]rune{},
|
||||||
|
}
|
||||||
|
if img.background == '.' { // permute new "background" value
|
||||||
|
next.background = rune(m[0])
|
||||||
|
} else if img.background == '#' {
|
||||||
|
next.background = rune(m[511])
|
||||||
|
}
|
||||||
|
for y := img.topleft.y - 1; y < img.size+1; y++ {
|
||||||
|
for x := img.topleft.x - 1; x < img.size+1; x++ {
|
||||||
|
next.grid[coord{x, y}] = img.GetNewRune(coord{x, y}, m)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return next
|
||||||
|
}
|
||||||
|
|
||||||
|
func partOne() {
|
||||||
|
scanner := makeScanner(false)
|
||||||
|
|
||||||
|
scanner.Scan()
|
||||||
|
enhancementString := scanner.Text()
|
||||||
|
scanner.Scan() // eat empty line
|
||||||
|
|
||||||
|
img := &image{
|
||||||
|
background: '.',
|
||||||
|
grid: map[coord]rune{},
|
||||||
|
topleft: coord{0, 0},
|
||||||
|
}
|
||||||
|
|
||||||
|
y := 0
|
||||||
|
for scanner.Scan() {
|
||||||
|
line := scanner.Text()
|
||||||
|
img.size = len(line)
|
||||||
|
for x, c := range line {
|
||||||
|
img.grid[coord{x, y}] = c
|
||||||
|
}
|
||||||
|
y++
|
||||||
|
}
|
||||||
|
|
||||||
|
img.Print()
|
||||||
|
fmt.Println(img.CountBrightPixels())
|
||||||
|
fmt.Println("")
|
||||||
|
|
||||||
|
for i := 0; i < 2; i++ {
|
||||||
|
img = Enhance(img, enhancementString)
|
||||||
|
img.Print()
|
||||||
|
fmt.Println(img.CountBrightPixels())
|
||||||
|
fmt.Println("")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func partTwo() {
|
||||||
|
scanner := makeScanner(false)
|
||||||
|
|
||||||
|
for scanner.Scan() {
|
||||||
|
// line := scanner.Text()
|
||||||
|
}
|
||||||
|
}
|
66
20/main_test.go
Normal file
66
20/main_test.go
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestGetNewRune(t *testing.T) {
|
||||||
|
img := image{
|
||||||
|
grid: map[coord]rune{
|
||||||
|
{0, 0}: '.', {1, 0}: '.', {2, 0}: '.',
|
||||||
|
{0, 1}: '.', {1, 1}: '.', {2, 1}: '.',
|
||||||
|
{0, 2}: '.', {1, 2}: '.', {2, 2}: '.',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
if img.GetNewRune(coord{1, 1}, ".") != '.' {
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
|
||||||
|
img = image{
|
||||||
|
grid: map[coord]rune{
|
||||||
|
{0, 0}: '.', {1, 0}: '.', {2, 0}: '.',
|
||||||
|
{0, 1}: '.', {1, 1}: '.', {2, 1}: '.',
|
||||||
|
{0, 2}: '.', {1, 2}: '.', {2, 2}: '#',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
if img.GetNewRune(coord{1, 1}, ".#") != '#' {
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
|
||||||
|
img = image{
|
||||||
|
grid: map[coord]rune{
|
||||||
|
{0, 0}: '.', {1, 0}: '.', {2, 0}: '.',
|
||||||
|
{0, 1}: '.', {1, 1}: '.', {2, 1}: '.',
|
||||||
|
{0, 2}: '.', {1, 2}: '#', {2, 2}: '.',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
if img.GetNewRune(coord{1, 1}, "..#.") != '#' {
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
|
||||||
|
img = image{
|
||||||
|
grid: map[coord]rune{
|
||||||
|
{0, 0}: '.', {1, 0}: '.', {2, 0}: '.',
|
||||||
|
{0, 1}: '.', {1, 1}: '.', {2, 1}: '.',
|
||||||
|
{0, 2}: '.', {1, 2}: '#', {2, 2}: '#',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
if img.GetNewRune(coord{1, 1}, "...#") != '#' {
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
|
||||||
|
img = image{
|
||||||
|
background: '#',
|
||||||
|
grid: map[coord]rune{
|
||||||
|
{0, 0}: '.', {1, 0}: '.', {2, 0}: '.',
|
||||||
|
{0, 1}: '.', {1, 1}: '.', {2, 1}: '.',
|
||||||
|
{0, 2}: '.', {1, 2}: '#', {2, 2}: '#',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
m := strings.Repeat(".", 484)
|
||||||
|
m += "#"
|
||||||
|
if img.GetNewRune(coord{0, 0}, m) != '#' { // 111100100, or 484
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user