diff --git a/day02/input b/day02/input
new file mode 100644
index 0000000..d61291a
--- /dev/null
+++ b/day02/input
@@ -0,0 +1,1000 @@
+forward 2
+down 9
+up 6
+forward 1
+down 5
+down 7
+down 9
+forward 9
+down 8
+up 7
+forward 2
+up 6
+forward 4
+down 5
+down 9
+up 1
+down 9
+forward 8
+forward 6
+forward 6
+forward 5
+forward 9
+up 3
+up 5
+forward 1
+down 4
+down 7
+forward 2
+up 3
+down 8
+forward 1
+down 2
+forward 3
+up 1
+up 1
+up 7
+forward 5
+up 8
+forward 8
+forward 8
+down 6
+forward 1
+forward 5
+forward 4
+forward 6
+forward 5
+down 6
+down 9
+forward 9
+down 8
+forward 6
+down 5
+forward 9
+up 3
+up 1
+down 8
+down 7
+down 9
+forward 7
+down 8
+down 9
+down 5
+down 3
+forward 1
+forward 6
+down 1
+forward 9
+down 5
+forward 7
+up 2
+down 8
+forward 1
+down 4
+down 9
+down 4
+up 5
+forward 4
+forward 6
+forward 1
+down 3
+forward 1
+down 6
+up 5
+up 4
+forward 6
+forward 1
+forward 1
+down 2
+up 4
+up 3
+up 2
+up 6
+down 6
+forward 1
+down 8
+forward 1
+up 6
+forward 7
+down 5
+forward 4
+forward 6
+down 4
+forward 4
+down 4
+down 4
+forward 2
+forward 8
+down 5
+down 1
+down 8
+up 5
+up 8
+down 5
+forward 4
+down 6
+up 7
+forward 2
+down 3
+forward 2
+forward 2
+down 9
+down 3
+up 6
+forward 8
+up 2
+up 9
+forward 4
+down 1
+down 5
+forward 4
+down 2
+down 3
+forward 5
+down 4
+forward 7
+up 4
+forward 6
+up 8
+forward 1
+up 9
+down 4
+forward 2
+down 1
+forward 7
+down 3
+down 2
+forward 5
+down 3
+down 9
+down 9
+up 5
+forward 2
+down 8
+up 9
+forward 4
+down 3
+forward 3
+forward 6
+up 2
+forward 3
+down 1
+down 1
+down 1
+forward 7
+forward 4
+forward 7
+down 5
+down 6
+down 2
+forward 6
+down 3
+up 6
+forward 4
+down 8
+up 1
+forward 8
+down 2
+down 5
+forward 4
+down 9
+forward 2
+forward 2
+down 3
+forward 3
+down 1
+forward 2
+down 7
+forward 3
+forward 9
+up 9
+forward 6
+forward 2
+down 1
+down 5
+forward 6
+forward 6
+down 3
+up 3
+forward 9
+down 7
+down 2
+down 4
+down 7
+forward 5
+up 4
+forward 8
+down 5
+forward 7
+down 7
+up 7
+down 8
+forward 9
+up 5
+forward 1
+down 2
+forward 5
+down 9
+forward 3
+down 5
+forward 8
+forward 3
+up 5
+down 2
+up 3
+forward 2
+up 1
+up 5
+down 8
+forward 2
+down 5
+up 4
+up 5
+up 2
+forward 9
+forward 6
+down 9
+up 9
+forward 6
+forward 4
+forward 3
+forward 7
+up 1
+down 2
+down 6
+down 1
+forward 8
+down 1
+forward 6
+down 8
+forward 8
+down 7
+down 6
+down 5
+forward 2
+up 8
+up 6
+up 5
+down 1
+forward 1
+down 1
+down 5
+forward 7
+forward 3
+down 1
+forward 5
+forward 5
+forward 8
+down 1
+up 2
+down 6
+up 6
+forward 6
+forward 6
+down 3
+forward 9
+up 4
+forward 4
+down 6
+up 1
+forward 6
+down 2
+down 5
+down 2
+down 6
+up 5
+down 1
+down 1
+forward 3
+forward 7
+forward 3
+up 2
+down 8
+down 4
+down 1
+down 5
+down 1
+down 9
+forward 6
+down 6
+down 4
+down 6
+down 8
+forward 4
+down 6
+down 7
+forward 8
+down 4
+up 4
+down 1
+forward 1
+forward 4
+forward 1
+up 9
+down 7
+forward 7
+down 4
+forward 1
+up 4
+forward 4
+down 5
+down 7
+forward 5
+forward 7
+forward 1
+forward 1
+forward 9
+forward 9
+up 3
+forward 4
+down 2
+forward 9
+up 8
+forward 3
+up 5
+down 3
+down 8
+forward 8
+down 6
+forward 1
+down 6
+down 6
+up 9
+down 2
+forward 8
+up 9
+down 7
+up 9
+up 8
+up 1
+forward 6
+forward 9
+down 2
+forward 8
+down 1
+up 4
+forward 4
+forward 7
+up 2
+forward 4
+down 5
+forward 3
+down 2
+down 7
+down 4
+down 2
+up 5
+down 5
+down 5
+down 4
+up 1
+forward 7
+down 6
+forward 5
+forward 1
+down 4
+up 9
+down 5
+forward 7
+forward 5
+down 6
+down 3
+down 9
+down 1
+forward 6
+up 2
+down 7
+down 3
+down 6
+up 3
+down 4
+down 4
+forward 9
+down 3
+forward 2
+down 9
+down 8
+up 4
+down 2
+forward 2
+down 5
+down 4
+down 4
+down 2
+forward 6
+down 3
+forward 1
+down 4
+forward 7
+down 5
+up 4
+down 6
+forward 8
+down 6
+forward 2
+forward 4
+forward 5
+forward 7
+forward 4
+forward 5
+down 8
+down 7
+forward 3
+forward 5
+up 7
+forward 1
+down 4
+forward 5
+forward 4
+forward 4
+down 5
+down 8
+forward 8
+down 1
+down 1
+down 5
+up 5
+forward 6
+down 6
+forward 3
+forward 4
+forward 7
+forward 4
+down 8
+forward 2
+down 4
+forward 4
+down 1
+up 2
+forward 6
+up 1
+down 7
+down 9
+forward 7
+forward 2
+up 3
+down 2
+down 9
+down 5
+up 7
+forward 1
+forward 8
+down 8
+up 3
+down 3
+forward 9
+up 4
+down 5
+up 5
+down 1
+up 8
+forward 9
+down 3
+up 6
+forward 6
+forward 1
+down 1
+forward 9
+down 8
+forward 8
+down 6
+up 9
+down 4
+up 3
+up 9
+forward 2
+down 2
+down 2
+forward 3
+down 2
+forward 5
+forward 4
+up 8
+forward 9
+up 7
+forward 2
+down 5
+down 6
+forward 8
+up 7
+forward 4
+forward 3
+up 5
+down 8
+forward 3
+up 2
+down 3
+forward 6
+down 9
+down 2
+down 6
+down 2
+forward 7
+forward 5
+forward 7
+down 8
+forward 2
+down 2
+forward 8
+up 8
+forward 4
+forward 3
+up 5
+down 3
+forward 3
+up 8
+up 7
+down 4
+down 1
+forward 2
+down 1
+up 6
+up 4
+down 3
+up 1
+forward 7
+forward 7
+forward 7
+forward 8
+down 1
+forward 5
+down 6
+forward 9
+forward 7
+forward 7
+down 4
+up 4
+down 6
+down 9
+up 4
+up 2
+up 6
+forward 4
+up 4
+up 6
+down 2
+forward 4
+down 9
+forward 9
+forward 9
+down 1
+forward 7
+down 2
+down 7
+down 8
+down 8
+down 9
+up 9
+down 5
+forward 5
+forward 7
+forward 4
+down 7
+forward 8
+forward 1
+down 8
+up 9
+down 7
+forward 9
+forward 4
+forward 8
+down 9
+forward 4
+down 3
+forward 3
+down 1
+down 1
+down 2
+up 5
+down 2
+down 1
+down 8
+forward 3
+up 2
+forward 7
+down 3
+down 8
+down 1
+forward 4
+forward 7
+down 5
+forward 6
+down 6
+down 2
+forward 6
+down 3
+up 4
+down 7
+forward 7
+up 1
+up 9
+down 1
+down 2
+down 8
+down 7
+up 1
+forward 7
+down 2
+forward 4
+forward 6
+forward 9
+down 6
+forward 2
+up 8
+down 2
+up 2
+up 5
+down 8
+up 6
+down 9
+forward 6
+down 8
+down 6
+down 1
+up 7
+up 6
+down 8
+forward 2
+up 7
+forward 5
+forward 7
+forward 7
+up 5
+forward 2
+down 9
+up 2
+up 8
+up 2
+down 3
+down 7
+forward 9
+down 3
+up 9
+forward 8
+up 8
+forward 4
+forward 8
+forward 6
+up 1
+down 3
+up 1
+down 1
+forward 2
+forward 1
+forward 4
+forward 7
+up 8
+down 9
+up 2
+down 7
+forward 4
+down 3
+forward 4
+forward 2
+down 9
+forward 8
+forward 5
+forward 3
+down 6
+forward 4
+forward 4
+forward 9
+forward 4
+up 5
+down 7
+up 6
+forward 5
+down 5
+forward 4
+down 5
+forward 7
+forward 3
+forward 5
+down 5
+forward 4
+down 5
+up 4
+down 8
+up 3
+down 3
+up 5
+forward 4
+forward 5
+down 6
+forward 6
+forward 1
+forward 8
+down 6
+down 9
+up 5
+forward 2
+forward 8
+up 6
+down 6
+forward 2
+down 8
+forward 7
+forward 7
+down 5
+forward 5
+forward 8
+forward 1
+down 4
+down 2
+down 5
+up 4
+forward 3
+forward 5
+down 4
+down 7
+down 4
+up 9
+up 6
+forward 1
+down 8
+up 8
+up 9
+forward 2
+forward 1
+down 6
+forward 6
+down 4
+forward 7
+up 2
+up 1
+forward 4
+down 1
+forward 8
+forward 3
+up 7
+up 5
+down 1
+forward 8
+forward 6
+up 6
+forward 9
+down 5
+down 9
+forward 2
+down 3
+up 1
+up 7
+down 1
+forward 8
+up 9
+down 1
+down 5
+down 7
+down 5
+down 5
+down 5
+up 9
+forward 9
+forward 7
+forward 4
+forward 6
+down 5
+down 3
+forward 9
+forward 1
+down 1
+down 8
+up 4
+down 9
+forward 9
+up 1
+down 5
+forward 8
+up 6
+forward 3
+down 6
+up 8
+down 7
+forward 3
+forward 6
+down 7
+forward 6
+forward 4
+forward 4
+down 4
+forward 6
+forward 5
+down 6
+forward 6
+down 7
+forward 6
+forward 3
+up 4
+up 2
+up 6
+down 2
+down 8
+forward 5
+forward 1
+up 4
+forward 7
+forward 9
+up 6
+down 7
+down 3
+up 5
+forward 5
+down 8
+up 1
+down 1
+down 3
+down 2
+down 1
+forward 5
+down 3
+down 5
+forward 7
+forward 9
+down 3
+forward 7
+forward 5
+forward 4
+forward 2
+forward 7
+forward 8
+forward 6
+down 8
+forward 5
+forward 6
+forward 6
+down 8
+down 2
+forward 4
+down 7
+forward 6
+down 7
+down 4
+forward 6
+up 6
+forward 4
+forward 9
+forward 2
+forward 3
+forward 1
+down 8
+down 3
+forward 4
+up 3
+forward 7
+forward 1
+down 7
+down 8
+forward 1
+up 8
+forward 8
+up 8
+down 5
+forward 6
+down 8
+down 4
+down 9
+up 1
+down 3
+forward 6
+down 6
+forward 7
+forward 3
+down 6
+down 6
+forward 4
+down 4
+down 1
+down 8
+forward 2
+forward 8
+forward 8
+down 6
+forward 9
+down 9
+down 5
+down 5
+forward 7
+down 1
+forward 1
+down 1
+down 6
+down 1
+forward 1
+up 6
+up 9
+forward 5
+down 6
+forward 8
+forward 6
+down 7
+forward 1
+forward 4
+forward 9
+forward 2
+forward 4
+down 2
+forward 1
+forward 8
+down 1
+down 1
+forward 4
+down 5
+down 3
+down 9
+down 2
+up 8
+down 7
+down 1
+down 9
+forward 2
+forward 2
+up 3
+forward 3
+down 3
+forward 5
+forward 9
+down 7
+up 7
+down 9
+forward 3
+forward 7
+down 1
+forward 8
+down 8
+forward 1
+down 8
+down 6
+forward 2
+down 3
+down 1
+down 8
+forward 3
+up 5
+down 7
+up 2
+up 8
+forward 5
+up 7
+down 6
+up 7
+down 9
+forward 5
+up 4
+forward 9
+down 5
+up 7
+down 2
+up 2
+up 7
+forward 5
+down 6
+forward 4
+down 4
+down 3
+forward 2
+up 2
+down 5
+forward 8
+down 3
+up 7
+down 1
+down 7
+forward 7
+forward 4
+forward 7
+down 2
+down 9
+down 6
+down 9
+down 2
+down 9
+down 7
+down 5
+forward 4
+up 5
+up 7
+forward 2
+forward 7
+down 3
+down 3
+forward 4
diff --git a/day02/part1.nim b/day02/part1.nim
new file mode 100644
index 0000000..5486990
--- /dev/null
+++ b/day02/part1.nim
@@ -0,0 +1,50 @@
+# Copyright 2021 Christian Ulrich
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+
+# usage: ./part1 < input
+
+import strutils
+
+proc position(): int =
+ var
+ line = ""
+ hpos = 0
+ vpos = 0
+ while readLine(stdin, line):
+ if line.len() > 0:
+ let command = line.split(' ', 1)
+ if command.len() != 2:
+ raise newException(ValueError, "invalid command")
+ let arg = parseInt(command[1])
+ case command[0]
+ of "forward":
+ hpos.inc(arg)
+ of "up":
+ vpos.dec(arg)
+ of "down":
+ vpos.inc(arg)
+ else:
+ raise newException(ValueError, "invalid command")
+ result = hpos * vpos
+
+proc main(): int =
+ try:
+ echo position()
+ except Exception as error:
+ echo error.msg
+ result = -1
+
+when isMainModule:
+ quit(main())
diff --git a/day02/part2.nim b/day02/part2.nim
new file mode 100644
index 0000000..1a0e048
--- /dev/null
+++ b/day02/part2.nim
@@ -0,0 +1,52 @@
+# Copyright 2021 Christian Ulrich
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+
+# usage: ./part2 < input
+
+import strutils
+
+proc position(): int =
+ var
+ line = ""
+ aim = 0
+ hpos = 0
+ vpos = 0
+ while readLine(stdin, line):
+ if line.len() > 0:
+ let command = line.split(' ', 1)
+ if command.len() != 2:
+ raise newException(ValueError, "invalid command")
+ let arg = parseInt(command[1])
+ case command[0]
+ of "forward":
+ hpos.inc(arg)
+ vpos.inc(aim * arg)
+ of "up":
+ aim.dec(arg)
+ of "down":
+ aim.inc(arg)
+ else:
+ raise newException(ValueError, "invalid command")
+ result = hpos * vpos
+
+proc main(): int =
+ try:
+ echo position()
+ except Exception as error:
+ echo error.msg
+ result = -1
+
+when isMainModule:
+ quit(main())
diff --git a/day02/testinput b/day02/testinput
new file mode 100644
index 0000000..b7172ac
--- /dev/null
+++ b/day02/testinput
@@ -0,0 +1,6 @@
+forward 5
+down 5
+forward 8
+up 3
+down 8
+forward 2