day10, reading & printing
This commit is contained in:
parent
3919a70d09
commit
c2091b49fd
|
@ -0,0 +1,143 @@
|
|||
package day10
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func Run() int {
|
||||
fmt.Println("hello day 10")
|
||||
// filename := "day10/example2noisy"
|
||||
filename := "day10/example1"
|
||||
fieldMap := Read(filename)
|
||||
fmt.Println(fieldMap.String())
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
// so do i work with just [][]rune ?
|
||||
// func Next(from Coord, through Coord) (Coord, error) ?
|
||||
// and here check that 'from' has exit into 'through'
|
||||
// and check that 'through' has entrance from 'from'
|
||||
|
||||
// so, i guess i could do 'exit direction' and 'entrance direction'
|
||||
// then compare 'exit direction' with what's available on 'from'
|
||||
//
|
||||
// or i can just have function 'canExit(from, to Coord)' and canEnter(from, to Coord)
|
||||
|
||||
// i suppose it would be nice to just create Cell(Coord, Type) and
|
||||
// cell would map 'from' to 'to'
|
||||
|
||||
type Cell struct {
|
||||
Coord Coord
|
||||
Tile rune
|
||||
}
|
||||
func (c *Cell)String() string {
|
||||
switch c.Tile {
|
||||
case '7': return "⌝"
|
||||
case 'J': return "⌟"
|
||||
case 'F': return "⌜"
|
||||
case 'L': return "⌞"
|
||||
case '.': return " "
|
||||
default: return string(c.Tile)
|
||||
}
|
||||
}
|
||||
type Coord struct {
|
||||
X, Y int
|
||||
}
|
||||
|
||||
type Map struct {
|
||||
Cells map[Coord]Cell
|
||||
Height, Width int
|
||||
BeastCoord Coord
|
||||
}
|
||||
func (m *Map)String() string {
|
||||
result := ""
|
||||
for y := 0; y < m.Height; y++ {
|
||||
for x := 0; x < m.Width; x++ {
|
||||
cell := m.Cells[Coord{x, y}]
|
||||
result += cell.String()
|
||||
}
|
||||
result += "\n"
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func Read(filename string) Map {
|
||||
result := Map{}
|
||||
bytes, err := os.ReadFile(filename)
|
||||
if err != nil {
|
||||
panic(fmt.Sprint("cannot read file ", filename))
|
||||
}
|
||||
lines := strings.Split(string(bytes), "\n")
|
||||
result.Height = len(lines)
|
||||
result.Width = len(lines[0])
|
||||
result.Cells = map[Coord]Cell{}
|
||||
|
||||
for y, line := range lines {
|
||||
for x, symb := range line {
|
||||
coord := Coord{X: x, Y: y}
|
||||
if symb == 'S' {
|
||||
result.BeastCoord = coord
|
||||
}
|
||||
result.Cells[coord] = Cell{
|
||||
Coord: coord,
|
||||
Tile: symb,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
// doesn't check whether 'from' has exit into c
|
||||
// only whether c can accept conntion from that direction
|
||||
func (c *Cell) Next(from Coord) (to Coord, err error) {
|
||||
nextCoord, found := c.Directions()[from]
|
||||
if !found {
|
||||
return Coord{}, errors.New(fmt.Sprintf("no direction from %+v to %+v through %+v\n", from, to, c))
|
||||
}
|
||||
|
||||
return nextCoord, nil
|
||||
}
|
||||
|
||||
// x from left to right; y from top to bottom
|
||||
func (c *Cell) Directions() map[Coord]Coord {
|
||||
x, y := c.Coord.X, c.Coord.Y
|
||||
switch c.Tile {
|
||||
case '|':
|
||||
return map[Coord]Coord{
|
||||
{x, y + 1}: {x, y - 1},
|
||||
{x, y - 1}: {x, y + 1},
|
||||
}
|
||||
case '-':
|
||||
return map[Coord]Coord{
|
||||
{x - 1, y}: {x + 1, y},
|
||||
{x + 1, y}: {x - 1, y},
|
||||
}
|
||||
case 'L':
|
||||
return map[Coord]Coord{
|
||||
{x, y + 1}: {x + 1, y},
|
||||
{x + 1, y}: {x, y + 1},
|
||||
}
|
||||
case 'J':
|
||||
return map[Coord]Coord{
|
||||
{x, y + 1}: {x - 1, y},
|
||||
{x - 1, y}: {x, y + 1},
|
||||
}
|
||||
case 'F':
|
||||
return map[Coord]Coord{
|
||||
{x + 1, y}: {x, y + 1},
|
||||
{x, y + 1}: {x + 1, y},
|
||||
}
|
||||
case '7':
|
||||
return map[Coord]Coord{
|
||||
{x - 1, y}: {x, y + 1},
|
||||
{x, y + 1}: {x - 1, y},
|
||||
}
|
||||
default:
|
||||
return map[Coord]Coord{}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
.....
|
||||
.S-7.
|
||||
.|.|.
|
||||
.L-J.
|
||||
.....
|
|
@ -0,0 +1,5 @@
|
|||
-L|F7
|
||||
7S-7|
|
||||
L|7||
|
||||
-L-J|
|
||||
L|-JF
|
|
@ -0,0 +1,5 @@
|
|||
..F7.
|
||||
.FJ|.
|
||||
SJ.L7
|
||||
|F--J
|
||||
LJ...
|
|
@ -0,0 +1,5 @@
|
|||
7-F7-
|
||||
.FJ|7
|
||||
SJLL7
|
||||
|F--J
|
||||
LJ.LJ
|
6
main.go
6
main.go
|
@ -3,12 +3,12 @@ package main
|
|||
import (
|
||||
"log"
|
||||
|
||||
"sunshine.industries/aoc2023/day9"
|
||||
"sunshine.industries/aoc2023/day10"
|
||||
)
|
||||
|
||||
func main() {
|
||||
log.Print("> starting run:")
|
||||
|
||||
result := day9.Run2()
|
||||
log.Printf("day9 result: %d\n****\n", result)
|
||||
result := day10.Run()
|
||||
log.Printf("day10 result: %d\n****\n", result)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue