summaryrefslogtreecommitdiffstats
path: root/2021/17
diff options
context:
space:
mode:
Diffstat (limited to '2021/17')
-rw-r--r--2021/17/code.tl46
-rw-r--r--2021/17/errors.err2
-rw-r--r--2021/17/input1
-rw-r--r--2021/17/testinput1
4 files changed, 50 insertions, 0 deletions
diff --git a/2021/17/code.tl b/2021/17/code.tl
new file mode 100644
index 0000000..af76de0
--- /dev/null
+++ b/2021/17/code.tl
@@ -0,0 +1,46 @@
+(defstruct spec ()
+ x0 x1
+ y0 y1)
+
+(defun read-input (: (name "input"))
+ (flow name
+ file-get-string
+ (match `target area: x=@x0..@x1, y=@y0..@y1\n@nil` @1
+ (new spec x0 (toint x0) x1 (toint x1) y0 (toint y0) y1 (toint y1)))))
+
+(defun simulate-shot (sp xv yv)
+ (let ((x0 sp.x0) (x1 sp.x1)
+ (y0 sp.y0) (y1 sp.y1))
+ (for ((x 0) (y 0) (maxy -1000)) () ()
+ (cond
+ ((or (< y y0) (> x x1))
+ (return))
+ ((and (<= x0 x x1) (<= y0 y y1))
+ (return maxy)))
+ (inc x xv)
+ (inc y yv)
+ (upd maxy (max y maxy))
+ (dec xv (signum xv))
+ (dec yv 1))))
+
+(defun solve-one (: (name :))
+ (let ((sp (read-input name)))
+ (flow
+ (build
+ (each-prod ((xv 1..40)
+ (yv 1..700))
+ (iflet ((maxy (simulate-shot sp xv yv)))
+ (add (list xv yv maxy)))))
+ (find-max @1 : caddr))))
+
+(defun solve-two (: (name :))
+ (let ((sp (read-input name)))
+ (flow
+ (build
+ (each-prod ((xv 1..300)
+ (yv -100..400))
+ (iflet ((maxy (simulate-shot sp xv yv)))
+ (add (list xv yv maxy)))))
+ (mapcar (ap list @1 @2))
+ uniq
+ len)))
diff --git a/2021/17/errors.err b/2021/17/errors.err
new file mode 100644
index 0000000..6bff0b0
--- /dev/null
+++ b/2021/17/errors.err
@@ -0,0 +1,2 @@
+defmicro: error: expansion is larger than original form: switch to defmacro.
+1>
diff --git a/2021/17/input b/2021/17/input
new file mode 100644
index 0000000..d9179a5
--- /dev/null
+++ b/2021/17/input
@@ -0,0 +1 @@
+target area: x=240..292, y=-90..-57
diff --git a/2021/17/testinput b/2021/17/testinput
new file mode 100644
index 0000000..a07e02d
--- /dev/null
+++ b/2021/17/testinput
@@ -0,0 +1 @@
+target area: x=20..30, y=-10..-5