aboutsummaryrefslogtreecommitdiff
path: root/day18
diff options
context:
space:
mode:
Diffstat (limited to 'day18')
-rw-r--r--day18/input41
-rwxr-xr-xday18/part142
2 files changed, 83 insertions, 0 deletions
diff --git a/day18/input b/day18/input
new file mode 100644
index 0000000..156807f
--- /dev/null
+++ b/day18/input
@@ -0,0 +1,41 @@
+set i 31
+set a 1
+mul p 17
+jgz p p
+mul a 2
+add i -1
+jgz i -2
+add a -1
+set i 127
+set p 952
+mul p 8505
+mod p a
+mul p 129749
+add p 12345
+mod p a
+set b p
+mod b 10000
+snd b
+add i -1
+jgz i -9
+jgz a 3
+rcv b
+jgz b -1
+set f 0
+set i 126
+rcv a
+rcv b
+set p a
+mul p -1
+add p b
+jgz p 4
+snd a
+set a b
+jgz 1 3
+snd b
+set f 1
+add i -1
+jgz i -11
+snd a
+jgz f -16
+jgz a -19
diff --git a/day18/part1 b/day18/part1
new file mode 100755
index 0000000..70a0d94
--- /dev/null
+++ b/day18/part1
@@ -0,0 +1,42 @@
+#!/usr/bin/env ruby
+
+def valof(reg_file, reg_or_int)
+ if reg_or_int >= 'a' && reg_or_int <= 'z' then
+ return reg_file[reg_or_int] || 0
+ end
+ return reg_or_int.to_i
+end
+
+input = $stdin.readlines.map(&:chomp)
+
+reg = {}
+snd = 0
+pc = 0
+
+loop do
+ break if pc >= input.length
+ istr = input[pc].split
+ case istr[0]
+ when 'snd'
+ snd = valof(reg, istr[1])
+ when 'set'
+ reg[istr[1]] = valof(reg, istr[2])
+ when 'add'
+ reg[istr[1]] = valof(reg, istr[1]) + valof(reg, istr[2])
+ when 'mul'
+ reg[istr[1]] = valof(reg, istr[1]) * valof(reg, istr[2])
+ when 'mod'
+ reg[istr[1]] = valof(reg, istr[1]) % valof(reg, istr[2])
+ when 'rcv'
+ unless valof(reg, istr[1]) == 0 then
+ puts snd
+ break
+ end
+ when 'jgz'
+ if valof(reg, istr[1]) > 0 then
+ pc += valof(reg, istr[2])
+ pc -= 1
+ end
+ end
+ pc += 1
+end