(defun puzzle03/process-wires () '(((#\R . 999) (#\D . 467) (#\L . 84) (#\D . 619) (#\L . 49) (#\U . 380) (#\R . 287) (#\U . 80) (#\R . 744) (#\D . 642) (#\L . 340) (#\U . 738) (#\R . 959) (#\U . 710) (#\R . 882) (#\U . 861) (#\L . 130) (#\D . 354) (#\L . 579) (#\D . 586) (#\R . 798) (#\D . 735) (#\L . 661) (#\D . 453) (#\L . 828) (#\U . 953) (#\R . 604) (#\D . 834) (#\R . 921) (#\D . 348) (#\R . 620) (#\U . 775) (#\R . 364) (#\U . 552) (#\L . 221) (#\U . 119) (#\R . 590) (#\U . 29) (#\L . 267) (#\D . 745) (#\L . 128) (#\U . 468) (#\L . 978) (#\D . 717) (#\R . 883) (#\D . 227) (#\R . 691) (#\D . 330) (#\L . 33) (#\U . 520) (#\L . 862) (#\D . 132) (#\R . 99) (#\U . 400) (#\L . 455) (#\U . 737) (#\L . 603) (#\U . 220) (#\L . 689) (#\U . 131) (#\R . 158) (#\D . 674) (#\R . 617) (#\D . 287) (#\R . 422) (#\U . 734) (#\L . 73) (#\U . 327) (#\L . 525) (#\D . 245) (#\R . 849) (#\D . 692) (#\R . 114) (#\U . 136) (#\R . 762) (#\D . 5) (#\R . 329) (#\U . 429) (#\L . 849) (#\U . 748) (#\R . 816) (#\U . 556) (#\R . 614) (#\D . 412) (#\R . 416) (#\D . 306) (#\R . 307) (#\U . 826) (#\R . 880) (#\U . 936) (#\L . 164) (#\U . 984) (#\L . 689) (#\D . 934) (#\R . 790) (#\D . 14) (#\R . 561) (#\D . 736) (#\L . 3) (#\D . 442) (#\R . 301) (#\D . 520) (#\L . 451) (#\U . 76) (#\R . 844) (#\D . 307) (#\L . 144) (#\D . 800) (#\L . 462) (#\D . 138) (#\R . 956) (#\U . 225) (#\L . 393) (#\D . 186) (#\L . 924) (#\D . 445) (#\L . 86) (#\D . 640) (#\L . 920) (#\D . 877) (#\L . 197) (#\U . 191) (#\L . 371) (#\D . 701) (#\R . 826) (#\D . 282) (#\R . 856) (#\D . 412) (#\L . 788) (#\D . 417) (#\R . 69) (#\D . 678) (#\R . 978) (#\D . 268) (#\L . 268) (#\U . 112) (#\L . 69) (#\U . 164) (#\L . 748) (#\U . 191) (#\R . 227) (#\D . 227) (#\R . 59) (#\U . 749) (#\R . 134) (#\U . 779) (#\R . 865) (#\U . 247) (#\R . 55) (#\D . 567) (#\R . 821) (#\U . 799) (#\R . 937) (#\D . 942) (#\L . 445) (#\D . 571) (#\R . 685) (#\D . 111) (#\R . 107) (#\D . 769) (#\R . 269) (#\D . 968) (#\R . 102) (#\U . 335) (#\R . 538) (#\U . 125) (#\L . 725) (#\D . 654) (#\R . 451) (#\D . 242) (#\R . 777) (#\U . 813) (#\R . 799) (#\D . 786) (#\L . 804) (#\U . 313) (#\L . 322) (#\U . 771) (#\R . 219) (#\U . 316) (#\L . 973) (#\U . 963) (#\R . 84) (#\D . 289) (#\R . 825) (#\D . 299) (#\L . 425) (#\D . 49) (#\R . 995) (#\D . 486) (#\R . 550) (#\D . 789) (#\R . 735) (#\D . 501) (#\R . 966) (#\U . 955) (#\R . 432) (#\U . 635) (#\L . 353) (#\D . 600) (#\R . 675) (#\D . 236) (#\R . 864) (#\U . 322) (#\R . 719) (#\D . 418) (#\L . 877) (#\U . 833) (#\R . 839) (#\D . 634) (#\L . 533) (#\D . 438) (#\L . 734) (#\U . 130) (#\L . 578) (#\U . 498) (#\L . 984) (#\D . 413) (#\L . 615) (#\U . 40) (#\L . 699) (#\U . 656) (#\L . 653) (#\U . 419) (#\R . 856) (#\U . 882) (#\R . 30) (#\D . 266) (#\R . 386) (#\D . 692) (#\L . 210) (#\U . 802) (#\L . 390) (#\U . 753) (#\L . 406) (#\U . 338) (#\R . 743) (#\D . 320) (#\L . 125) (#\U . 204) (#\R . 391) (#\U . 537) (#\R . 887) (#\D . 194) (#\L . 302) (#\U . 400) (#\R . 510) (#\U . 92) (#\L . 310) (#\D . 382) (#\R . 597) (#\U . 498) (#\R . 851) (#\D . 357) (#\L . 568) (#\U . 800) (#\R . 918) (#\D . 106) (#\R . 673) (#\D . 735) (#\L . 86) (#\D . 67) (#\R . 398) (#\D . 677) (#\R . 355) (#\D . 501) (#\L . 909) (#\D . 133) (#\R . 729) (#\D . 293) (#\L . 498) (#\U . 222) (#\R . 832) (#\U . 671) (#\R . 751) (#\U . 36) (#\R . 422) (#\U . 840) (#\L . 636) (#\D . 476) (#\L . 292) (#\D . 105) (#\L . 239) (#\U . 199) (#\R . 669) (#\U . 736) (#\L . 345) (#\D . 911) (#\L . 277) (#\U . 452) (#\L . 979) (#\D . 153) (#\R . 882) (#\U . 604) (#\R . 602) (#\U . 495) (#\L . 311) (#\U . 453) (#\L . 215) (#\D . 713) (#\R . 873)) ((#\L . 996) (#\U . 773) (#\L . 865) (#\D . 472) (#\L . 988) (#\D . 570) (#\L . 388) (#\U . 458) (#\L . 87) (#\U . 885) (#\L . 115) (#\U . 55) (#\R . 75) (#\U . 582) (#\R . 695) (#\U . 883) (#\R . 83) (#\U . 285) (#\R . 96) (#\D . 244) (#\L . 647) (#\D . 359) (#\R . 136) (#\U . 107) (#\R . 912) (#\U . 871) (#\L . 844) (#\U . 395) (#\L . 63) (#\U . 899) (#\L . 205) (#\D . 137) (#\R . 549) (#\U . 221) (#\L . 859) (#\D . 429) (#\L . 809) (#\U . 127) (#\R . 304) (#\U . 679) (#\L . 511) (#\U . 144) (#\R . 926) (#\U . 95) (#\L . 805) (#\U . 811) (#\R . 42) (#\D . 248) (#\L . 546) (#\D . 644) (#\L . 551) (#\D . 897) (#\R . 368) (#\D . 391) (#\L . 224) (#\U . 164) (#\L . 490) (#\D . 991) (#\L . 146) (#\D . 615) (#\R . 536) (#\U . 247) (#\R . 10) (#\U . 998) (#\L . 957) (#\D . 233) (#\R . 706) (#\D . 926) (#\R . 760) (#\U . 438) (#\R . 270) (#\D . 983) (#\R . 134) (#\U . 738) (#\L . 262) (#\U . 301) (#\L . 480) (#\D . 635) (#\L . 702) (#\D . 715) (#\R . 479) (#\U . 500) (#\R . 19) (#\D . 291) (#\R . 368) (#\U . 203) (#\R . 305) (#\D . 999) (#\R . 106) (#\U . 355) (#\L . 683) (#\D . 298) (#\R . 90) (#\U . 968) (#\L . 254) (#\D . 936) (#\R . 89) (#\U . 496) (#\R . 253) (#\U . 688) (#\R . 99) (#\U . 637) (#\L . 783) (#\D . 451) (#\R . 673) (#\D . 762) (#\R . 997) (#\D . 50) (#\L . 488) (#\U . 551) (#\L . 871) (#\U . 388) (#\R . 949) (#\D . 371) (#\R . 584) (#\D . 908) (#\L . 880) (#\U . 523) (#\R . 557) (#\U . 436) (#\R . 520) (#\U . 587) (#\L . 56) (#\U . 18) (#\R . 397) (#\U . 541) (#\R . 660) (#\D . 444) (#\R . 51) (#\U . 187) (#\R . 221) (#\U . 902) (#\R . 726) (#\U . 303) (#\R . 97) (#\D . 817) (#\R . 185) (#\D . 218) (#\L . 240) (#\D . 67) (#\L . 259) (#\U . 334) (#\R . 821) (#\U . 629) (#\R . 21) (#\D . 970) (#\R . 282) (#\U . 155) (#\R . 555) (#\D . 678) (#\L . 99) (#\D . 570) (#\R . 863) (#\D . 405) (#\R . 941) (#\U . 584) (#\L . 303) (#\D . 109) (#\L . 871) (#\U . 180) (#\R . 595) (#\D . 226) (#\L . 670) (#\D . 943) (#\L . 127) (#\U . 647) (#\R . 452) (#\D . 570) (#\R . 75) (#\D . 284) (#\R . 414) (#\U . 404) (#\R . 515) (#\U . 993) (#\R . 408) (#\U . 488) (#\R . 890) (#\D . 318) (#\L . 415) (#\U . 969) (#\R . 769) (#\D . 976) (#\L . 732) (#\U . 1) (#\R . 489) (#\U . 655) (#\R . 930) (#\U . 638) (#\R . 649) (#\D . 254) (#\R . 161) (#\U . 287) (#\L . 659) (#\D . 26) (#\L . 477) (#\D . 821) (#\L . 124) (#\U . 538) (#\R . 17) (#\D . 711) (#\L . 203) (#\U . 888) (#\R . 904) (#\U . 648) (#\L . 908) (#\D . 65) (#\L . 215) (#\U . 283) (#\R . 698) (#\U . 28) (#\R . 72) (#\U . 214) (#\R . 499) (#\D . 89) (#\R . 489) (#\D . 58) (#\R . 949) (#\D . 91) (#\L . 710) (#\U . 960) (#\L . 755) (#\D . 402) (#\L . 27) (#\D . 873) (#\R . 61) (#\U . 607) (#\R . 57) (#\D . 548) (#\R . 369) (#\U . 622) (#\L . 244) (#\U . 19) (#\R . 61) (#\D . 606) (#\R . 928) (#\D . 968) (#\R . 10) (#\D . 988) (#\R . 816) (#\U . 500) (#\R . 915) (#\D . 400) (#\R . 546) (#\D . 283) (#\L . 627) (#\D . 919) (#\L . 259) (#\U . 337) (#\R . 374) (#\U . 795) (#\L . 355) (#\D . 989) (#\L . 224) (#\D . 77) (#\L . 872) (#\U . 901) (#\R . 476) (#\U . 765) (#\L . 320) (#\U . 768) (#\L . 937) (#\D . 437) (#\R . 141) (#\D . 822) (#\L . 326) (#\D . 324) (#\L . 498) (#\U . 994) (#\L . 518) (#\D . 857) (#\R . 973) (#\D . 681) (#\L . 710) (#\D . 590) (#\L . 879) (#\U . 499) (#\R . 488) (#\D . 151) (#\L . 242) (#\U . 988) (#\L . 944) (#\U . 683) (#\L . 24) (#\U . 491) (#\R . 823) (#\D . 246) (#\R . 872) (#\D . 654) (#\R . 28) (#\U . 581) (#\L . 142) (#\U . 31) (#\R . 435) (#\D . 686) (#\L . 147) (#\D . 102) (#\R . 952) (#\D . 607) (#\L . 959) (#\D . 929) (#\L . 46)))) (defun puzzle03/collect-positions (wire) (let ((positions (make-hash-table :test #'equal)) (x 0) (y 0)) (dolist (data wire) (destructuring-bind (dir . dist) data (dotimes (i dist) (ecase dir (#\U (decf y)) (#\D (incf y)) (#\L (decf x)) (#\R (incf x))) (setf (gethash (cons x y) positions) (cons x y))))) positions)) (defun puzzle03/get-distances (wire crossings) (let ((distances (make-hash-table :test #'equal)) (distance 0) (position (cons 0 0))) (dolist (data wire) (destructuring-bind (dir . dist) data (dotimes (i dist) (ecase dir (#\U (decf (cdr position))) (#\D (incf (cdr position))) (#\L (decf (car position))) (#\R (incf (car position)))) (incf distance) (when (gethash position crossings) (setf (gethash position distances) distance))))) distances)) (defun puzzle03/part2 () (destructuring-bind (wire1 wire2) (puzzle03/process-wires) (let* ((wire1-pos (puzzle03/collect-positions wire1)) (wire2-pos (puzzle03/collect-positions wire2)) (crossings (make-hash-table :test #'equal))) (maphash (lambda (k v) (declare (ignore v)) (when (gethash k wire2-pos) (setf (gethash k crossings) k))) wire1-pos) (puzzle03/get-distances wire1 crossings)))) (defun do-test () (loop for key being the hash-key of (puzzle03/part2) collect key)) ;;;;;;;; CL-USER> (do-test) ((18141 . 1657) (18141 . 1657) (18141 . 1657) (18141 . 1657) (18141 . 1657) (18141 . 1657) (18141 . 1657) (18141 . 1657))