diff --git a/jour03/jour3.go b/jour03/jour3.go index a5a228b..1b2ad03 100644 --- a/jour03/jour3.go +++ b/jour03/jour3.go @@ -13,12 +13,6 @@ type Coord struct { y int } -func check(e error) { - if e != nil { - panic(e) - } -} - func coordDansListe(l *list.List, e Coord) (bool) { var tmp Coord for elem := l.Front(); elem != nil; elem = elem.Next() { @@ -30,42 +24,85 @@ func coordDansListe(l *list.List, e Coord) (bool) { return false } +func nouvCoord(l *list.List, c string, pred Coord) (Coord, bool) { + ret := false + switch c { + case "^": + pred.y++ + case ">": + pred.x++ + case "<": + pred.x-- + case "v": + pred.y-- + } + + if !coordDansListe(l, pred) { + l.PushFront(pred) + ret = true + } + + return pred, ret +} + func p_partie(file *os.File) { reader := bufio.NewReader(file) + var nouvMaison bool var pred Coord - pred.x = 0 - pred.y = 0 - nbMaison := 1 + pred.x, pred.y = 0, 0 + nbMaisons := 1 listeMaison := list.New() listeMaison.PushFront(pred) - char, _, err := reader.ReadRune() - for err != io.EOF { - switch string(char) { - case "^": - pred.y++ - case ">": - pred.x++ - case "<": - pred.x-- - case "v": - pred.y-- - } - - if !coordDansListe(listeMaison, pred) { - listeMaison.PushFront(pred) - nbMaison++ + for char, _, err := reader.ReadRune(); err != io.EOF; { + pred, nouvMaison = nouvCoord(listeMaison, string(char), pred) + if nouvMaison { + nbMaisons++ } char, _, err = reader.ReadRune() } - fmt.Printf("Il y a %d maisons déservies\n", nbMaison) + fmt.Printf("Il y a %d maisons déservies\n", nbMaisons) +} + +func d_partie(file *os.File) { + reader := bufio.NewReader(file) + var nouvMaison bool + var predNoel, predRobot Coord + predNoel.x , predNoel.y, predRobot.x, predRobot.y = 0, 0, 0, 0 + nbMaisons := 1 + listeMaison := list.New() + listeMaison.PushFront(predNoel) + + char, _, err := reader.ReadRune() + i := 0 + + for err != io.EOF { + if i % 2 == 0 { + predNoel, nouvMaison = nouvCoord(listeMaison, string(char), predNoel) + } else { + predRobot, nouvMaison = nouvCoord(listeMaison, string(char), predRobot) + } + + if nouvMaison { + nbMaisons++ + } + char, _, err = reader.ReadRune() + i++ + } + fmt.Printf("Il y a %d maisons déservies\n", nbMaisons) } func main() { inputFile, err := os.Open("input") - check(err) + if err != nil { + panic(err) + } + fmt.Printf("Traitement partie 1…\n") p_partie(inputFile) + inputFile.Seek(0, 0) + fmt.Printf("Traitement partie 2…\n") + d_partie(inputFile) inputFile.Close() }