Day 12: pipes
This commit is contained in:
parent
2e2bad9f57
commit
21f04e6b91
7
12dec/input_test
Normal file
7
12dec/input_test
Normal file
@ -0,0 +1,7 @@
|
||||
0 <-> 2
|
||||
1 <-> 1
|
||||
2 <-> 0, 3, 4
|
||||
3 <-> 2, 4
|
||||
4 <-> 2, 3, 6
|
||||
5 <-> 6
|
||||
6 <-> 4, 5
|
94
12dec/main.go
Normal file
94
12dec/main.go
Normal file
@ -0,0 +1,94 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Prog struct {
|
||||
Num int
|
||||
Cx []*Prog
|
||||
}
|
||||
|
||||
var (
|
||||
Progs map[int]*Prog
|
||||
)
|
||||
|
||||
func main() {
|
||||
sc := bufio.NewScanner(os.Stdin)
|
||||
Progs = make(map[int]*Prog)
|
||||
for sc.Scan() {
|
||||
fmt.Println(sc.Text())
|
||||
parse(sc.Text())
|
||||
}
|
||||
nums := make([]int, 0, 0)
|
||||
nums = walk(Progs[0], nums)
|
||||
fmt.Println("result ", len(nums))
|
||||
}
|
||||
|
||||
func appendUniq(nums []int, num int) ([]int, bool) {
|
||||
for _, n := range nums {
|
||||
if n == num {
|
||||
return nums, false
|
||||
}
|
||||
}
|
||||
nums = append(nums, num)
|
||||
return nums, true
|
||||
}
|
||||
|
||||
func walk(p *Prog, nums []int) []int {
|
||||
var added bool
|
||||
nums, added = appendUniq(nums, p.Num)
|
||||
if added {
|
||||
for _, pp := range p.Cx {
|
||||
nums = walk(pp, nums)
|
||||
}
|
||||
}
|
||||
return nums
|
||||
}
|
||||
|
||||
func parse(in string) {
|
||||
expr := strings.Split(in, " <-> ")
|
||||
num, _ := strconv.Atoi(expr[0])
|
||||
p1 := GetProg(num)
|
||||
|
||||
list := strings.Split(expr[1], ", ")
|
||||
for _, l := range list {
|
||||
nl, _ := strconv.Atoi(l)
|
||||
p2 := GetProg(nl)
|
||||
Pipe(p1, p2)
|
||||
Pipe(p2, p1)
|
||||
}
|
||||
}
|
||||
|
||||
func NewProg(num int) *Prog {
|
||||
return &Prog{
|
||||
num,
|
||||
make([]*Prog, 0, 0),
|
||||
}
|
||||
}
|
||||
|
||||
func GetProg(num int) *Prog {
|
||||
p := Progs[num]
|
||||
if p == nil {
|
||||
p = NewProg(num)
|
||||
Progs[num] = p
|
||||
}
|
||||
return p
|
||||
}
|
||||
|
||||
func Pipe(p1, p2 *Prog) {
|
||||
piped := false
|
||||
for _, p := range p1.Cx {
|
||||
if p1.Num == p.Num {
|
||||
piped = true
|
||||
}
|
||||
}
|
||||
if !piped {
|
||||
p1.Cx = append(p1.Cx, p2)
|
||||
fmt.Println("pipe", p1.Num, p2.Num)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user