Skip to content

Commit c2f51ec

Browse files
author
Oscar Franzén
committed
day 23
1 parent 69393e2 commit c2f51ec

File tree

3 files changed

+130
-0
lines changed

3 files changed

+130
-0
lines changed

digidis-go/day23/day23.go

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"io/ioutil"
6+
"strconv"
7+
"strings"
8+
)
9+
10+
func main() {
11+
part1, _ := run(parse("input.txt"))
12+
fmt.Printf("Part 1: %v\n", part1)
13+
fmt.Printf("Part 2 (go): %v\n", part2())
14+
15+
// asm code using the missing div instructions (mod is not needed)
16+
_, part2 := run(parse("input2.txt"))
17+
fmt.Printf("Part 2 (asm): %v\n", part2)
18+
19+
}
20+
21+
func parse(file string) (code [][]string) {
22+
data, _ := ioutil.ReadFile(file)
23+
rows := strings.Split(string(data), "\n")
24+
for _, r := range rows {
25+
code = append(code, strings.Fields(r))
26+
}
27+
return
28+
}
29+
30+
func run(code [][]string) (int, int) {
31+
registers := make(map[string]int)
32+
var pos, mul int
33+
for pos >= 0 && pos < len(code) {
34+
op := code[pos]
35+
switch op[0] {
36+
case "set":
37+
registers[op[1]] = get(registers, op[2])
38+
case "sub":
39+
registers[op[1]] = registers[op[1]] - get(registers, op[2])
40+
case "div":
41+
registers[op[1]] = registers[op[1]] / get(registers, op[2])
42+
case "mul":
43+
registers[op[1]] = registers[op[1]] * get(registers, op[2])
44+
mul++
45+
case "jnz":
46+
if get(registers, op[1]) != 0 {
47+
pos += get(registers, op[2])
48+
continue
49+
}
50+
default:
51+
panic("bad instruciton")
52+
}
53+
pos++
54+
}
55+
return mul, registers["h"]
56+
}
57+
58+
func get(registers map[string]int, r string) int {
59+
i, err := strconv.Atoi(r)
60+
if err == nil {
61+
return i
62+
}
63+
return registers[r]
64+
}
65+
66+
// go version of part 2
67+
func part2() (h int) {
68+
for b := 108400; b <= 125400; b += 17 {
69+
for d := 2; d < b/2; d++ {
70+
if b%d == 0 {
71+
h++
72+
break
73+
}
74+
}
75+
}
76+
return h
77+
}

digidis-go/day23/input.txt

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
set b 84
2+
set c b
3+
jnz a 2
4+
jnz 1 5
5+
mul b 100
6+
sub b -100000
7+
set c b
8+
sub c -17000
9+
set f 1
10+
set d 2
11+
set e 2
12+
set g d
13+
mul g e
14+
sub g b
15+
jnz g 2
16+
set f 0
17+
sub e -1
18+
set g e
19+
sub g b
20+
jnz g -8
21+
sub d -1
22+
set g d
23+
sub g b
24+
jnz g -13
25+
jnz f 2
26+
sub h -1
27+
set g b
28+
sub g c
29+
jnz g 2
30+
jnz 1 3
31+
sub b -17
32+
jnz 1 -23

digidis-go/day23/input2.txt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
set b 108400
2+
set c 125400
3+
set d 2
4+
set g b
5+
div g d
6+
mul g d
7+
sub g b
8+
jnz g 3
9+
sub h -1
10+
jnz 1 6
11+
sub d -1
12+
set g b
13+
div g 2
14+
sub g d
15+
jnz g -11
16+
set g b
17+
sub g c
18+
jnz g 2
19+
jnz 1 3
20+
sub b -17
21+
jnz 1 -18

0 commit comments

Comments
 (0)