From 42e86ecf5d7887796f46e0224dfde3af3fb6e928 Mon Sep 17 00:00:00 2001 From: MrBounty Date: Thu, 5 Dec 2024 00:17:39 +0100 Subject: [PATCH] First commit --- README.md | 3 - day1/input | 1000 ++++++++++++++++++++++++++++++++++++++++++++++++ day1/main.mojo | 21 + day1/main.zig | 69 ++++ day2/input | 1000 ++++++++++++++++++++++++++++++++++++++++++++++++ day2/main.zig | 104 +++++ day3/input | 6 + day3/main.zig | 128 +++++++ day4/input | 140 +++++++ day4/part1.zig | 156 ++++++++ day4/part2.zig | 118 ++++++ 11 files changed, 2742 insertions(+), 3 deletions(-) create mode 100644 day1/input create mode 100644 day1/main.mojo create mode 100644 day1/main.zig create mode 100644 day2/input create mode 100644 day2/main.zig create mode 100644 day3/input create mode 100644 day3/main.zig create mode 100644 day4/input create mode 100644 day4/part1.zig create mode 100644 day4/part2.zig diff --git a/README.md b/README.md index 55b7e19..8b13789 100644 --- a/README.md +++ b/README.md @@ -1,4 +1 @@ -## Day 1 - -# adventofcode diff --git a/day1/input b/day1/input new file mode 100644 index 0000000..0209f1e --- /dev/null +++ b/day1/input @@ -0,0 +1,1000 @@ +76309 75213 +79731 28444 +29583 71339 +60992 99148 +34680 74530 +45691 82519 +55358 22047 +95523 45384 +37661 82208 +33464 91461 +26897 96393 +76556 76554 +82316 98880 +92079 23082 +55539 10033 +65931 66060 +98880 60464 +19348 41458 +72003 84074 +78401 78856 +53187 72003 +65201 71211 +45971 12776 +45911 26854 +37527 13462 +28891 28444 +82801 81076 +29496 21971 +81662 12472 +89956 51107 +92833 22498 +23135 19348 +33661 51107 +48499 81114 +53651 65515 +26075 73072 +67647 90255 +90805 38056 +39949 68042 +76487 86922 +95115 94618 +11937 76761 +89547 72003 +25780 18607 +45017 84423 +43306 57853 +68164 22550 +56564 62505 +75018 52627 +23253 57654 +65165 55756 +31517 14874 +20876 72883 +80624 76452 +33117 67195 +64410 15109 +41934 83416 +89782 34566 +71805 38212 +73244 47902 +91360 78672 +45112 62842 +12869 59690 +90665 89809 +69340 29496 +91603 69938 +56320 67034 +17932 62842 +18431 29380 +31849 75256 +72699 28903 +87247 95908 +40628 67697 +63635 87577 +39517 86619 +11212 57615 +38117 51660 +36016 22309 +10931 19763 +76357 21412 +75652 61857 +98810 38436 +38749 23524 +86048 72883 +63513 72883 +45687 67490 +60836 12821 +94034 51660 +80411 25554 +21091 19763 +16564 36401 +44503 22575 +57654 66781 +31146 46927 +97857 20234 +25682 75256 +93045 13462 +68754 72883 +17237 72883 +92066 74137 +93749 51512 +34830 10322 +99272 67697 +45274 60464 +38929 80865 +34134 48329 +68249 47187 +48916 83133 +61528 29496 +90233 97345 +54872 14127 +44233 75524 +91023 52472 +24635 11482 +40466 19763 +46905 66085 +25902 94618 +35889 42397 +88185 69459 +64759 63070 +11316 72003 +73715 38056 +60712 75256 +72685 81152 +77252 66060 +28506 61431 +54298 89763 +90658 62842 +57205 69364 +23674 57548 +64953 19763 +53241 12916 +13222 33059 +15152 19763 +92661 60464 +61816 94618 +76099 75071 +38554 38436 +21189 22498 +38784 91603 +65754 62842 +87476 98880 +56430 90853 +76366 86864 +48121 83675 +71894 81336 +82170 67697 +90347 60012 +21071 50167 +92246 40121 +36480 66608 +22854 54282 +99368 83869 +83605 69528 +65136 85197 +90644 80851 +68309 97711 +77685 15072 +10032 11404 +71312 21971 +95462 42893 +53698 28903 +41458 80851 +80635 80851 +26127 93602 +15692 16750 +26810 92990 +87800 97117 +91599 31201 +97670 53183 +31216 82887 +80047 29496 +57838 15694 +40849 18977 +64159 68248 +89709 60902 +14381 36340 +25729 66727 +36202 51660 +97364 57654 +34691 57479 +35917 21577 +15191 77547 +24872 42035 +94140 30529 +93963 42786 +55950 74745 +80851 73127 +16667 28903 +46647 53539 +24917 41629 +43622 21688 +37442 94618 +40641 60464 +12670 64945 +78129 33880 +47403 21412 +15283 81303 +24283 92601 +76777 33434 +53791 88560 +82919 79661 +77544 25196 +40160 88979 +86172 57853 +38241 52145 +60464 98880 +17675 72883 +83513 38056 +13022 41458 +68472 23196 +22498 10066 +29522 70183 +80236 41513 +37585 22498 +70287 79234 +81783 22498 +14685 40811 +95584 18124 +47126 43277 +46799 53781 +60372 42786 +29724 51541 +93734 38212 +48291 13462 +10590 57306 +42879 81296 +98898 91603 +94223 13462 +49303 48982 +87417 21971 +17709 41952 +76716 64094 +29881 44586 +26599 93340 +24757 41458 +15666 19763 +44542 98880 +30400 27123 +44519 29496 +10588 93022 +41850 17815 +98878 79099 +85952 22498 +11119 64255 +75872 22498 +46488 86922 +26202 62842 +95599 81076 +23529 41458 +60375 59633 +62608 35235 +50724 98880 +51119 92701 +20960 24242 +91487 53719 +62298 77547 +17790 19763 +34307 55594 +49446 42812 +85537 71894 +80619 98880 +25391 64094 +16005 60464 +80510 66044 +84955 38436 +88821 91603 +17492 42786 +81026 41458 +19683 22498 +79887 75256 +36893 33059 +56380 80851 +48530 42786 +32923 33059 +29965 81076 +18532 81363 +25026 91603 +72561 62842 +94980 38056 +32432 53183 +55534 38436 +66162 64255 +77645 75256 +70443 38056 +29960 41458 +92757 26451 +11444 21971 +52688 38436 +41268 22621 +97231 49903 +51183 57052 +90927 26985 +97265 42786 +66813 22007 +63206 83227 +78745 99837 +60347 79617 +46179 29436 +73348 77547 +68926 27421 +24241 43292 +23989 21971 +76893 60464 +96995 38211 +94457 17361 +33924 91603 +65919 38056 +98919 22498 +61147 77547 +25172 25516 +66855 60700 +98423 91668 +13462 29007 +78075 64094 +99192 41551 +61341 22221 +57853 65000 +64255 91984 +44260 15605 +34883 21971 +88936 41375 +87848 45956 +82017 59273 +65191 77547 +52966 71894 +36879 83506 +75723 28903 +63490 11235 +89580 98372 +41331 21971 +47488 71894 +89934 91603 +25785 74938 +73107 32099 +79658 60464 +95693 14737 +91422 57654 +96745 86600 +39149 71623 +98394 54803 +82163 36159 +95052 38436 +16720 82983 +63140 22498 +23823 84914 +50296 71894 +40070 38212 +51107 38056 +95702 21412 +63439 72003 +70522 51660 +67070 66147 +78368 75455 +33938 74618 +36370 92122 +77547 99234 +36047 64094 +53669 73226 +71919 77547 +66864 75256 +38056 51660 +91341 61913 +37606 22498 +50946 29496 +28444 80851 +41082 41458 +17087 20616 +83635 22498 +70177 61491 +68184 19348 +54012 17507 +38198 81076 +40811 46612 +70047 35669 +34846 57853 +62305 71894 +59272 19763 +40659 11104 +23800 42786 +64175 20190 +68120 52879 +35213 13462 +85144 60464 +83815 69928 +69466 64255 +69940 54069 +79153 39514 +26397 98880 +10870 42786 +11814 61605 +83212 95356 +47789 29496 +32399 65379 +47939 97345 +81076 93623 +48371 68260 +20554 51660 +25316 80851 +85993 39286 +69729 18711 +34131 41603 +99316 15855 +15760 33756 +11727 57654 +73101 73191 +93009 58546 +63218 76005 +60263 84618 +64150 65222 +32042 75256 +35235 18159 +77209 32300 +64094 76684 +46101 90505 +99642 86922 +29258 98880 +40802 62842 +47215 35310 +25170 64094 +80039 87125 +85895 53213 +85277 34676 +24143 65226 +32337 22314 +71599 71200 +33477 72883 +24883 21971 +19419 97222 +59427 67697 +72661 97478 +62996 29496 +12525 67697 +99041 17700 +20625 19348 +67886 45087 +42662 41458 +28976 94451 +11277 55388 +88403 19763 +77265 32689 +71034 64255 +44618 53790 +45540 27148 +53781 53412 +44920 88690 +68235 69804 +14758 83239 +21668 31070 +87671 40811 +69745 54682 +95603 42197 +15999 87006 +43079 77547 +28105 42498 +33119 77660 +68650 81076 +94618 72883 +92897 82856 +34834 86922 +29210 33710 +58769 45753 +33360 38212 +19762 51660 +52993 72883 +74090 33902 +73668 12703 +67667 80986 +56341 87195 +42838 28903 +93432 19763 +84325 56270 +72643 62842 +77464 81076 +91846 77547 +75389 24109 +22248 93422 +15496 47644 +60779 21971 +14645 28903 +71653 75429 +41937 88087 +97389 62842 +55995 64094 +35488 47300 +56394 96902 +32108 11813 +55582 41458 +85261 19763 +98501 52280 +17412 73155 +62946 75256 +45369 30393 +17834 81076 +39228 67134 +45644 86198 +70980 72003 +42334 64094 +29852 49234 +40025 22174 +56532 56346 +94361 89533 +78649 42786 +77448 81297 +81128 77547 +62842 75256 +52291 41710 +40473 81493 +50907 19763 +73714 52966 +99652 80851 +13997 59464 +32984 96842 +85656 31414 +19177 53183 +58598 33333 +48325 64618 +60732 17729 +20343 21971 +96365 67697 +17674 49780 +95012 57853 +60953 86922 +62943 44091 +25163 63493 +71429 19763 +94437 40811 +53160 60279 +89277 91603 +25998 47890 +53281 45307 +82655 81076 +58683 98880 +34567 57853 +67319 86276 +71752 86922 +32419 81076 +99187 57654 +99426 71894 +24165 25888 +37843 29553 +97105 21412 +32460 37041 +29663 27331 +59713 67414 +45188 84541 +14348 43314 +62746 40811 +46870 83863 +50841 38056 +59445 16050 +12925 98880 +57452 85546 +36324 60464 +67373 81076 +86514 73624 +56074 51107 +66208 92937 +91677 87311 +59472 36022 +73550 76544 +44359 91603 +67706 54480 +32462 26551 +86672 68321 +35231 57853 +53759 88043 +94902 80851 +94326 28606 +78387 51107 +64407 57853 +30177 17341 +52328 19348 +32836 64094 +27500 21971 +66034 86985 +70645 81076 +41249 74832 +23305 71814 +61958 69681 +76187 46028 +95216 37603 +81846 67869 +47377 98660 +77226 22498 +47927 20033 +26606 30796 +57767 41458 +68443 71807 +53742 22475 +14866 67697 +13517 75256 +12941 22498 +18949 71894 +91218 77547 +54173 19763 +39748 45326 +78360 99324 +11720 51107 +29782 53692 +43041 24930 +35760 19763 +28118 67697 +48978 38056 +32968 21971 +10841 68694 +88712 99460 +55899 20431 +96213 81076 +11205 67697 +78331 94591 +98064 60719 +55020 71894 +54837 29496 +32560 77953 +84271 64094 +12334 53273 +60354 98880 +18875 45344 +79143 38056 +23233 84636 +61563 88447 +31425 45195 +71874 51660 +72444 89972 +53574 57736 +23459 39741 +46584 13200 +67106 41458 +28010 19505 +92985 97345 +36682 21971 +12501 99944 +16169 76904 +43802 32400 +63772 26347 +75759 98880 +24020 44873 +72479 75256 +58596 65558 +79734 19763 +29532 81076 +65742 94618 +69210 81076 +32186 91603 +48745 94618 +60568 66618 +49589 38056 +38212 19348 +48399 68926 +28282 62842 +43098 69228 +28937 33723 +36026 39105 +36024 98087 +84966 30771 +59984 51660 +89201 60464 +21971 29496 +50899 64094 +76523 85510 +21988 20844 +75667 92452 +24010 28903 +34214 21576 +58811 77652 +51628 30799 +73612 38056 +23096 52865 +39135 66625 +69128 49400 +32494 39597 +67143 72170 +68372 47908 +81952 38056 +88192 38056 +83029 67697 +63532 22498 +54899 75256 +96592 28503 +17379 13462 +16417 19843 +50554 41929 +25532 68199 +86596 38056 +25412 77359 +97345 37353 +19051 78038 +95135 80851 +43190 38436 +16851 80851 +50939 71931 +20348 72883 +62130 37721 +75609 50259 +13811 91603 +80903 79684 +58594 12415 +21090 13462 +90571 97345 +54287 10341 +31596 94618 +93992 98880 +26590 35235 +25317 26365 +94102 75256 +53183 61183 +57107 37169 +80457 58396 +48710 81076 +56696 71894 +96203 22833 +84426 24326 +66196 15680 +76056 64094 +86506 67761 +62627 22498 +30931 66060 +70026 77819 +93319 57170 +81820 64094 +86702 72003 +99446 50653 +77640 91603 +67087 90541 +80068 51107 +65835 56004 +13105 46230 +65748 91284 +80758 41458 +19345 47474 +56661 77547 +12043 67697 +50136 64851 +79931 16117 +51660 21003 +91875 72883 +64857 68150 +14513 93047 +31955 77467 +42546 67697 +49089 51660 +77824 28916 +15115 65178 +98454 40431 +15654 38056 +22270 38826 +73592 29496 +72221 90578 +99258 57441 +70502 34724 +88720 67697 +57057 51660 +36225 19763 +93724 98880 +37728 51660 +25140 34250 +57373 89903 +93720 64821 +90834 28903 +37440 14002 +67370 73712 +46370 33621 +63554 39553 +27180 33899 +48396 80851 +49431 68934 +90431 17857 +84310 97017 +37110 42786 +34732 64255 +46171 25574 +58999 30048 +57776 67697 +99514 96621 +38870 60533 +96826 32872 +66302 22498 +56005 52386 +15218 72883 +82329 94052 +60643 31279 +69475 29496 +61286 15538 +32797 69919 +48924 57853 +61994 73550 +63771 82704 +41809 13024 +97274 97164 +33059 42786 +45700 40001 +40917 17001 +33486 72003 +33666 59194 +63745 77859 +68420 80851 +55719 27549 +26294 21412 +67613 69595 +38497 31870 +33455 80851 +29237 68898 +53016 44791 +36157 65971 +20983 38056 +43937 52966 +90852 76144 +86318 53334 +30612 62842 +90434 56570 +25697 77841 +22662 70772 +89638 33059 +26116 52871 +84518 60464 +55725 75500 +81669 33853 +99680 56409 +11056 77547 +21585 58485 +37854 70553 +27402 64832 +39624 41458 +92759 72003 +42786 81984 +19929 50841 +21412 75256 +91518 88235 +39607 23909 +82239 13462 +27192 51858 +46537 33593 +38436 71894 +79708 13462 +39914 75256 +53695 21830 +40348 60464 +40694 42202 +19663 46959 +16165 67697 +26764 66060 +62435 10581 +58398 29571 +17348 95270 +90054 22498 +48870 41458 +20742 45699 +66060 97867 +69792 65746 +33979 24259 +80596 13462 +38208 94618 +53092 98687 +53583 32555 +17488 71894 +76692 38436 +71114 67532 +50119 43332 +60702 45943 +98910 31092 +24697 84922 +91990 92651 +84668 47907 +62646 58437 +18722 99286 +25746 40968 +19142 68959 +74638 38654 +61297 79634 +19217 33484 +28041 34064 +15985 12822 +28848 57853 +28628 17208 +23312 35979 +70752 29496 +11513 22498 +48405 38216 +91941 22498 +98013 80851 +23286 84866 +20244 44309 +83249 22059 +23960 71894 +19258 57572 +86488 61827 +57252 32489 +46820 91603 +39964 55055 +80837 22985 +99090 75256 +69839 81076 +98396 75256 +30774 88548 +86470 22167 +23371 64094 +23128 84004 +58818 80851 +45372 80851 +27966 97345 +60009 67697 +65289 32158 +91781 32885 +80156 65660 +97254 42786 +48298 41159 +54722 38021 +81261 81076 +86922 22498 +55476 31657 +57009 14306 +38000 38056 +85253 38436 +76055 41458 +59410 97345 +88583 53781 +18304 52775 +75050 64094 +70029 55636 +20423 65761 +81440 54815 +82295 13462 +25089 28903 +16484 19348 +23071 49803 +57112 35235 +63721 60158 +68579 94832 +21977 78498 +43592 72883 +40060 41458 +20413 42337 +40283 34311 +30206 96070 +46075 91603 +70006 19763 +75130 91603 +60612 28903 +64928 23183 +96097 21971 +72883 40811 +20769 68024 +97961 41458 +46704 60464 +79660 21412 +70165 97160 +37654 62842 +40556 28903 +15332 43586 +19763 41974 +79356 67697 +42155 62829 +51863 93968 +80541 64094 +16392 51660 +67697 98880 +28903 51664 +98379 11061 +73277 59160 +91515 49151 +88086 17578 +36014 38056 +68997 72883 +48767 71894 +61448 20757 +70899 38212 +65598 42786 +61699 31701 +73408 21499 +88878 49200 +12559 91603 +51392 13481 +35286 97345 +84379 67963 +93438 91603 +60752 53106 +19987 81076 +63280 35027 +43747 71810 +22803 66237 +75256 75256 +70441 72003 +77992 57743 +70884 21412 +91936 77547 +39673 53183 +31518 19763 +23066 48344 +45455 77547 +58606 32254 +33075 21971 +12200 19763 +42764 79555 +45004 94858 +87970 98880 +52319 38436 +81837 86922 +67858 57654 +86460 95056 diff --git a/day1/main.mojo b/day1/main.mojo new file mode 100644 index 0000000..893b680 --- /dev/null +++ b/day1/main.mojo @@ -0,0 +1,21 @@ +from time import now +from collections import List +from collections.string import atol +from Sort import sort + +fn main() raises: + start = now() + with open("day1/input", "r") as f: + content = f.read() + + left = List[Int]() + right = List[Int]() + + for line in content.split('\n')[0:-1]: + left.append(atol(line[][0:5])) + right.append(atol(line[][8:13])) + + + print("Took ", (now() - start) / 1_000_000, "ms") + +fn sort() diff --git a/day1/main.zig b/day1/main.zig new file mode 100644 index 0000000..75e1592 --- /dev/null +++ b/day1/main.zig @@ -0,0 +1,69 @@ +const std = @import("std"); +const print = std.debug.print; + +var file_buf: [1024 * 1024]u8 = undefined; // The file do 20kB, I give it 1MB + +pub fn main() !void { + const time_start = std.time.microTimestamp(); + var left: [1000]i32 = undefined; + var right: [1000]i32 = undefined; + + const file = try std.fs.cwd().openFile("day1/input", .{}); + defer file.close(); + const len = try file.readAll(&file_buf); + + var i: u32 = 0; + var iter = std.mem.split(u8, file_buf[0..len], "\n"); + while (iter.next()) |line| { + if (i == 1000) continue; + left[i] = try std.fmt.parseInt(i32, line[0..5], 10); + right[i] = try std.fmt.parseInt(i32, line[8..13], 10); + i += 1; + } + + std.mem.sort(i32, &left, {}, comptime std.sort.asc(i32)); + std.mem.sort(i32, &right, {}, comptime std.sort.asc(i32)); + + const time_parsing = std.time.microTimestamp(); + print("Parsing time: {d}μs\n", .{time_parsing - time_start}); + + const total_distance = distance(left, right); + const total_similarity = try similarity(left, right); + + const time_end = std.time.microTimestamp(); + print("Compute time: {d}μs\n", .{time_end - time_parsing}); + print("\tDistance: {d}\n", .{total_distance}); + print("\tSimilarity: {d}\n", .{total_similarity}); +} + +fn distance(left: [1000]i32, right: [1000]i32) u32 { + var total_distance: u32 = 0; + for (left, right) |l, r| { + total_distance += @abs(r - l); + } + return total_distance; +} + +fn similarity(left: [1000]i32, right: [1000]i32) !i32 { + // Make a map with value -> occurence + var buff: [1024 * 100]u8 = undefined; + var fbuf = std.heap.FixedBufferAllocator.init(&buff); + const allocator = fbuf.allocator(); + + var map = std.AutoHashMap(i32, u8).init(allocator); + defer map.deinit(); + + for (right) |r| { + if (map.get(r)) |r_count| { + try map.put(r, r_count + 1); + } else { + try map.put(r, 1); + } + } + + var total_similarity: i32 = 0; + for (left) |l| { + if (map.get(l)) |r_count| total_similarity += l * r_count; + } + return total_similarity; +} diff --git a/day2/input b/day2/input new file mode 100644 index 0000000..8a93f73 --- /dev/null +++ b/day2/input @@ -0,0 +1,1000 @@ +85 86 87 88 85 +30 32 35 36 36 +75 77 79 81 84 87 91 +9 11 13 15 16 18 21 27 +72 73 76 75 77 80 81 +7 9 8 11 12 10 +95 97 98 95 95 +64 67 68 69 70 67 68 72 +5 7 5 8 14 +33 35 35 38 39 41 43 +88 89 92 93 96 96 98 96 +62 65 67 70 72 72 72 +83 86 89 92 93 93 95 99 +27 28 30 31 31 38 +31 33 34 38 40 42 +32 34 36 40 38 +12 13 14 16 20 22 22 +31 32 34 38 39 43 +44 47 48 50 53 57 60 65 +22 25 26 33 35 +6 8 15 18 15 +49 52 55 62 62 +39 41 42 48 50 51 53 57 +41 42 44 47 53 54 59 +48 47 50 51 52 54 57 58 +24 22 23 24 26 23 +33 30 32 33 33 +49 47 50 53 55 59 +15 12 14 16 23 +87 85 82 83 85 87 +48 47 49 46 47 45 +13 11 8 10 10 +50 47 44 47 51 +78 77 79 81 83 86 84 91 +41 39 41 41 44 +15 12 15 15 16 17 15 +60 57 60 60 63 63 +22 20 21 21 24 28 +87 86 88 88 90 93 98 +13 12 14 18 20 +72 70 74 75 78 79 77 +51 50 53 54 58 58 +69 67 68 71 72 75 79 83 +7 5 7 9 13 15 18 24 +34 32 34 40 41 +6 4 7 9 11 18 16 +31 29 32 35 40 42 42 +64 63 65 71 73 76 79 83 +63 60 63 65 70 76 +22 22 23 26 29 31 34 +34 34 35 37 34 +66 66 68 70 71 71 +16 16 18 21 24 26 30 +55 55 56 58 59 60 67 +76 76 77 78 77 80 +19 19 16 18 17 +37 37 40 43 44 47 46 46 +17 17 16 18 20 22 26 +10 10 12 9 12 18 +3 3 3 6 9 +34 34 36 39 40 40 39 +19 19 20 23 23 26 26 +28 28 31 31 35 +36 36 37 37 39 44 +75 75 78 79 80 82 86 89 +23 23 24 28 29 31 30 +30 30 34 36 37 38 41 41 +10 10 12 13 17 18 22 +25 25 27 31 33 34 40 +1 1 8 10 11 12 +11 11 14 15 20 19 +76 76 79 86 86 +79 79 86 88 92 +64 64 67 68 70 73 80 87 +4 8 10 11 12 +46 50 52 54 55 57 59 58 +46 50 51 52 55 58 60 60 +22 26 29 32 36 +62 66 67 68 71 73 79 +56 60 63 64 63 66 67 +49 53 55 58 57 56 +27 31 34 31 31 +73 77 75 78 81 85 +10 14 16 17 16 23 +64 68 71 71 72 75 77 78 +38 42 43 43 42 +12 16 16 19 20 20 +65 69 71 73 76 77 77 81 +47 51 52 53 53 56 58 64 +25 29 31 34 36 39 43 44 +13 17 18 22 23 25 22 +30 34 38 39 41 41 +28 32 36 39 42 43 47 +32 36 39 41 45 46 53 +77 81 88 91 94 +63 67 68 69 76 74 +25 29 34 37 39 39 +74 78 79 84 85 86 90 +14 18 23 24 26 31 +35 41 44 47 48 50 51 +47 53 56 57 59 61 64 62 +13 19 22 25 28 31 34 34 +56 63 64 66 70 +65 70 71 74 79 +41 46 44 45 46 48 +13 19 16 18 16 +74 80 77 78 78 +41 46 47 46 48 52 +31 37 36 39 44 +42 48 48 51 53 +7 14 15 15 17 15 +60 67 67 69 69 +21 28 28 29 33 +59 65 68 70 73 73 79 +40 45 49 50 53 56 58 59 +83 88 92 95 93 +35 40 42 43 46 48 52 52 +72 79 80 84 85 89 +37 44 47 51 53 54 57 63 +37 42 43 44 51 54 +75 82 83 89 90 92 90 +48 53 60 62 65 68 71 71 +4 11 14 19 23 +72 79 80 85 86 88 89 96 +65 62 61 60 63 +55 54 53 50 49 48 48 +14 11 10 8 4 +24 22 20 19 18 16 15 9 +78 75 77 75 73 70 69 68 +74 73 70 73 72 74 +23 21 18 19 19 +80 77 79 77 76 72 +78 75 76 74 71 68 63 +88 85 83 83 81 +44 42 42 39 38 41 +34 31 31 29 29 +76 73 72 72 69 65 +78 77 74 72 72 67 +76 74 70 69 66 +84 82 79 76 72 70 69 71 +21 18 14 13 11 11 +67 66 62 61 58 55 53 49 +66 64 61 57 54 51 46 +77 74 73 71 69 67 61 60 +28 25 19 17 15 13 12 14 +16 14 8 6 6 +90 88 85 84 78 74 +79 77 72 69 66 65 62 57 +83 86 85 82 80 +31 34 31 30 31 +9 11 8 7 5 5 +65 68 65 63 59 +74 77 75 74 71 70 63 +32 33 30 28 27 29 26 +9 11 9 7 4 7 5 6 +92 95 94 93 90 91 91 +26 28 31 28 25 24 20 +18 19 18 15 17 11 +18 21 21 19 16 15 +10 11 8 7 6 6 4 6 +51 53 53 50 49 49 +72 73 72 71 71 70 67 63 +91 93 90 88 87 87 86 81 +58 60 56 53 51 +12 13 9 8 10 +5 6 2 1 1 +47 49 47 45 44 43 39 35 +52 53 52 51 50 46 41 +88 89 87 80 79 +17 19 18 11 13 +57 58 55 50 47 46 46 +30 31 29 27 25 23 16 12 +56 59 58 56 50 43 +29 29 26 24 23 22 20 +64 64 62 61 60 58 60 +62 62 60 57 57 +63 63 62 60 57 55 52 48 +19 19 18 17 15 14 9 +25 25 28 26 24 21 18 16 +41 41 39 38 37 39 41 +68 68 71 70 69 68 67 67 +68 68 65 68 65 61 +51 51 52 50 44 +92 92 89 89 86 +48 48 46 46 47 +92 92 91 88 88 88 +10 10 10 8 7 3 +50 50 48 47 45 45 43 37 +85 85 84 82 81 80 76 75 +60 60 58 54 51 48 50 +83 83 79 76 76 +62 62 61 57 53 +75 75 72 69 65 59 +96 96 93 92 90 89 83 82 +94 94 91 90 85 84 83 85 +44 44 37 34 31 31 +28 28 26 25 22 21 14 10 +71 71 69 66 61 55 +82 78 75 73 70 +60 56 54 52 51 50 51 +69 65 62 60 58 55 52 52 +23 19 16 14 11 10 6 +81 77 75 73 71 66 +10 6 8 7 5 +65 61 59 60 63 +76 72 70 68 69 68 65 65 +57 53 50 52 48 +87 83 82 79 81 78 73 +39 35 33 32 32 29 27 24 +98 94 93 92 92 89 87 90 +63 59 58 58 58 +30 26 26 23 19 +42 38 37 36 34 34 33 27 +44 40 39 35 34 +16 12 8 7 4 1 2 +93 89 85 82 81 80 77 77 +43 39 37 33 31 27 +52 48 44 42 35 +21 17 16 10 7 4 2 1 +71 67 62 61 58 57 54 57 +21 17 15 10 8 8 +54 50 47 44 39 35 +62 58 53 51 44 +66 59 56 53 52 +41 35 32 31 30 29 31 +44 37 35 34 32 31 30 30 +30 24 21 20 17 13 +35 30 27 26 20 +33 27 25 27 25 +55 48 45 42 45 47 +8 3 1 4 1 1 +82 77 74 75 71 +93 86 85 87 86 85 83 78 +80 74 72 71 71 69 68 65 +51 44 43 43 44 +73 68 65 64 62 62 59 59 +77 70 69 68 65 65 64 60 +91 85 82 82 79 72 +37 30 27 23 22 19 17 +91 85 83 80 76 75 74 76 +58 51 47 44 44 +45 39 37 35 31 28 24 +42 35 32 29 25 18 +67 61 59 54 53 52 +23 17 16 9 6 8 +39 34 29 26 24 23 21 21 +24 17 15 14 9 5 +97 92 90 87 81 79 78 71 +52 52 52 54 55 57 59 64 +83 87 88 89 93 93 +79 85 88 87 84 +41 41 43 43 41 +77 75 74 73 74 74 +12 19 19 22 24 24 +33 33 40 42 46 +92 86 82 80 74 +17 18 16 13 12 10 7 2 +63 68 71 72 70 71 72 72 +78 83 90 93 93 +27 28 28 29 31 33 35 38 +48 47 50 51 55 +53 53 51 48 45 +25 21 18 15 14 11 11 7 +28 33 36 38 41 39 43 +40 46 53 56 61 +70 69 70 75 73 +38 42 43 45 47 48 53 +35 38 37 34 33 30 28 +73 72 77 80 81 +92 88 85 82 82 81 78 76 +44 48 50 51 52 52 55 52 +59 64 64 67 71 +29 34 36 42 44 47 46 +53 52 53 60 63 70 +51 53 56 58 58 58 +83 80 76 74 71 65 +58 62 63 65 67 70 +87 87 84 77 77 +25 29 32 32 39 +68 70 73 75 75 78 79 78 +53 48 44 41 39 35 +73 72 75 72 79 +62 63 65 68 71 74 79 +35 39 46 48 50 52 53 57 +48 46 49 51 52 52 50 +50 50 51 53 56 56 56 +96 93 91 90 84 +27 23 20 13 11 6 +77 82 83 81 84 +91 91 87 84 86 +77 77 79 79 83 +18 18 19 23 24 28 +65 65 63 62 60 53 +85 87 88 87 86 85 84 80 +35 31 29 25 22 15 +6 7 4 1 2 +77 82 85 88 89 92 93 97 +35 36 35 34 31 24 18 +48 50 53 56 62 64 +75 71 70 73 72 71 68 66 +56 55 58 59 62 63 67 71 +22 22 26 27 29 31 32 32 +70 74 75 73 75 76 77 77 +29 30 32 35 33 36 37 43 +71 67 64 64 59 +95 97 96 95 95 93 91 87 +88 91 93 94 91 90 +92 88 87 83 81 80 76 +4 7 9 10 11 13 10 +19 18 21 25 27 30 30 +32 31 28 23 22 20 13 +31 35 38 41 45 48 49 +72 71 72 71 65 +72 72 70 65 67 +33 30 28 24 27 +73 70 67 64 63 61 61 +58 58 59 58 56 58 +71 77 78 81 83 86 86 +64 66 63 63 61 +47 51 51 53 54 55 55 +46 42 39 36 35 33 35 31 +84 86 85 79 79 +66 63 61 59 55 51 +67 69 72 74 75 81 88 +44 47 48 51 52 56 57 61 +94 94 96 94 89 +46 46 46 43 37 +73 72 74 77 79 82 84 89 +61 56 50 49 48 47 47 +31 27 25 24 22 23 22 22 +48 43 41 39 32 +40 33 30 28 25 25 21 +44 50 54 57 58 61 67 +49 51 45 44 41 44 +26 26 22 19 16 14 13 +46 52 52 54 56 53 +59 61 58 56 56 53 51 45 +27 28 33 36 39 43 +73 71 72 74 76 81 84 88 +48 43 42 40 40 38 +17 23 25 25 27 32 +96 91 88 90 88 84 +20 25 26 31 34 +19 16 16 18 21 23 26 32 +65 69 72 74 75 79 +57 53 53 51 48 49 +29 29 28 28 27 26 24 25 +91 92 89 86 82 76 +22 21 22 24 25 26 27 +91 92 94 96 97 97 +43 47 50 55 61 +22 15 13 10 6 4 5 +37 36 33 30 28 24 21 +19 19 16 14 11 11 7 +45 45 48 49 50 48 48 +28 28 27 25 25 +60 62 60 59 56 52 49 49 +14 14 17 15 16 17 22 +14 17 14 11 10 6 +9 9 11 10 14 +27 23 21 18 15 15 +54 56 63 65 67 70 70 +15 15 17 18 20 23 27 +37 36 37 41 44 45 +55 62 64 66 69 70 72 73 +72 67 65 58 56 50 +5 11 13 16 20 19 +66 73 75 75 76 79 80 82 +18 21 25 27 28 +55 55 59 62 63 62 +48 48 42 41 39 32 +67 69 66 64 63 56 54 +42 42 43 46 45 44 +43 47 49 53 54 55 57 63 +14 13 7 5 1 +59 56 57 55 56 56 +97 97 98 99 97 +33 33 31 28 26 23 19 +25 25 27 29 30 +85 81 84 82 84 +81 80 81 84 87 89 91 90 +77 78 79 82 82 84 87 91 +34 30 29 27 25 22 24 +24 24 25 26 27 30 37 +77 81 85 87 84 +28 25 26 28 26 24 +96 90 86 85 83 82 80 +9 8 5 5 5 +55 52 53 53 54 54 +73 72 73 74 81 81 +96 93 95 93 89 +48 47 46 43 37 37 +53 57 59 60 62 60 62 61 +68 70 68 66 62 61 59 61 +82 81 81 83 87 +17 17 14 10 9 2 +73 78 80 84 86 +20 13 14 11 11 +75 79 80 77 80 84 +94 91 92 95 97 97 +89 89 88 85 84 85 82 82 +79 78 80 77 79 83 +7 8 9 13 14 17 16 +70 73 74 71 69 68 +69 63 60 59 56 58 55 57 +35 31 30 23 20 17 13 +45 40 36 35 35 +32 28 26 21 19 17 17 +56 53 50 44 43 46 +60 59 58 56 52 +74 74 80 82 83 86 +84 84 87 90 93 95 95 +25 30 33 35 36 39 41 48 +12 10 13 13 14 16 19 +72 66 64 62 59 55 +90 91 89 91 92 93 97 +71 70 70 68 64 +36 32 25 24 27 +36 36 34 30 29 26 22 +26 19 18 17 14 11 +28 21 19 17 17 +20 20 18 16 14 13 16 +81 78 79 81 85 91 +38 34 31 28 27 26 25 20 +71 71 64 61 59 57 +20 20 22 20 19 +57 55 52 55 53 52 +71 72 70 71 73 76 78 78 +1 3 6 8 9 13 13 +19 18 16 12 12 +48 50 53 53 58 +90 91 88 84 83 82 80 78 +45 49 51 52 53 55 54 +15 13 10 10 9 7 +29 33 34 36 37 38 39 39 +15 21 24 25 26 30 30 +49 48 46 44 41 40 38 36 +82 85 88 91 93 95 96 97 +70 73 75 78 81 84 87 88 +71 72 73 75 78 80 +65 62 61 60 58 57 54 53 +89 91 94 95 98 +83 85 86 87 89 90 +13 11 10 9 6 +69 70 71 73 76 +86 87 90 91 93 94 +81 78 75 72 70 +75 78 79 82 84 +88 85 84 81 79 76 +65 62 60 59 56 55 52 51 +90 88 87 85 82 +36 35 33 30 28 25 23 +70 69 66 63 62 +4 5 7 8 11 +44 43 42 41 39 +6 7 8 11 14 16 +27 28 30 31 32 33 +84 82 81 80 78 77 74 +74 71 70 67 65 62 59 58 +53 56 59 61 63 65 +85 86 87 89 92 93 95 96 +49 50 53 56 58 59 61 63 +72 69 66 65 63 +57 55 54 51 50 48 +55 57 58 61 63 64 66 68 +19 21 24 26 27 +60 59 58 55 53 50 48 47 +77 76 74 71 70 68 66 63 +3 4 7 10 11 14 15 17 +58 57 54 52 49 +77 75 74 72 70 +80 77 74 72 70 68 67 +33 30 27 24 21 20 17 +44 45 46 48 50 52 54 57 +72 73 76 78 81 82 85 +88 91 92 93 94 97 98 99 +23 20 19 18 15 12 11 +39 40 43 44 45 48 +84 87 88 91 94 95 +38 35 32 30 27 26 23 22 +34 35 36 38 41 42 43 +61 63 66 68 69 +51 54 56 57 59 60 +63 66 67 70 71 74 77 +17 16 13 12 9 8 +63 61 59 57 55 52 50 +61 64 65 67 70 72 74 76 +74 72 69 68 65 64 +12 15 16 18 20 +97 95 94 91 88 +67 68 69 70 73 76 78 +51 54 57 58 61 63 65 +45 44 41 38 36 35 32 +70 73 76 78 79 81 82 +18 15 14 13 11 9 6 +44 41 40 39 36 35 +33 34 37 38 40 +30 29 26 24 21 19 +29 30 31 32 33 36 38 +48 46 45 43 41 40 +83 84 87 88 90 +48 49 51 52 53 54 57 +68 71 73 74 76 78 81 83 +79 81 84 86 87 90 +63 64 67 68 71 73 +47 49 50 51 52 53 54 56 +95 93 90 89 88 85 83 81 +46 44 42 41 40 38 35 34 +87 86 84 81 78 75 73 +84 87 90 91 92 94 +87 86 83 81 80 +11 9 6 5 3 2 +10 8 5 4 3 +49 46 44 43 40 38 +34 37 38 39 41 43 44 46 +47 50 52 54 57 +87 86 84 81 78 75 +81 84 85 87 88 91 92 94 +32 35 38 39 42 45 48 50 +74 73 71 70 69 68 +41 40 37 36 34 32 29 27 +13 15 16 19 21 23 +17 16 14 12 10 7 4 +66 69 72 73 74 75 77 +13 11 8 7 6 3 1 +13 16 17 20 21 23 +32 30 28 25 23 21 +75 73 70 67 64 +22 23 26 27 30 +67 70 72 74 75 76 79 +52 51 50 49 46 44 41 38 +64 62 59 57 55 54 52 +34 37 38 39 40 42 45 +14 11 10 7 5 +1 4 6 9 11 +75 72 70 69 67 65 64 +22 19 16 15 14 +86 85 84 83 82 79 77 +88 85 84 81 78 77 76 73 +15 14 12 10 8 7 4 +53 54 57 60 63 64 66 +72 70 67 66 63 61 +21 24 27 29 30 32 34 +21 19 18 17 15 14 +16 13 11 9 6 +49 52 53 56 58 61 64 67 +57 56 54 51 48 46 43 41 +90 91 94 95 96 97 98 +59 62 64 65 67 +33 30 27 24 21 18 +25 23 22 20 19 17 +3 4 5 7 9 11 +57 54 52 50 47 44 43 41 +86 88 91 93 94 +54 55 58 59 62 63 +91 94 95 96 99 +86 89 92 94 96 +69 70 73 74 76 77 +3 6 7 8 10 13 +65 63 60 57 56 55 53 +13 15 18 20 22 +14 13 11 10 7 6 3 +5 6 9 11 14 15 +59 62 63 65 66 +62 65 67 69 70 71 74 75 +70 69 67 64 61 59 +70 68 66 64 61 58 55 52 +3 6 7 8 9 +11 13 15 16 18 20 23 +95 93 91 89 86 83 81 79 +25 23 22 21 18 17 +63 64 67 70 71 73 +94 93 90 88 86 83 +86 84 83 80 78 +17 16 13 11 8 5 2 1 +78 79 82 84 86 88 91 +69 68 67 65 63 +77 78 79 81 83 85 87 90 +77 75 72 71 69 66 +76 77 80 81 83 85 +82 81 79 76 74 72 +63 61 58 56 53 52 +65 66 69 71 74 77 78 +37 40 41 44 47 +90 89 87 84 82 +69 72 73 76 78 81 +10 11 13 14 16 19 22 +52 51 48 47 44 +75 76 79 81 84 +82 80 77 76 75 74 +78 77 75 74 72 70 68 +12 13 15 16 17 20 22 25 +12 9 7 5 3 2 +44 42 40 37 36 +65 67 69 70 73 75 78 +92 91 89 86 83 82 +98 96 93 92 90 88 +77 74 72 71 70 69 68 +74 73 71 69 68 +85 88 91 93 95 +12 10 9 6 5 3 1 +88 87 84 82 81 80 +5 6 9 10 11 14 +20 19 17 16 14 12 +50 47 45 43 40 39 +57 54 52 49 48 46 +79 80 81 82 85 +93 90 89 88 86 +6 9 10 11 12 14 17 19 +4 7 9 10 12 +45 44 42 40 39 +1 3 6 7 9 10 13 +37 36 33 31 28 26 25 22 +25 24 23 21 19 +78 81 84 86 89 +23 21 19 16 13 10 9 7 +82 81 78 75 74 72 71 69 +94 93 90 87 84 81 +90 89 87 84 82 81 78 76 +86 83 82 80 79 76 75 72 +65 62 59 57 55 53 +41 44 47 50 53 +99 96 93 91 88 85 83 81 +94 91 90 87 85 82 81 79 +50 47 45 44 42 40 39 +79 82 84 85 86 89 91 +28 26 24 21 20 19 +22 23 25 26 27 29 30 +42 45 48 49 50 51 +90 88 87 86 84 83 +14 15 16 18 21 24 +91 89 88 87 84 83 +7 10 11 14 15 16 17 +60 58 56 55 52 51 48 47 +88 91 93 94 96 +91 88 85 83 81 78 76 74 +54 51 50 48 45 42 41 40 +84 86 89 90 92 94 96 +16 13 12 10 7 +47 49 51 53 54 55 +43 45 47 49 50 53 +97 94 92 89 86 83 81 +85 88 89 90 92 93 94 +51 53 55 58 60 61 63 65 +61 63 64 66 69 71 73 +60 58 57 56 54 +56 54 53 52 50 +89 87 84 81 78 76 73 70 +15 16 17 20 21 +34 36 37 38 41 44 +41 40 39 36 33 32 30 27 +91 92 94 96 97 98 99 +12 14 17 20 21 +40 43 44 47 50 52 54 55 +49 52 53 54 56 59 61 +91 89 86 84 82 79 78 75 +43 45 47 50 51 54 57 +51 48 45 42 41 +34 33 32 30 29 +55 57 58 60 61 64 +62 59 58 55 54 +61 63 66 69 72 74 +55 53 52 49 48 47 +20 22 25 27 30 32 34 35 +71 73 76 78 79 81 +35 36 38 39 41 44 47 48 +60 63 66 69 71 73 76 79 +90 89 86 84 82 80 +71 73 76 77 80 82 84 87 +81 82 83 86 87 89 +42 40 38 37 34 +97 96 93 91 89 86 +11 12 15 16 18 +1 2 5 8 10 12 +8 7 6 3 2 1 +71 70 67 65 64 +91 89 88 85 82 79 +69 67 65 63 61 60 58 +53 52 50 49 46 44 42 41 +21 19 18 17 14 13 11 +93 92 91 90 87 84 +34 31 29 27 26 24 23 20 +86 84 82 81 78 77 +71 73 74 75 76 79 81 82 +28 31 32 33 34 36 39 +53 56 58 60 62 65 68 69 +50 51 54 55 58 +59 61 64 65 66 +81 83 86 87 89 +65 64 62 61 60 +75 74 72 71 68 67 64 63 +29 31 34 37 39 41 43 46 +51 48 46 43 42 39 36 +34 35 38 39 42 45 48 +34 32 31 29 27 24 22 20 +28 27 26 24 21 20 17 15 +27 30 31 33 35 37 39 +47 44 41 39 36 35 +60 62 63 65 67 68 70 71 +28 31 32 34 37 +38 41 42 43 45 +65 64 61 60 59 +78 81 84 86 87 90 91 93 +45 42 41 38 37 36 +72 75 76 79 81 82 84 86 +81 78 77 74 73 72 69 66 +70 71 74 76 77 80 82 83 +17 15 12 9 8 7 6 +42 44 45 48 51 53 55 +60 58 57 55 54 +36 33 32 31 29 +49 50 53 54 56 58 60 +71 72 75 76 78 80 82 85 +38 35 32 29 26 +30 33 36 37 40 +65 62 61 58 56 54 52 +28 31 33 36 38 41 43 45 +85 83 81 80 79 77 74 71 +72 69 68 66 64 61 +48 50 52 53 54 56 58 +78 80 81 83 86 88 +57 55 52 50 49 46 45 42 +85 88 90 91 93 94 +91 89 87 86 83 82 80 77 +77 78 81 84 87 88 90 93 +67 68 69 71 74 77 78 +65 64 61 59 58 57 +24 26 29 32 35 38 +64 67 68 69 72 74 76 +82 80 77 75 73 70 +12 15 16 19 21 23 26 28 +90 88 85 84 81 80 78 75 +18 20 22 23 25 28 +79 78 77 75 73 +69 68 67 64 61 +58 60 62 64 66 +35 36 38 41 44 45 +81 84 86 87 90 91 93 96 +78 75 72 70 67 64 61 60 +5 6 9 11 13 15 17 +51 53 54 55 57 60 61 +41 38 36 34 31 29 28 +47 50 52 53 56 59 60 +27 25 22 20 18 16 13 10 +46 48 50 51 52 +93 92 90 89 88 +63 62 60 57 54 53 50 48 +82 84 86 87 90 91 +26 29 30 31 34 35 38 40 +79 77 76 74 72 70 +25 27 28 30 31 +84 85 86 88 90 92 +26 29 30 31 33 36 38 +59 62 65 66 69 70 71 +4 5 7 9 12 +10 12 14 15 16 19 22 +44 47 50 53 56 59 62 63 +85 87 89 90 91 93 +31 34 37 39 42 45 46 +32 33 34 35 36 37 39 40 +78 77 76 74 72 +37 40 42 44 47 49 52 +11 9 8 6 4 3 2 +24 22 19 18 16 13 +36 34 32 29 28 25 23 21 +87 84 81 79 76 75 73 +83 85 87 88 91 94 97 99 +36 33 32 30 29 27 24 +86 85 83 82 79 77 74 +59 56 54 52 49 48 47 +78 79 82 83 85 87 88 +36 39 42 45 47 50 +87 89 90 93 94 96 99 +93 94 95 97 98 +20 17 15 14 11 9 6 3 +73 70 67 66 64 +84 85 87 90 92 94 97 +49 46 45 43 40 +4 7 8 9 12 +28 26 24 21 18 16 +15 16 19 20 23 +14 15 16 17 20 22 +45 46 49 50 53 54 56 58 +58 57 55 54 51 49 +52 55 58 61 62 65 67 70 +28 30 31 34 35 38 +40 38 35 32 30 29 26 24 +91 88 85 84 82 79 77 +35 34 32 29 27 26 25 +60 57 55 52 51 +85 88 90 91 94 97 +13 16 18 19 22 24 25 +41 42 43 44 45 48 49 +32 34 36 38 41 42 +13 14 17 20 22 25 +51 48 46 44 43 +60 63 65 66 68 71 72 74 +17 20 22 25 27 30 +75 77 80 82 85 87 +73 74 77 80 82 85 +78 77 74 72 69 67 +21 19 17 15 13 11 +43 46 47 50 52 +79 80 82 85 86 +74 76 78 80 82 84 87 90 +92 90 88 86 84 82 79 +12 10 9 7 6 3 +11 9 8 7 6 +29 28 27 24 22 20 +75 76 78 80 82 +66 64 62 60 57 56 55 +58 56 54 53 52 50 47 45 +13 14 17 19 21 24 25 26 +14 17 19 22 25 27 30 32 +90 89 86 84 83 81 80 +52 49 46 45 42 41 +39 40 41 43 46 +53 56 58 61 62 +83 81 79 77 75 72 70 +59 60 62 65 66 +34 35 36 39 40 41 43 45 +80 81 82 83 86 89 90 92 +17 16 14 11 10 8 5 +20 18 16 14 12 11 8 5 +54 51 50 47 45 42 40 39 +96 93 92 90 89 87 85 +85 87 90 91 93 95 96 99 +49 50 53 55 57 +16 19 21 24 25 +64 65 68 69 71 73 +23 26 29 32 34 37 38 41 +79 82 85 87 90 +88 89 92 94 95 98 +22 20 19 17 14 11 +74 72 71 69 66 64 61 +29 26 25 24 22 19 +56 54 53 52 49 48 45 +28 31 34 36 37 38 40 +23 22 21 18 16 15 12 +43 44 47 50 52 53 55 58 +92 91 88 85 82 80 +41 43 44 47 48 51 53 +18 16 13 11 9 7 6 4 +84 85 88 90 91 92 93 96 +57 58 61 62 64 67 70 73 +57 58 59 62 63 +26 24 23 21 18 17 +95 93 92 91 88 85 82 +63 65 67 68 71 72 75 +85 86 89 92 95 97 99 +29 27 26 25 22 21 18 +40 42 45 46 47 49 +43 45 47 49 50 53 55 +94 92 89 88 86 83 82 80 +28 27 26 23 21 +85 88 90 92 94 96 97 +58 56 54 52 49 46 45 42 +64 67 69 72 74 75 76 78 +8 10 11 13 16 19 20 +97 96 94 92 90 +59 61 62 64 66 69 71 +74 73 70 68 66 +20 23 25 27 28 30 32 +34 31 30 29 27 25 22 19 +44 42 40 39 38 36 34 +93 90 88 85 82 79 76 73 +69 68 66 64 63 60 58 56 +13 12 10 8 7 6 5 3 +68 71 74 75 76 +40 39 36 34 31 28 27 25 +48 45 44 42 39 38 37 +68 70 72 75 78 80 83 +84 87 88 91 93 96 99 +45 44 41 39 37 35 +16 14 11 9 8 6 3 2 +77 80 81 83 86 87 +18 21 23 26 27 28 30 31 +12 15 16 19 21 24 +27 29 31 32 33 35 +77 76 74 73 70 67 64 63 +28 30 33 35 36 37 38 +49 48 46 43 40 37 34 32 +75 77 80 82 83 85 88 91 +20 17 14 13 12 10 9 6 +63 60 57 55 54 +18 21 24 25 26 +63 65 68 70 73 +88 87 85 84 83 80 +61 64 67 68 70 +21 22 24 27 29 32 34 +52 51 49 48 46 43 +82 81 78 76 74 73 71 +24 21 20 19 17 +66 63 62 61 58 57 54 51 +69 66 64 62 61 59 57 56 +14 17 19 20 21 24 +3 4 5 8 9 11 13 15 +81 79 78 75 74 73 +30 31 33 34 36 37 40 +66 63 62 60 58 56 55 52 +15 16 18 20 21 +77 79 81 82 83 84 87 +7 8 9 11 12 15 17 +19 16 14 12 10 8 7 6 +42 45 47 49 52 +42 39 36 33 30 28 26 +32 30 28 25 22 21 20 +73 70 69 67 65 64 +10 12 13 14 15 18 +72 69 66 64 63 +75 76 79 81 82 85 87 +63 66 69 71 74 +17 14 13 10 8 7 5 2 +52 55 57 58 60 62 +41 42 45 48 50 51 +61 60 58 56 55 54 51 +56 57 59 60 63 64 66 +79 78 77 76 75 73 70 68 +93 91 89 87 85 84 +39 38 37 36 33 31 29 28 +32 35 38 39 42 44 45 +12 15 18 19 22 25 +88 90 91 92 95 96 98 +45 43 41 38 35 33 +22 20 17 16 14 +52 50 49 47 45 42 +98 95 94 93 91 +6 7 9 10 11 12 15 18 +55 58 61 62 64 66 68 +67 69 72 75 76 78 +96 93 90 87 84 +58 60 63 66 69 +51 52 53 56 57 58 59 +24 26 29 32 35 36 +35 32 29 27 25 22 19 16 +34 33 31 28 27 26 +45 44 41 38 37 34 +32 31 30 29 27 24 23 +59 60 63 65 66 69 +61 59 58 55 53 51 48 +80 81 84 87 90 92 +67 64 63 61 58 56 +58 61 64 65 67 68 69 +52 55 56 58 59 60 +76 75 72 69 67 64 62 +78 81 82 83 85 88 +48 46 44 42 41 39 36 33 +65 64 63 60 59 57 54 51 +56 58 59 60 61 63 +64 66 69 72 74 77 79 81 +36 34 32 30 28 26 23 +82 80 79 77 76 74 72 +22 24 27 28 31 +67 66 63 61 59 58 55 +55 57 59 62 63 64 +4 5 7 9 10 12 14 +57 58 59 62 64 65 67 68 +21 19 16 14 11 10 8 5 +33 31 29 26 24 22 19 +66 63 60 59 57 +54 51 50 47 46 44 43 +97 94 93 92 89 86 +16 19 22 23 25 27 +46 44 43 41 40 39 +74 72 70 68 66 65 63 60 +55 54 51 50 48 45 +17 18 21 22 23 26 28 30 +61 62 65 66 67 +77 75 73 70 67 64 61 60 +48 50 53 56 59 61 64 65 +75 78 79 81 83 86 +52 54 56 59 61 63 66 68 +45 42 40 39 36 35 32 31 +77 75 73 71 70 +60 57 55 52 51 50 48 47 +70 73 75 77 79 82 84 85 +75 77 79 81 84 86 88 +49 52 53 55 57 60 +80 81 83 84 85 87 90 93 +16 17 19 21 22 24 +61 58 55 53 51 48 47 46 +70 68 65 63 61 58 55 54 +3 6 8 10 11 +89 87 86 84 82 81 79 +27 29 32 33 36 38 41 43 +47 49 50 51 52 55 56 +28 29 31 32 35 38 +90 89 88 87 85 84 +38 37 34 33 32 29 26 23 +67 66 65 62 59 +66 63 61 60 59 58 57 +21 20 19 17 15 12 9 8 +18 21 23 24 27 +8 10 13 15 16 +29 28 25 23 20 +63 61 58 57 55 54 +53 54 55 58 60 63 64 +13 12 10 7 6 4 +35 33 32 30 27 24 21 18 +69 67 64 63 61 60 58 55 diff --git a/day2/main.zig b/day2/main.zig new file mode 100644 index 0000000..5e34a08 --- /dev/null +++ b/day2/main.zig @@ -0,0 +1,104 @@ +const std = @import("std"); +const print = std.debug.print; + +const State = enum { First, Second, Incr, Decr }; // Increase Decrease + +var line_buf: [64]u8 = undefined; +var second_buf: [64]u8 = undefined; +var previous: u8 = 0; +var current: u8 = 0; + +pub fn main() !void { + const time_start = std.time.microTimestamp(); + + var fbuf = std.heap.FixedBufferAllocator.init(&line_buf); + const alloc = fbuf.allocator(); + var line = std.ArrayList(u8).initCapacity(alloc, line_buf.len) catch unreachable; + + const file = try std.fs.cwd().openFile("day2/input", .{}); + defer file.close(); + + var buf_reader = std.io.bufferedReader(file.reader()); + const reader = buf_reader.reader(); + + const writer = line.writer(); + var total_safe: usize = 0; + while (reader.streamUntilDelimiter(writer, '\n', null)) { + // Clear the line so we can reuse it. + defer line.clearRetainingCapacity(); + + if (try isSafe(line.items)) { + total_safe += 1; + continue; + } + + var i: u8 = 0; + var it = std.mem.split(u8, line.items, " "); + while (it.next()) |_| { + const new_line = try removeOneIndex(line.items, i); + if (try isSafe(new_line)) { + total_safe += 1; + break; + } + i += 1; + } + } else |err| switch (err) { + error.EndOfStream => {}, + else => return err, // Propagate error + } + + const time_end = std.time.microTimestamp(); + print("Total time: {d}μs\n", .{time_end - time_start}); + print("Total safe: {d}\n", .{total_safe}); +} + +fn isSafe(line: []const u8) !bool { + var state: State = .First; + + var it = std.mem.split(u8, line, " "); + while (it.next()) |x| { + defer previous = current; + current = try std.fmt.parseInt(u8, x, 10); + + if (state != .First and previous == current) return false; + if (state != .First and ((previous > current and (previous - current) > 3) or (previous < current and (current - previous) > 3))) return false; + + state = switch (state) { + .First => .Second, + .Second => if (previous > current) .Decr else .Incr, + .Decr => if (previous > current) .Decr else return false, + .Incr => if (previous < current) .Incr else return false, + }; + } + + return true; +} + +fn removeOneIndex(line: []const u8, index: u8) ![]const u8 { + var fbuf = std.heap.FixedBufferAllocator.init(&second_buf); + const alloc = fbuf.allocator(); + var new_line = std.ArrayList(u8).initCapacity(alloc, second_buf.len) catch unreachable; + var writer = new_line.writer(); + + var i: u8 = 0; + + var it = std.mem.split(u8, line, " "); + while (it.next()) |x| { + if (index != i) try writer.print("{s} ", .{x}); + i += 1; + } + + _ = new_line.pop(); + + return try new_line.toOwnedSlice(); +} + +test "Is safe" { + try std.testing.expect(try isSafe("1 2 3")); + try std.testing.expect(try isSafe("1 2 3 4 5 6 7 8 9")); + try std.testing.expect(try isSafe("243 241 239")); + try std.testing.expect(!try isSafe("1 2 3 8")); + try std.testing.expect(!try isSafe("1 2 3 2 1")); + try std.testing.expect(!try isSafe("1 2 3 3 1")); + try std.testing.expect(!try isSafe("1 1 3 3 1")); +} diff --git a/day3/input b/day3/input new file mode 100644 index 0000000..e8db9d5 --- /dev/null +++ b/day3/input @@ -0,0 +1,6 @@ +what()-%*;[mul(826,659)what()&mul(622,241)}^from();why()mul(499,923))mul(589,186)~how()why()]/~who()}mul(57,224)* ##[[*>mul(206,45)select(){~from(63,961)+!/'@mul(365,743)^ from()mul(94,410)$how()(^ )/,mul(592,884) mul(265,485))^#[[mul(763,659),mul(275,537)$;who()*mul(511,392)))what()(+from()from()>&-mul(416,947)mul(868,183)?:where()*when()#-where(890,406)#-mul(873,379)mul(195,835)/,%?],!-{(mul(225,902)where()'(where()-@#mul(544,955)how();~when(222,774)mul(538,277),from()from(717,816)$)(!%select()mul(247,162)**why()!}/where()mul(411,570)]mul(158,805)<[)}!@$select()don't()&?mul(475,153)when()mul(44,394)mul(505,328)select(),;[+mul(228,58)}/)why()?who()mul(706,785)$!#mul(635,796)#[where(){^select(275,150)-/)mul(85,214)do()where()@'mul(651,67)]-mul(530,38)why()+^don't(),where();what()~mul(532,711),;)$why()+what();%mul(265,354)-mul(338,874)?]mul(284,884)}'?where(),mul(614,138)&who()~}[why()from()mul(779,747)^mul(7,27)select()}>+^-*who()*mul(545,113)who()('!&how(),don't()+{$&mul(842,42)<#mul(788,22),why(),mul(581,843)why()?mul(415,102)[mul(782,483)::(&',^mul(411,597)mul(800,946)[]($}:+)]mul(6,738)who()+where()@}(where()>$when()mul(737,227)select()~ why(984,422)mul(690,299)$how()!why()when() why()>:who()mul(62,391)mul(559,901)mul(152,669)([why()-select();*(mul(674,497)mul(195,917)from()#what(),mul(332,868)select()')@#mul(957,359)(when()]>(%,mul(252,836)[why()?where()!,mul(877,551)&select()[}->(*[mul(847,681),why()select()select()*@,mul(211,86)when()select()-:)#']mul(416,630):(}?$[:)mul(255,942):-*:!~%@how()what()mul(117,324) +/}mul(804,424)mul?where())%}mul(933,657)%from()what()'~!}*:mul(916,775)who() {,what(485,199)when()#mul(760/-select();mul(859,259) )?mul(21,933)what()^from()#-mul(951,427)don't()mulwhere(295,787)%'~*who()@mul(500,697)where()*^!@^what():mul(737,496)^{)^how()when()#mul(387,233)']%select();}mul(89,882)}(&mul(394,392)#from()what()}who()when()when()>;^mul(639,188) [*mul(302,818)[mul(874,794)~{(<>[%mul(217,113)~why() mul(651,680)^!/'select()mul(161,158)'}/*{mul(41,452)?;;@,[~}why()mul(71,555)who()}]where()*%where()?mul(909,630)%^where()how()'mul(678,912)*)+what():don't()*^[$mul(208,358)mul(99,216,??/-%]when(40,18)>'(mul(967,259)^!%!mul(574,337)mul(855,993)from()who()<@ -&mul(679,566)[;$how()mul(773,340)+-':-mul(46,577);>+%^#mul(668,549)@;#,[])don't()mul(471,350)why()?what()where()what(),]:!where()mul(474,215):#what():%}how():mul(47,116)-,^from()?[select()>mul(566,323);!$why()what()<>{%-mul(756,641)(]{what()$>@#$%mul(478,68)!](;@+when()mul(383,83)>>@ do())(/!when(){{)~when()mul(18,568)mul(933,58))mul(53,523)what()where()>+where()^mul(847,728)>where() who()how()]mul(499,856)mul(837,413)&:who();from()@mul(711,785)@from()select()$]#-}mul(603,647)!how()'}/mul(142,83)mul(236,987)(&[)+$<&when()mul(464,484)[mul(97,923{[{;~*how(603,347)why(397,750)[mul(397,378):from()who()@$[mul(33,741)@&<['from():do()]select()/!who()from()what()(+mul(425,204)<[^select()#:?do()/mul(977,606)how()select()?select() ^mul(481,671)^&,)&what()select()from()from()mul(219,42):what()?}mul(441where()({select(),mul(333,910)from()from()where()]*'mul(925,221):%?from()mul(981,324)%}mul(595,648)&select()/mul(742,838)when()~@from()don't()#+)(<^?}mul(554,328)} -?(mul(513,192)~~$*why()/~% mul(444,631)## mul(794,537)-#what()~how()why(310,427)(mul(781,606)< from()@&mul(787,800)@how(266,66)-{when()what()who()mul(538,246)[^*+why()where()mul(629,836)from()* [$+&]mul(77,354)%]:from()mul(260,304)@why()!/when()where()+(mul(354,804) mul(76,15)>mul@!!$]from()mul(357,50)(mul+%~]$-%%don't()(from();when()#;~when()mul(564,123)~&]@mul(489,580from()what(95,431)+:*- ,*'mul(745,620)how()'why()>-from()[?>!!mul(988,840))^)(]]#^}mul(298,967)when():who()#who()what()mul(84,148)< ;&@^do()when()~^where()#^$mul(341,853)<+~*what(252,434)*{{mul(986,313)]&>&>mul(620,476)why()who()mul(69,875<$-&(''mul(106,787)mul(171,707)who();~when()+>;how();+mul(163,282)(];?>}* mul(571,602)/from()+/]!{+mul(372,949)$?*$(mul(921,212)@'>mul(705,437)($when()where()mul(371,384)>mul(445,760)'do()?/when()%[^mul(382,44)}&/)&$select()mul(284,899) when():%mul(554,813)$;~>mul(274,983)'')?-from()mul(668,571)when()why()mul(981,529)>where()%) #& [^mul(864,321)how()'[mul(752,285)$ mul(448,366)&why()])${;^from()who()mul(251,944)select()-&*mul(724>>)}^,select()~~}do()}))%who()#mul(652,853) +mul(914,760)%]how())mul(325,361)>[@#{mul(49,627)> []!%?@:mul(866,756)!?^how()#select()(}&mul(217,708)>mul(534,113)<()(~(how()&mul(522,207)where() who()why())]mul(549,286)what(824,300)-]when()]}:select()mul(536,959$(~#&*[~})mul(47,72){:mul(907,280)&!mul(175,322)mul(460,379)select()'?&mul(697,154){^%[^from()when(552,273)mul(454,997)*&/mul(514,858)$why(29,970): ,+!<&mul(411,897)[%why(),mul(749from()where())+ ]how()'what()mul(739,713)mul(116,113)mul(203,704)/!select(379,766)]&when()^from()#mul(903,203)!,!< {%]?mul(330,707)where()(+how()>mul(526,973)~]^&'how()mulfrom() +];mul(964,967)@why()from()when()^~ mul(217,465)]from()/from()@&]where(263,584)+why()mul(267,301)}when():#don't()>who(860,416)/,mul(126,52);<}+[who(),where()mul(868,540)when(332,336)mul(134,939)#mul(119,818)mul(777,396)+mul[mul(184,9)select()mul(375,842)]mul(527,499)~#what()'mul(260,652)mul(15,171)what()mul(273,578)-?mul(798,178)&?<;#%:mul(886,756)where()who()~^,from()$mul(775,238)[why()'mul(229,247)/mul(105,511)from()?]>+/why()$!:mul(578,64)?where()*)~:&( where()mul(917,699)&:~^'~who()mul(685,592); ,where()%[{mul(535,245)' why()*mul(166,874)!'who()why()/~:}-what()mul(430,972)[(mul(11,883)>?-%/#;who(382,885)why()}where()*&?mul(142,204),!why()from(805,222),mul(165,77>>from()mul(539,602)@- !!from()where()>mul(725,894)#mul(664,363)mul(436,916)(;*]!/mul(276,69)?^~how()?:-what()do()mul(174,136)where() ,#:*)mul(465,302)*!-why()^/mul(363,643)})(why()!mul(149,621))^*?who(),mul(172,73)mul(631,398)]from()mul(998,161)@[[@who()?mul(310,639)#-}{what()?;!(mul(584,757)~ !(do()$->#[)$(mul(124,565){mul(698,142)}})-mul(742,227)%#why()/,$:select()mul(152,975)why()*&?~#'~*?mul(908,265)mul(620,516)from()select(209,291)why()$mul(539,160);select()~}*{when()mul(784,853)who(15,285);where(),^;where()-[mul(342,770select()*;>-((*&mul(982,965)how()&mul(523,830)when(961,246)[ why()+why()]mul(785,203)who(99,69),*mul(936,742)?^','%;-why()!mul~)when()when()select()!(;&@how(900,734)mul(589,321)mul(964,282)-))how()why()what()(*})mul(47,984)@mul(253,826)mul(429,558)where()how();<#what()#+mul(983,307)~>}-)/who()mul(327,880)+}when(){when()}mul(593,869)mul(643,89)-:,,,<;mul(33^who()[)+-^mul(189,550)<:mul(519,574)*how()?where()[^;when()mul(563,151select()-what()]mul(574,867))}mul(800,881)who()'#~#mul(46$mul(693,762)-!@,#mul(454,19)$!select()from()*who()),mul(269,371)from()mul(330,479)%&!}how(477,247) [do())why()^}+''-how()mul(819,485)how()-)~*%what(447,325)why()mul(462,456)#?]mul(912,654)]mul(2,822)$)>':select()when()select()/]mul(557,454)'%<>+%what())*do()when()why(716,84)@/mul(89,140)select()('mul(310,84),*select(),$?mul(86,400)[/what()<@~$mul-!when()who()%#where()'[who()(mul(755,653)mul(594,757from()from()<[,;mul(916,545)mul(206,9)@$)mul(588,12) '][)select()$from()from(220,871)@mul(849,103)-/mul(887,921)$#who()who()mul(873,831):why()}who()[+mul+&>#how()how() : mul(323,651)why()!mul(620,114)<+what(844,679)/{/*mul(327,69)mul(472,982)how()^(mul(321,807)when()why()]why()$mul(694,629)/%/ who()*[mul(648,109)]>[''@mul(543,595)${{{:>;#!/usr/bin/perl ]-(#:how()]<+mul(770,832) +$select()when()@*)&select()how()/mul(195,671)';;^(select()!mul(342,663)@$@%~)>)don't()what()mul(681,868)-@who(237,633)}when())*#>;mul(532'select(828,390);what(),<%?-:{mul(835,208)%/$select(21,874)mul(214,27)from()who()who()/mul(767,769)!~,+>who(),mul(204(}who()!when(940,779)<$from()^mul(944,886)mul(714,285)<)~~why()mul(352,872)what():/mul(419,248)#from()&select()>>mul(557,809)-why()from():mul^?);mul(231,230)(what()%/:{mul(635,952)mul(896,753)-&*%mul(475,955))[when()(&~}mul(865,939)mul(557,651) !)~:mul(172,689)/from()]{$,;what()mul(956,624):[,@+}what()mul(601,236))where()*from()from()mul(820,982)who()$select()when()/mul(249,654)#,from():;!don't()}+select();/why(240,203)where()^!mul(373,721)from()?,mul(234,262)how()'>([mul(477,58)mul(161,422)~mul(985}/select()-~mul(344,788);mul(660,334)do()when()]where()&who()when(){mul(955,809)+who()>how()where()?-^/mul(800,971) mul(331,999)[{where(){}]@!mul(243,886)mul(807,365)why(708,402)@when()?who()mul(242,464)&^,[{how(){when()*(mul(593,164)&*/&where()select(237,204)mul(474#/mul(533,804)&, how()why(653,768)mul(489,173)]where()from()[&{?:mul(62,23)& )where()from() mul(234,284)@who()why()* }*mul(938,464)from(),+?(@why() don't()what(338,233)?~'+who()$@mul(63,606):mul(713,654)$from()(+&:mul(138,999);&#select()~mul(432,589)?>^(?*&mul(117,404)@)where()why(6,662)mul(942,298)mul(16,588)how()*~<~ from()-mul(610,545):why()#]-;how())what()}mul(977,824)??when()mul(241,702)!^]@mul(98,19)!{what()mul(896,817)?who())^#&;:?mul(475,309){]~!who()mul(819,280)+~why(22,676)mul(714,597)from()when())^~+, mul(962,748)%mul(178,691)$what()mul(777,740)&who())where(),;mul(632select()/ *who()who()@mul(460,751)+',mul(862,580)# :-what()!+{don't():$!<^:from(){&who()mul(93,231)how()select()#+)-^don't()/&>*#'/&[(;&>,from()do(),what())what()$*mul(742,889)mul(62,478)?[why()why(),mul(837,195)why(){>,$@!'mul(722,317)%%select()when()what()(('/+mul(251),)>mul(148,406);don't()when()'mul(784,101)<[!^(where(365,573)<${mul(535,827):{*#mul(335,673)]]^:^]when(222,2)[mul(704,190)!from()who(){%(&} mul(407,649)+~:why()mul(575,579)@}:why()mul(945,425)[what():mul(42,200) +/select()who()how()select()~when(364,150)mul(790,347)+,):+?mul(498,67)!!<'when()}',{mul(440,393)from(283,600):@[ :&mul(584,602)[*%+mul(913,926)(+from()why()(><,$ mul(4,866)where(){;+,why(),when()why()when(199,14)mul(370,854)why()^mul(665,756),>}*{:&when()-how(582,503)don't(){@^,@/mul(306,251)mul(2,820)~&[[^ mul(135,961){~!)mul(526,875)how()+what()?]mul(379,321)%why()%,who()^?don't(),select()%when()mul(476,779)select()mul(811,466)}~~%mul(389,923)>what(){&> :{>mul(806,620)mul(976,304)when(); :)/[mul(463,959)'when()[select()(^]mul(911,997)-%[*,mul(448,155)({from(10,578)mulwhat()when()<}select()(mul(492,179)+from(771,314))&*:!]mul(624,243)who()how()(^&{%+$do()'?mul(171,189)who()where()mul(531,756)@what()who()}mul(83,163)> @)*mul(575,765)why()'$$who();{who():?+mul(644,730)~from()&/where()select(574,686)what()^?~mul(998,26)~<: [){}?do()how(851,386)#mul(29,770)]what()select(),^why()from(577,917)?/do() mul(309,161),#mul(684,763){#;why()$+[@]mul(99,693)who();(>select() don't()~^,mul(144,109)!@mul(757,540) +mul(649,668),[^/~> &what()mul(948,181)(what()select()~mul(147,215)mul(790,557)+@when()who()>-{%mul(809,499)+from() mul(594,964)?select()) } ,%mul(105,293)mul(800,358)who())/{$select(343,382)>+from()>mul(556,232)mul(719,487)'&^?why()?^+mul(986]:why()&mul(487,944)#/>[when()when())mul:select()what()&]>^~mul(356,737)$why()^~why()[>mul(357,835)from()~~$+&don't()mul(243,897)mul(606,944);--how() mul(200,517):?:?#),>who()}mul(588,55)&where() how()-:'when()^>mul(144,286)<%{} select()mul(957,918)!mul(901,352)!],;who()>mul(840,776)(,how(544,497)!#:/mul(319,341):what(836,872)<;!!,(!mul(182,549)~mul(550,899)what()>{}^%[do()when()- mul?-('[~@who()~&~mul(376,145)]#]mul(206,452)%?'{+ &how()#]mul(210,898)^+[from()why()'@]/mul(914,474)mul(814,374)how()?mul(679,233select()!$;)*why()who(),{mul(109,898)^^,$^who()what()mul(526,786)what()mul(966,480)mul(971,34)!who()mul(268,920)when(),!^+:!~~don't()'mul(324,732)why(98,537)where()^];}&*mul(341,746)/-+who()(mul(557,763)how()mul(30,249)mul(646,653)'where()(? ,,what() !mul*}&+when()when(579,74)what()]mul(100,419)%*,~-;*~mul(980[who()$where()({do()$)]*mul(154,681):)~select()>'select(110,162)/mul(499,447);~ ]!/%from()mul(140,215)'how()]>^&'/mul(54,832):*/from()/mul(176,59)@$$[#^]mul(802,12)~mul(85,515) +@)::-from()who()mul(979,36)mul(966,513@+'}?don't()mul(428,358)+where()select(943,219)-?>mul(258,3)what()mul(415,26)/'mul(7,129)@who()how(){mul(104,970)]mul(626,872)where())&mul(349,194) *when()how()%&}(why() mul(827,914) how()[+what()^--[!mul(421,153)?mul(161,508):+where()mul(786;#(@/mul(857,712)why(841,104)[})&from()mul(411 ]how(223,310)mul(528,703) ]mul(17,407):*~+)mul(129,256]%$where()~mul(934,438)~where()&+#what(15,14)$select()mul(170,110)mul(367,246)@ mul(759,593));$' where()why(326,790)?why(101,864)~mul(941,890)what(863,919)}>mul(291,785)where()~when()/what()when()mul(599,49)why()'what()}}/what()%{do()$?why()&what()'mul(235,289)mul(326,542)-[why()>[;mul(539,793)mul(608,380)from()>- &:where()mul}who()'*;:'how()from()mul(732,637)&>mul(66,802)*mul(549,82)>&from()+!who(809,63)mul(247,247):why();-select()}mul(70,653)] where()>$mul(436++mul(489,212)><}what()[what()when(279,911)mul(135,755)where():;#%$mul(961,126)#:why(),&select()where()mul(952,400)#~{~]/];from()mul(323,62)<#(]mul(216,941))mul(463,878):!+, -;how()mul(955,874) %: $',don't()<#,@$@-#>mulwhere()when()mul(414,753)/%$mul(121,719)?mul(461,998);,(;(@]mul(197,230)(#@who()]who()mul(843,541)%~}mul(444,889)what()~mul(351,825)#?how() *)}@!mul(903,612)from()-+>do()}#*+'{why()^who(469,233)mul(350,416) }where()#,mul(555,729)who()]&mul(688,456)select(818,922);*don't()]who(441,198)?mul(712,946)!)+- mul(224,129)who(){'!,what()mul(716,626)select()#(mul(26,417) )when()+{@@^don't()+*/mul(141,786)(from()[select()]$#>%mul(889,476):why()>where()~]}#mul(183,580)mul(970,128)[select()}@;where()[why()mul(174,357)~](+[~#mul(471,870)^'from(874,759)%don't()when()[where()who()(mul(880,149)+@?mul(319,427)&&~from()$(mul(186,123)%what() }*(do()when()-where()!/)(mul(810,752)mul(421,178);{# !when()%mul(926,537)when()'mul(697,480){:~#]{>-mul(536,791)*]$~*where()$mul(367,981)?(+~#mul(982,905)><},,*where() where()@mul(321,839)!{->]?what(){mul(467,883):/+)mul(849,445)why()when()[&$+!# diff --git a/day3/main.zig b/day3/main.zig new file mode 100644 index 0000000..2e6f158 --- /dev/null +++ b/day3/main.zig @@ -0,0 +1,128 @@ +const std = @import("std"); +const print = std.debug.print; + +const LookingFor = enum { + m_or_d, + u, + l, + l_brace_mul, + X, + Y, + o, + t, + apostrophe, + l_brace_do, + l_brace_do_or_n, + r_brace_do, +}; + +var file_buf: [1024 * 1024]u8 = undefined; // The file do 20kB, I give it 1MB + +pub fn main() !void { + const time_start = std.time.microTimestamp(); + + const file = try std.fs.cwd().openFile("day3/input", .{}); + defer file.close(); + + const len = try file.readAll(&file_buf); + + var total: u32 = 0; + var enable = true; + total += try parse(file_buf[0..len], &enable); + + const time_end = std.time.microTimestamp(); + print("Total time: {d}μs\n", .{time_end - time_start}); + print("Total safe: {d}\n", .{total}); +} + +fn parse(input: []const u8, enable: *bool) !u32 { + var state: LookingFor = .m_or_d; + var total: u32 = 0; + var intX_len: u8 = 0; + var intY_len: u8 = 0; + var enable_buff: bool = true; + for (input, 0..) |c, i| switch (state) { + .m_or_d => switch (c) { + 'm' => state = .u, + 'd' => state = .o, + else => continue, + }, + .u => switch (c) { + 'u' => state = .l, + else => state = .m_or_d, + }, + .l => switch (c) { + 'l' => state = .l_brace_mul, + else => state = .m_or_d, + }, + .o => switch (c) { + 'o' => state = .l_brace_do_or_n, + else => state = .m_or_d, + }, + .t => switch (c) { + 't' => state = .l_brace_do, + else => state = .m_or_d, + }, + .apostrophe => switch (c) { + '\'' => state = .t, + else => state = .m_or_d, + }, + .l_brace_mul => switch (c) { + '(' => { + state = .X; + intX_len = 0; + intY_len = 0; + }, + else => state = .m_or_d, + }, + .l_brace_do => switch (c) { + '(' => state = .r_brace_do, + else => state = .m_or_d, + }, + .l_brace_do_or_n => switch (c) { + '(' => state = .r_brace_do, + 'n' => { + enable_buff = false; + state = .apostrophe; + }, + else => state = .m_or_d, + }, + .r_brace_do => switch (c) { + ')' => { + enable.* = enable_buff; + enable_buff = true; + state = .m_or_d; + }, + else => state = .m_or_d, + }, + .X => switch (c) { + ',' => state = if (intX_len > 0) .Y else .m_or_d, + '0'...'9' => if (intX_len == 3) { + state = .m_or_d; + } else { + intX_len += 1; + }, + else => state = .m_or_d, + }, + .Y => switch (c) { + ')' => { + state = .m_or_d; + if (intY_len > 0) { + if (!enable.*) continue; + const x = try std.fmt.parseInt(u32, input[i - (intX_len + intY_len + 1) .. i - intY_len - 1], 10); + const y = try std.fmt.parseInt(u32, input[i - intY_len .. i], 10); + total += x * y; + } + }, + '0'...'9' => { + if (intY_len == 3) { + state = .m_or_d; + continue; + } + intY_len += 1; + }, + else => state = .m_or_d, + }, + }; + return total; +} diff --git a/day4/input b/day4/input new file mode 100644 index 0000000..a8e60e4 --- /dev/null +++ b/day4/input @@ -0,0 +1,140 @@ +MASAMXMSSXXMAMXXMXMASXMASXMMSMSMMMAXMASASMMSSMSXAXMASMMSMMMSSMSASMSSSSMSMSMXXMXMAXAMXMSMSSXSAMXMSSXSXSXMASXMSASXMMXSXMSSSSSXSAMMAMXSXXMAAXSA +MASMMXMASAXASMSMMMSAMXSMSAMXAAAAAXAMXASXAMAAAAMMSMMMMMASXAAAAMMAMAMMASAAAAXMXMSSSSSSMMSAMAXAXXSMAMSAMXASAXXASAMXASAMAXXMASAAAMAMAXXMASXSXSXS +MMXAXMMMSXMAMAAXAAXAAAXXSMMSMSMSMXAXMXSMMMMSSMXAMXAAXMAMMMMSSMMAMAMMAMMMMMXSAAXAAMMAXXSAMXMSMAXMAMSMSSXMASMMMSXSXMAXMMSMMMMMMSASMSXMAMAXXSAM +SXSAMASASMSXMSMSMSSMMMMMMXAMXMMXMASMMMMAXXAAAMMMSSSSSMASXXAAXASMSXXMXSXSXSASMSMMSMSAMMMAMXAAMASXMMSXMXMMMXASAXMSAASAMXSAAMXSXMASAXMMXSMSMMAM +AAAXXXMASASXMXMAXXMMASAASMXSASASXAAAAMSSMMMSXMAAMMMMMXAXMMMMSAMXAMASAMXSAMASXXAXAAMAMXSAMXSXSMMASAMSMASAAMSMMSSXMAXASASMMSAMASAMAMSMAAXMASXM +MSMMXXMMMAMAMMMMMMXSAXXAMMMMXSAXMMXXAMXAAMMXMASXMAAASMMXAAMXAXAMMMAMAMAMAMXMASXMMXMAAXMAXMAMXMSAMASXMAXMSXMAMXXXMASAMAMAXMMMAAXXAAAMXSXMMMAS +MXAXAMXXMMMMSAMAASMMMSMMASASAMAMAXMSXMSMMXAMXAXMMSSXSASXSSSMAMSMXMXSAMSSSMAMXMXAMAXXMMSAXAXMMXMASMMMMSSMMASAMMAMSMMAMAXSMXXMSSSSSSMXAXMSSMMM +ASXMMXSAMXAASXXMXSAAAXASAMMMASMSSSMAAMMXMMSSMASAMAMMMAMMAXMAXMASXMAXMSAAASASAMXSSMXSAAXSSMXAAXXAXMAMXMAMSMMAXMAAAAMXMAMXASXAMAMXMXMMAXAAXAXS +MAASMAMMSSMMSMSSXSMMXSMMASMSXMAAASMMMMAAMAMAMXAXAASMSSMMMMXSMSXSMXSXMXMXMSXMASAMAAAMMMMMMXXXSXMASMXMXMMMSXMSAMASMSMAXMASAAMXMMSSMASXXMXMAXMA +SAMXMXSAXAMASMXAASXSMMAXXMASAMMMMMMXXXSXMASAMXMASXSAAMXXXMMXMXAXMAMAMXXAAMAXAMASMMMSMMXSMMMXMAAMXXAXSXSASASXSMAMAAXMMSMMXMAXSAAAMXSASMSSXSAS +MMXSSXMXSAMASXXMXMAXAXXMSMMMXSAMXXMSXMMASXSXSXXAXMMMMMXMAXAMXMMMMASAMXSMSSSMSMMMMMAXXMAXAAAAXXSXXSASXAMAXXMAXMAMSMMSASXMAXMXMMSXSAMXMAAXASAM +ASAMXAMXSXMAMMMXAMSSSMSAXXXMSXASASXXAASAMXMAMAMSXXAXASASASXXSAAAMASAMAXXAAAMXASXSMXXAMASMMSMSAMAMXXXMMMSMXMMMXMXAAAMXSASXSSSXAAAMMAMMMMMAMAM +MMMSSXMXMAMXMSMXMSAAAAMMMXMSMSMMAAMSSMXAMMMAMXMXXSXSMSAMXSMAMSXSXAXAMSMMMSMMSAMAXAMXXAXXXAAAMXXMMSMMMSAMXXSASASXSMMXMSAMAAAAMMSXMAAMAMAMXMAM +XXAXMASMSAMAAAAASMMMMXMASMMAAAXMAMAAMMMSAMSAMSAXMAAMMMAMXMMMMAXXAMXSMMSMAXXXXAMSMMSASMMMMSMXMSMMAAAAAMMMXMMAMASAMAAAXMSMMMMMXXMASXSSSSXSASAS +SASAMXMAMMSASMSMXASMMASXSASMSSXSAMMXAAAASASAMXMXAXMSASASMXAAMMSMMSAMXAAMASMMSMMXAXMXXAAXXAAASAAMSSSMSXMXSAMAMAMASMSMSAMXMMASMMXMMAAAAXASMSSM +XAMASXSXSASAXMXMSXMASAXASMSAAXXMAMSSSMSAXMMMSAMXMSASASAMAMMMSAAMAMASMSXSAXAMAMXMXMASXSMMSXSXMAXMAAXAMASXMAMXSXMXMXAXMAMAMAAAXMSXMMMMMMXMXXXM +MMMASMAAMMMAMASASAMXMASMMAMMMMMXMMXAMAMXMAAXMAXXXMAMXMMMSSMAMMXMXSXMAXMMMSSSXSMSAMXSAXMASMMMASXMXSXXXAMAXAMMSASMSSSMSASASMXSAMAMXXAASXMMSASX +AXMAXXMXMXSAMMMAMAMXMXAMXSMSXASASMMAMXMSSXMSXSAMXMXMMXSXAAXMASXMXAMSXSAAXXAXXXAAXAAMMMXXMAMMAMAAAMMSMSSMMSSMSAMAAAAASASASAMXXAXMMSAXSAAXMASX +SXMASXXXMAXASMMMMMSXMMASXAAXSXSXSASMMASMSAXMAXAMXXMAMASMSSMMAXAAASASASMMAAMMXMSMSMXSAMXMXSXMASMMMSAXMMAXSMAMMXMMMSMMMAMAMXMAMXMAMAMMSXMXMXMX +MAMMAMXAMXSSMMXAAXAMASAMXMMASXSXSAMMSMSAXMASASAMMMAAMAXAMXXMMSMMAASMAMMXMMXSAAAAXMASASMMAMXXMAAAXMXSSMXMAXAMXAMSMMMSMSMSMAMMSAXMASAAXMMASAAX +SAXSAXSXSXMMASMSSMXMMMASXXAAMMMAMAMAAMMMMAMMMMAMAASXMSSSXMAXMAXAXMXMSMAXXAASMMMSMXMSAMXMASMSSSSMMSAXMASAMSMSXMMAAAAAXAAXSAMMMMXXXMMXSMSASMSM +MAMAXMMMXAASAMAMMMMMSSMSXSMXSAMSMMMSXSASAAXAAMAMSMMAMAAMAMXMSASXSXXXXAMXMMXSMSMXMAMMAMXSASAAXAAAXMAMSAMAXAMSASMSSMSSSMMMSMSAAXSSSXSMXAMXSXMX +MSMSMMXSMSMMAXMASAMSAMXMASAAMXSAAXAMXSMSSSSSXSAXXXXAMMSMXXSXMASAXXMASAMXMSXXAAAASAXMAMMMMMMMMSAMMAMXMMXSMXMSAMAAAAXXMAXMXMSMMSAMAAMXSAMXXASM +AMAMAXAMXXXSXMXAXMXMASAMXMMMSMSXSMMSAMXXAXAAXAXMASMSMSMXXXAMMMMMMSMXSMMSAMXMSMSMSMSSMMMASXSSMMXSMAXMASAMXXXMMMMMMXMMSMMSAMXASMAMMSMMAAXXMASM +XMAMMMXSAMASMAMXSXXSAMAMSMMAAASMXXMAAASMXMMMMMXXXAAAMAMMMXMAAMAMAMXASAAAAMAAAAAMXMMASXSXMAMAAMAMXSXSAMXMAMXSXAMSMSAMAXAXAMAMMSSMXMXAXXMSAMXM +SMXSAAAMAMAMMSMAXAMMXSAMAAXSMXXASXSMSMAMXAAXMXMMMMSMMAMSAAXSXSAMAMXXSMMSASXSMSMSAMSAMMSAMXMSAMXSAXMMXMAXAMAAMAMAAAXSASMSSMXSAAXMASASAMXSAASM +AAAAMMSSXMASAAMSXSAMXSXSXSMXMASASAMXMAASASXMXAAXAXAASAXASXMMASXSASMMMXAXXMAAMXXXMMMXMAMAMXMXAMXSAXAXSXMXAMMXSAMMSMMMMSMAMXMMMSSMXAAXAAAMXMXM +MMMSAAXMMMSMMSSMAMMMMMMMMXAXSXSAMXMAXXXSXAAMSSSXMXSXMXSMMSAMAMAMXSAAAMXMAMMMMMSMSXSMMMXMMAXSAMAMASMXMASXSMMASXSAMXSAMXMAMAXASXXMMMMMMMXMMSSM +SAMAMMSMSMXAMMXMAMMSASASASAMMAMMMMMXMSAMXMXMAAMASMMXSMAXAXMMMMSMMMXSMSSSSSMAAAMMSAMMAMASXSMSAMXSASAXMAMAMAMMSAMXSASASXSMSMSXSXAMAAAAXSASAAXX +SMSMXXAAAAMMMMASASASASXMASAMXMAXAXSXMAAXMSXMAMXAMAMAMXSMMSXSXAAMXSMXXAAMAAMSMMSAMXMMASMSAMXSAMXMASXMMMSASAMAMXMAMASAMMSMAAXMMMSSSSSSSMAMMMMX +XAAXASMSMSMAAXXXAXMMMMAMAMAMXXSSMXXMAMXMAMASXSMMMAMAMMXXAAAXMSXSAMAAMMSMSSMMMAMXSAMSASAMXMASXMAMMMMAXMAXXMSAMXMAMXMAMAMMMXMSXAAMAAAXAMXMSASA +MXMXAMXAXMMSXSMMSMSSSSMMSSXMXXXAMXXSSSSMXSAMAMAAXSMMMAAMSMXXMAMMASASMAXMAAAAMMSASAXMSMXMXMASMXXXAAXMAMMAXMSXSASXSXSAMSSMSMASMMMSAMMMSXMXXASA +SASXSSSXMSXMAAAAXAAAXMASXMAAXXMSAMMAAAXAAMASAMMMAMASMSXAXXAXMSSSXMAXMXSMSSMMSMAXMMMXAMXXMXAXMASMSMXSAASMXAXXSAMSAASXMAAAXMAXXAASMAMAXAXXMMMM +SASAXAMXASAXSSSMMMMMMXMSASXMXMAXAXMMMMMMMMXAXXAMXXAMAMXSAMAMSAAXMMMMSXSAAXMASMMMMMXMMAMMAMSSMAXAAAASAMAAMSMXMSMMMMMMASMMXMMSMXMSSSMASMMAAAAA +MSMXMAMSSMMMXAAAXXMASMXSAMSAMXSMSMMASAAXMXAAMMXXSMSSXMXXASAMXMSMSAMXMAMMMMMMMMAAAAAAXMMAXXMMMMMSMMMSAXMMMMAXAXXAAAXXAXAMXAAAXMMMMMMAMMSXSMSS +SAMXSMMXXAAAMMMSAMXSMAAMAMMMXMXXAAMASXSXMSXSXSXASAMXAMXSXMAMMXMASASXMMMSXXSMMSSSSSSSSMSSSMXSAXXMAXAXXMXSAXMMMXSSSXMMSXMMSMSSSXSAAAMMXMXMMMXM +XAMMASMSSMMSMAAXXAXMXMMSMMASASXASXMASAMXXSAMAAMMMAMSAMAXMASXMAMMMAMXAMSMSXAAMXAAAAMAAAAAAAAMXXMXMMSSMSASMMXAXAXMAXSAMAMXSAMAAMASXMXMAMMSAXAM +SSMMSAMXAASMXMMSMMMSAMXXXSASASAXAAMAMAMMMMAMMXSASAMMAMXXXAXAMMSMSSSMSMSAXSSMMMMMMXMMMMMSMMMXMMAASAMAAMASAASXMMXMXXMAMXMMSAMMMMXASXSSXSASASMS +XAXSMMSSSMMXAMAAAAXMMSSMAXXMXMXSSXMXMAMAAMXMXASASASMSMXSAMXMMSAMMAAAXAMXMMMSMXSAMXSAAXXAMXSAASMMSAMMMMMMMMAAMAMSASMSMASASAMSMXSAMXAAAAXMAMAA +MXMXAAXMMMMSSMSSSSSMASAMSSMXXSAXAMMSSXSSSMSMMXMAMAMMXSAMXSAMXSASMSMMMSMMXMXAMXSAMXSSMMAMXAMMMMSASXMASMXSSMSSMASMASAXSMMASXMXMMAASMMMMMMMAMAM +MXXMMMSMXSAAAAAXAXAMMXAMAAAAMXXSAAAAXXMAMAXXMXMMMSMMXMXSASASASAMXXXAAXAMASAXMASXMMMMSMAXMMSXXAMMMMSAXSAMXAMXMMSMMMMXAXMAMXMASASMMAXSXSAMAXAX +MSMXAXXAAMMSMMMMSMSMMSMMXSMSXSMSXMMSMSMAMSMSMXMXMMAAMMXMASMMASAMXXSMXSXMAXAASASASXAAXXXMASAMMSMXMXMXSMXMMAMMMMXXXXXSMMMMSSXXAMMASMXAAMAMSMMS +AAASXMMMMSMAXXXAAMAAXSXSMXAMAAASAXMAXAAXMXAMXAXAMMXMAXAMMMMMAXAXMMXMXSAMASXXMASAMSMMAXMAMXASAMMSMAXMMMSASAMAAAAMXMXAXXXSAMMMMASAMXSMSMSMMAMX +SAXMSAAAAAMMMSMSSSMSMMAMAMAMXMSSMMMXASAMXMAMSMSXSSMSXMAXAAXMSSMMXMMSASMMMXXAMAMAMXMAXMASMSAMASASXSXSAAMXSAMSAMXAAAMMSMXMASAXSMMAMXAAMAXAMAMX +AMMASXMMSSSMASAMAAXXAMAMMSMMXXXXAAMXMMXXXMMMMAAAXMAXMASMSXSXAAXMAXSMAXXAXMSMMMSXMSMXMAXAMMMMAMXMAMAMMMSASMMXAXMSMSAMAMMSAMMXSAMAMXMSMMMSSSMM +SSMAMAMAMAAMAMAMXMMSAMXMXAAMAMMSSMSMXSXXMAXAMMMSMMSMXXMAXMSMSSMSXXAMSMSMSAMASAMXAAMSSSMSMAXAAXAMSMSMSXMASASMSMMAAXAMAMAMAMXMSAMXMMAMXXAAAAXX +MAMXSXMAMSMMXSXMASAMSMASMSSSMXAAXSAMAXMSSXSAMAAAAMMMSAMXMAXAXAMAXMXMXAMASXSAMASXMXSAAXAXSASMMSXSXAMAMXMXMXMAMMSASXSMSASMSMSXSMMAMMSMMMSSSMAA +SMMXMASAXMXMASASMSXSASMSAAAAMMMMSMMMMSMMAXAMSSSSXMAASXXMMAASMMMAXSAMMXMAMMMMSAMXMMMMSMMMMMSAASMMMSMAMSASMAMSMASAMAMAMAMAXXAAMXMSMMXAXMAAAXXM +XAMXXXASAMAMXSAMASMAMMXMXMMMMASXMMXSAAAMMAMMAXMMMSMAXMAXASMXAMMAXSASMSMASXSASAMMAAXAMMXAXASMMMAAAXXAMXAXMAMAMXMSMXMXMAMSMMMSMMMXAASAMAMSMMMM +SSMMSMAXXSXSAMAMAMAAXMAMXSMMSASMSMAMSSSMXMXMMSXAAXXAASMMMMASMMMXMSAMAAMXSXSAMAMXAMSASASASAMSXSSMSSSMMMAMSSSXSAAXMMMMSXMASXAXXXASMMMAAMXXXAAM +AAAAXAMSASAMXSXMXSSSSSMMAAAXMAXAAMXMXXMAXXSMXAMMMSASAMAAAMMMMAXMXMXSSMSSMMMMSAMXAXMASAMAMMXMMAXMAMXAAMAAAAAXSMXMMAAXMMAMAMASAMXMAASXMXASXSSS +SSMXXSAMMMAMASMMMAAAAAAMSSMMMAMSMSMMSAMAXMMAXAXAAXXMASXMSAMXSASMMSAMXMXXAAAMSMSMSXSXMAMXMSASAMMMXSSSXSMMMXXMXMASMSMSAMSXMXAMXXASMMMMSAMXAMXX +XAMXAXXMXSSMAXAMAMMMSMMXMAMMMMMXAMAMSAMASMMSMSMMMSAMAMXAMMMAMAMMAMXSAXASMMMXMXXXMAXXMXMXASAMMSAAXAAAAXXXMXSXXSXSAXASMMAMXSAMXMXXSAAAAASMXMAX +MAMSMMAAXAXMMSXXAMXXXMSMSSMAXMAMAXSMSAMMXMAAAXXAAXAMASMSMASXSASMSMAAMMMMSSMSXXAMXMXSMMSMMMXMASXSAMXMMXXAAAMAMMMMMMXMASMSAAAMAMSXSSMSSSSMSMMM +SMXAMSSMMMXXXAMMMMXXMXXAAAXXSMSMMMMAMMSSMMSMSMMMSSSSMMMXSAMXMASXXXMXSMSXXXXAAASAMMASAASAXMMMASXMAAXAMXMMMXSMXAAAMAMXAXXMASXMAXAMXAMMXAMAAAAX +AAMMXAAXMXASMMMXAXXMSMMMMSMMAAAAXSMSMAAAMAASXXAMXAMXMMXMMMSMMXMAXAMXAAXMMMMMSMMASMAMMMSSMXAMXSASXMSMMMXSAAAXSMSSSMSMMSMMMXMSSXSASXMSAMXMSSMM +MAAXMMSMMMMSAAASMMMAAAAAAMAXMSMXMXAXMMSAMSMMMMSSMMMSMSAAMASASASMSAMAMAMXAAAAAMSAMMSSMXXAXSSSSSMMMMAMMAAXXMMMXAAAAAMXXAAAXAMAXAMXMAMMMXAXXAMS +XSSXMXXMAAAMMMMMAAXSSSMMSSSMXXXMMMAMXXXMXMAASAAXASXMAAXXMXSASASMMAXXMAXMSXSSXMMAXSAAASMMMAAMMMAAXXASMMSSXMXSSSMSMMASMSSMSASAMMMASXMAXMXMSAXA +MXMAMMXSSSSSSMSSSMMMAAXAXXXAXMAASXSMSAMMAMAMMASXMMAMXMSXMXMXMAMAMSMXMXMXAAMAMSMMSMMMMXAXXMMMAMMMXSAMXAMXMMMAAXXXASAXMAAAXAMASXSMMMSSXSAMSXMM +XASAMXAMAAMAAAMAXMAXMAMXSSSSMMSMSAMAXAAMSSMMSSMMMSAMAMMASXXMMXMAMAASMAMMMMMAMXAXXAMASXSMMMXSMSXAXMAMXMASAAMMSMMSMMASMSMXSASXMASAMXXAASAMMMAX +SMSMSMAMSMMSMMMAMSMXSSSMAMMMMXMAMAMMSSMMAAAXXAAXASASAASAMAMASASMSXXAMXSSSXMAMMMMMSSXMAMSASAMSAMXSSXMAMAXMXSAAAXSXSMMAAAMSAMXMSXMASMMMXAMXAMM +AXXAXMXMAAXMMXMAMXSMAMAXMSAMXASXMSMXAMSSSSMMMXMMXMASMXMXAAMSSXSXXMMMSXAAAXSASXSASMMMMAMAXMASMXMXXMMSMMSSMXMMXAXMASXMXMSMMAMXXMAXAXXXMSMMXSXA +MMSMMMXXMXMMXAXXXAXMASAMXSAMXAMAMMMMMSAMXAXXAASXSMASMXXASMMXMMMMMSAAMMMMMMXASAAMSAAMSASMXSSMMASXMAAAXAAAMASMMSMMAMAMXAAAXMMSMSAMSSSXMAASAMMS +XAAAAXMSSMSSSMSAMXSXXMAMASASMXSAMAXAXMASXMMXSASAAMAMXMAMXMSMSAMXASMSMAXMASMMMMMMXMAXSXXAMXAASAXMAMSSSSMSMASXXAAMXSAMAMAMSMMAAMMXXAXASXMMASAM +MSSSMSAAAAAAAXAMXMAXXMSMASMMMAMAXAMSSSMMAAAMMAMXMMSXSASMAXAXSXXAXXMMXXSXAXSMASXAXAXASXSMSSSMMXXSSMXMAMXAMXSXSAXSAAAMXSAMAASMSMSAMMSMMMMSSMMA +XXAXAXXSMMMSMMMXSMSXSAAMAMASMMSMMSSMAMXSSMSSMAMMSAMAAAXMMMMXMSXSMXSASMSXXMMMAXMMMMMMMASAAAAMSXXAAMXMAMSSSMSAASMMXSXMASASMXMAMAXXMMAMAMXXAAAX +MMMMMMAXAAXAXMMAXAXMXAMMMSAMAAAAXMAXXMXXAAAXMASXMMSXMXMASXMAAMMMMAMASAXMXAMMMSAASAAAMAMMMMMSAMXSMMAXAMAMXAMSMAXXXMMMXMAMXMMXMXMXMAXSASMSMSMX +MASMSXSXXMMXMMMSSMSSMSXAXMAXMMMXMSAMXMXSMMMSSXSMMXMXMXSMMASMXSAASXMAMMMAXXAMXAXASMSXMASAAAXMXSMAXSSSMSAXMXMXSMMSAMAMMMXMSSSMSAAXXMASASAAXAMA +SASXSAXAASXMSAAAAAAXAMMMSSSXSMMSAMXSAMXAXXXMAXSMSASAMXSXSAXMASMXSMSASXSSSXSASAMXMMMMSXSMMMSAASAMXXAAASAMMSMAMXMXMSASASAAAAAASXMMMXAMXMXMMAAM +MMSMMAMSXSAAXMSSMMMMSMAMMAMXAAXMASASASMMSXSSMXSASMSAXASAMAAMAMMMSASASAAXMAMAMXXMSASMSXMAMSAMXSAXMMSMMMASMAMASASMXSASAMMXMSMMMAXXAASMMSASXSMX +MASAMAMXAMMMMMMXXAXAAMAXMAMSMMMMMXMXAMXXMMMAMMMAMAMMMASXMSMMSXSASMMAMMMXMAMAMXSXMASAXMMXMXASASMMAMAXXMAMXMSXSASAAMAMAMMSAMXXMMMMMMMAASASAMXM +MAXXMAMMXMMASMMSMSMMMXMMMMMSMXMASMSMMMSMMASMMAMAMAAAMXMAMXMMMAMASAMSMAXMSASMSASMMMMAMXXMASAMXXXAXXMSMMSSMXSMMAMMSMSMXMASMMMMMSASXAMMMSMSMXAX +MMSASMSMSASMMAAMXMASMMMAMXAXAASMXAXAAAAAXMSXSXSMSMSXSAMMMMMAMAMAMAXMMSAMXAXAMASXAMAXXXMXMASMXMMSSMMAXSMAMAMAMXMXXAMXSAXMASAAMXASMXSAMXMMXSMS +MSAMAAXAMASAXMMSASMMAASXMMSSSMSAMSSSMSMSMAMASAAXXAAMSMSAXAXASAMASXMAAMAMMMMSMMMXMXXMASAMXMMSXMAAAASMSMSAMXSAMAMMMMMAMAMXAXMMSMSMXMSMSAMAXAAA +MAMXMMMXMASAMMXSMSAMSMMASXMAXAMMMXAMMAAMXSMAMMSMMMMXXMSXSMSMSXSASMSMMSMASAAXAXSASAMMMSAMAMSAXMASMMMXXMSMSXSMSXMAXXMASASMMSSMSXMAAXXAXXMASMMM +MSXMAXMXMASMMSAMXSXMMXSAMAMMMMMMXMAMMMSMAMMXMXMAXXMXMXXMXXAMXAMASASAXXMASMMMAMSASASAAMMXAMAAMMXXAAMASXMMSXXMAASASASASXMAXXMAXAXSMSMMMASXSMAX +MMASMSMAMXSAAMXMAXAMMAMAMAMAAXAXAXSMSXMMXMSSMXSSMMSMMSAASMSXMXMAMASAMMSXMASXSMMMMAXMSMASMSMSSXAMSMMASAAASAMXSXMASAMASASXMMMSMMMXXXXXMASAMASX +ASAMAMXSMMSMSMAMXMSMMAXAMXSSSSSSMXMAXAXMXXAAXXXMAXAAXAMXMAXSAXAXSMMMMAXAMAMMXAXAMAMSAMXSAAXAMMSMXAMXSXMMSXMMMMMXMAMXMXAMXXAXAXMMSMSSMMMAMAMA +AMAMMMAXXAXAAXXMSAXASXMASAAAAXMAXAMAMSMSSMSMMSMXMSSSMXSXMAMAMMMXMAAXMXXMMASXSSMMMMMSASAMMMMMSAXASXMXMAXXXASAAAXASAMXSXSMSMMSXSSXMMAXAXSAMXXX +ASXMXMAXASMXMSXAMXXMASAAMMMMMXSMMXSXSAAAXXAAXASAAXAAMXSAMASMXAXXSMMSXXSASASMAMMXSMASMMMSAXXMXAMXMASAMAMSSMMSMSMMXAXXMAMAAAMMAXAAXMMSSMSXSXSM +AMXXAMASMXSMAMMXMMMSASMMMXSXMASAMASXSMMMSMSXSASMSMMMMAXMMASXSMSASAXMAMXAMASMAMSAXMASAAASMMMSMSXSXMMXMXMMAMAMXAASMMMAMAMXMSASXMSMMAMAXAXAXMAS +MXSMMSAAMAXMXMAAAAAMASMXXAMAMXMAMASASXMMSAAMMMMMAAASMMSXMASMMAAASXAMAMMMMXMMXMMXMAAXMMMSMXAXAMMMASXMASXSXMASMSMMASMXMMSAAXMMAMXMSXASMMMSMMAX +SAXMAMXMMXSASXMSSMXMAMXMMSSMMXXAMASXSAMAMMMSAXAXMSMSAMXMMXMAXXMXMMMXXSXMAXMASXSXSMMSAMXMXSSMMMASAMAXMSAMXSXSAASMAMMAXASMSSSSMMAASAMXAXMASMAS +MMSSMSMSMSAMXSXAMASMMMMXAAAAAXSMMXMASAMAXAXMASMSXXXMAMXAXSXSMSSXSAMSAMXAMXSASMMAAAAXMASAAXMAXSASMSXMXSAMXMASMMXMMAXAMXXAXAASXXXXSASXMMMXXMAS +MAAAXMXAXSMXAMMSMAAAAXMMMSSMMMXAAXMASXMASMSMAAMAMMSSSMMMMSAMAXMAMASMAMASXXMASAMSMMXSMAAMMSMAXMAXMXAAMSAMSMXMMSSMXAASXMASMMMMMSSMSAMMSAMMMXAS +MMSSMSSXMMXMMMAXMXSXMXXAAAXAXMSMMSMAMMMAXMAMXSMASMAAAAAXAMMMSMMSMMMXMXAXXAMAMXMAAXMXMMMAMAMXSMSMAMXSASAMXXMXMAAXSAMXASAXMXMSAAXXMASMSASXXMXX +SAAXMAMXXMAXASMMMAMAAASXSXSAXMAMAMMSSMMSMSAMSAMXSMMMSAMXSSMAXAAAAXAAMMSSSSMMSMXSXMAMXSSSXXSMSAMAMSAMXSXMMMAMMMSMASMSAMXXMAAMMMSXMAMASXSMMAXS +MASAMMSMMMASMAAAMASMMMMAAAAAXSAMAXAXAXAMXMMMXAMXSXMMMAMAMAMASMMSSMSSSXXMAMAMSXMAMAMAXMAMXAXAMXMAXXXSAXAXXASAAMAAMXMMASMMSXSASXXAMAMMSASAXMXA +XMMXXMAMSAAMXSSMMMSMMAMSMMMMMSAMXXSMMMXSAXAASXMAXXSASAMAXAMXSXAAXXAMAMMASMSMMMXAXSXSMMAMMSMMMXMXSMASMXSAASASMSXSXMSMAMMASXMAMMMXSXSXSASAMMSX +SXAXMSMAMXMSMMAXSAMXMAXMAXXMASAMSXMASAMXASAXMAMSMMSXSXMXASAMXMMSSMXXXAXXXAMXMAXXMXAAMMAMAMAASASAMMMMAAAMMXXAMXXMXAAMXMXAMAMMMAAMAXAAMAMXMASA +XMAXAAMSMSMSASAMMAXSXMASAMXMAMMAAASMMMMSASXSXMAMAMSXMASAMAASXMMAXXSMMSMMMSMMMSSXAMSMMSSMMSSMSASXXAXMMMSXXMMSAMXXAXMSMSMSSXMXSXSMMSMXMAMXMMSM +SSSMSXSXAMAMAMASMMMSAMXSMMMMXSSXMMMMAXAMAMAMAMASXMSASAMSASMMXXMAMXMMAAXAAXAXAAAMXMAXXAXAAXMAMMMMSMSMAAXMXXAAXASMMMXAAAAAMAMMMMXAASMXMMSMMAMM +MAAMMMMMAMAMMMXSAMXMAMMXMAAAMAMXSASXXMASAMXSXMXSXXXMMMXAMXMASMMSMMSASXSMMXAMSSXXSSMAMASMMSMXMAAXXXAXXXAXXXMMMMSASXSMSMSMSAMAAASMMSASXAAMSAMX +MMMMAAMAAMMMXSMMAMMSAMSASXMSAMXAMAXAMSXSXXXXXSAXMAXXSXSSMMMMSXAXAXMAXMSASMAMAMAXXAXMAMXAMAXSSSSSSSSXMSMSMMAXAAMMMAAMMXAMXASMSMMXMMAMMSAMSASX +SSSSXSMMSXSAASASMMMMASMASAAXMAMXMSXMMSAMXSMMAMMSMSAXMMSAAAAXMMASMMMXMMMAMSXMXSASXMMSMMSSMMMMAAAAMAAMXAMAAMXSMSSSMSMMSSXSXMMMMXMAAMAMAXMASAMM +AAAMMXAAAAMMMMAXXAXSMMMXMMMMMXMXSMAXAMAMAAAXAMXAAMMAAXSAMXMAMMMMXAXMAAMMXSMMXMAMXMAAAASAAAMMMMMMMMMMSASMSMAMXMAMMMSAXAAXMMMMSSMSSSMSMAXAMAMS +MMMMASMMMMMSXMXMSMMMSSSMXAAASAMMMSMMSXSMMSAMSSSMSASXXMMAMXSMXAAMSMSASXSSXSASAMAXMMSXSMMXSAMAXASMMMXAXAMMXMXXAMMMMASXSMSMSAAAAAMMAAXAXXMAMXMM +XAAMXSASXMAMAMXAAXAASMAMSSSMSASXAAMMXAXAMXAMAAXSXXSMAXMAXXMMSXXXAXAMXMXAXSMMXSSSMMXAMXSAXMMMXMXAAMMSSMSXMMMSMSAMMASAXAAAMSMMSSMMAMSASXMASMMS +SSXSASAMXMASAMMSMSMSXSXMAMXAXXMMMMSMMMMAMXMMMSMMXAMMAMMASMAAAMMSSSSMSASMMSXSAMMAMAMAMAMAXSASASXMMMXMAXAAXMAAAMMXMAXMMSMXMAXMMAMXAXAMXXSASAAA +MMMXXMMMMMMXAXAAXMXXXSMMXSMMMSSMXSAMAXXXMAMMXXMSMMMMMSXMAXAMMSAAXXXAMMAXAXXMAXXAMAMAMXMMMSAXASMXXMASXMSSMSSSSXMSMMMSAMXSMMSMSSMSMMSSMXMASMMM +AXAXSMSXAASXSMSXSAMXAMAXXMASXAAAMSASMSSMSXSMASAAAXXAAAAMAMXMAMMSMSMMMSMXMSSXXMSMSSMSMXASXMAMSMMMXSXSAMAXAXAAAAAAASAMASASAAXXAMMAMAAAAXMAMAAS +SMSSMAMMSXSAMAAAMMSMMMSMMMXMASMMMMAMAAMAMSMMAMXSSMSMSSSMSSSMAMXXMAXSASAMMAMMSMAAAXAAXSSMAMXMXAXMXMASAMASXMMMXXSMSMMSXMASMASMMMSAMMSMMMMMSSMM +XAXAMAMAMMMAMMMSSMXXAAXAASXMAXMXAMXMMMMAMXXMAMMXXAAAMAMXMAMXAMXMXAXMAMSAMASMASASAMMMMMAXMASMSSMXAAXSXMAMMMXXXMMXAMXSAMAMXXXAXASMSAMAXAXXAMAA +MMMMSXSXMAXXMMAMAMAMMXSXMXAMXMSSSSSMXASMSMMMXXAMMXMXMAMXMMMSMSAXMAXMXMASMAXXAXXMAAMMAXMAXAAAAMAMXSASAMSSMMSMXMSAMXASAMXSMSMSMMXMMASXMSAMXSXM +AAAXMMMXMXSAMMASMMSSSXSMSSSMSSXAAMAXSXSAMMSAMSMAXSSXSXMAMSXAMMXMMXXMMSMAMASMSMXMXMASMMXMXSSMMMSAAMASAMAAXAXXMASAXMAMSXMAAAXXMMSAMAMXSMXAMXMX +XSSSXSXAAASASMMXAMXAAAMAMAAAXXMMMMMMMAMXMAMXMAXXSAXMASMSMASMSSSSSMMSAMXSMAMAMXMMSAMSASMSAAAAAAXMMMAMXMMSMMXMXMMMSAMXXXXMMSXSAMSAMMSMAMSSMXAM +MXAMAXSXSMSAMMMMSSMXMMMAMSMMMSAAXAAAMMMAMAXXMXAXMMMAMMMAMXSMAXAAAAAMSMAMMSMMMSXAAMXMMMAMXXMMMSSXXMAMXMAMAMASAMAMAAMAMAXXAAAMAMMAMAAAMASAMSAM +AMAMXMMXMAMXMASAAAMAMXXXMAXMAXXASMSSSSSXSSSSSMSMSSSXXASAMSSMMSMSMMMSXMXSAXAAAXMXMXMSSMSMXSMSAMXXMXSSMMASAMAXASAMSAMXSSMMMMSMAXMAMSMMXMSAMXAM +MSAMXXXAMASMSMMMSMSASMSMSMSMASAMXAAAAXXXMAAXXXMAXAAMSASAXAXAMMXXMSMMAMMMXSAMXMXAMXAXXAAAXAXSAXSASAMMAMASAMMSASMMMAMMXMAXMAXMASMMMMSSSXMAMSMM +AMAMMMMXSMMAAXXMAMSASAAAAAAMASAMMXMMMMXMMMMMMXMAMMMMMASMMSXMMSXMMMSMAMAMAMMMMASMSSSXMSMSXMASXMXAMXSSSMASAMXAMXMASAMXASAMXSXMXXAXSXAXAAXAMAXS +SSSMMAXXXAMSMSMSSXMMMXSSMSMMAXAMXAXAMXMASXSMAASASAAXMXMXAMASAMASAMSSXSMSAAAAMMMAAAAMXMSMAMAXAMMSMXMAMMXSXMXAAXSMMAMSASAMSXXMMMMMSMMSMASXSSSX +MAMASMSMSMXMAXAAMAAMXXMAMXXMMSMSSSSMSAXSXMXMAMSASMSMSASXMMMMASAMXMXAMXASXSXSXXSMAXMAMMAXXMAXAXAAAASAMXMMASMMMMAXSAMMAMXMAMAMAASAMAXMXAXXAXXX +MAMAMAAAAXSMSMMMSSMMXXMAMMSMXAXMAMAASAMXMMMMAXMXMXMAXASAAMXMXMXSXMSAXMXMMMAMXMSXSASXMSASMMSSMMSSSMSASMXSAMXSAAMXMASMSMSMASXMXMMASXMMMSSMSMMA +SSXMMSMMMMSAAXAAMAMAASXMMMAMXSSMMMSMXXAXAMASMSMAMMMSMMMMXMMMSAMMMMSAMSMMAMAMMXMAXAAAMAXSAAXAMAMAAAMMMMAMXSASXSXMSXMAMASMMSXMSASXMMAASXAAAAXX +XAASAXXXXAMMMMMMXAMMXMAAASASMXAMSAXMAMXMXMAMMAXAMXAAMSAMXSAXMAMMAAMMMMASXMSSXAMSMMMMMMXSMMSMMSSSMMMAAMXMAMXMAMMAMAMXMMMAMSASAXAAXSSMSMMMASMM +MSMMAMMSMMSASASMSMSMMSMMMSASMMAMMMMMXSAAMMSSSXSXSMSSMMXSASMXXAMSSSMSSMAMXAASAXMXXXMSAMXXMXSAAAAMAXSSXXAXXXSAAMMXXAMAMASMMMXMMXSXXMAMMXSAMAAA +AMAMXMAAAMSASASXAXAAMAAAXMAMASAMXSAAAXXSXAAAMMXAXMAAAXMSASXSMSXMAMXAAMASMMMSSMMXMSMSASMASAMXMMSMSMAMMSXSAXSMMSSSSMSXSAMXSSSXXXMMMSSXMAMAMXSX +MMAMMMMXSASAMXMXSSMSSSSMMSAAAAASASMSXSAXMMMSMAMMMMSSMMAMSMAMAMSMAMMXXMXXMAMXAXXAMAMXMMAXMMSXXXXAAMAMMAMXMAXXAAAMAXAMMMMMAAASAMXAAAXXMMSMMXXM +MSAMASXAAAMSMXXAXAMAAMMAMXMMSMXMXXAAASASMSAAASXMXAAAXAMSAMXMAMAXMSMSASXASXSSMMSXMAXMMXXSXAAMMMMSMSSMMASXMSMSMSMSSMMSASAMXMMSMSMMMSSMXMAASASA +MSMSASAMMMMMMMMSSMMMSMSXSXXAMMXMXMMMMMAMAMSSMMAMMMSMMSMSMSAMMMMMSAASAMMMMMAAMMAXSSSMSMAMXMASAAXMMXMASAMXMAAXXMAXMAASASXSASXXMSASAMMMASMSMASX +XSMMASMXMAXAAAMXAXAXXMXAAXMASAMXAXAXXMSMSMAMAMSMMAMAXXAMAXXSAAXXMMMMSMAASXSMMMMXXAAAAMAMAMAMXSMMMASMMASXSMMMSMSMMMMXAMAXAMAXASAMASASXSMAMMMM +MMASAMXSSMSSSSSMSMMMXMMAMXXAXXMMXXASXXAAXMASMSMAMASXMMMMMMXMXXSAXSXMXSXSXMAXXXXXSSMMMSASMMXSAMAASASXSAMXSAMMMAXAMXSMMMXMAAMMMMXMXMASAMMMMSMA +MSAMXSXXAAAXMAMMXAAMXSAMXMXMSMSMSXMMMSMSSMMXXAXXMASXSAASASMAASMXMAMMASXXXSSMMMMMAXXXXSASAASXMSSMASXXMASAMMMAMAMAXSMSXAAXXXAAXSAMMXAMXMMSAAMS +AMXSMXMSXMXMSASMSSMSAASXMAXXAAAAMXSAMMMAAAXSSMSMXMXAASASAMMMMAMMSSMMASAMMXAMAAAMMSMMXMXMMMSAXXMASAXXSAMMSSXSXMSMMXMXSSSSSMMMXXASXMXSXMAMSSSX +MMAXMAMAXSAAAAAAAXAXMMAMASXSMXMXMXXAMSMMSSMAAXXMASMMMMMMMMAMXMAAAAAMAMAAAMMSSXSMXAMSMSMXSASXMXXXMASXMASMMAAXSMAMAAXAMXAAMAMSSSMMASXAMMXMXMAX +XXMASMMSAMMXMXMMMMMXXXXAXAXASXSSMXSAMSAXAXASXMASAMAMXXXAAMXMAXMASXMMSSMXSSXAAXXXSMSAAAASAXXAMMMSAMXMSAMXMMMMAMXMSXMASMMMMSMMAAASAMMXMSMSSMXS +SMSAXMAMXXXAXMXASASMMMMSMMSMMXAAAASAMSXMMXMMASAMSSXMSSMMSXMSASXMMXMAXAASMMMMSMMAXXSMXMSAMXMAMAXMAMAMXMSAXAASMMSXMAASMXSXXMXSMMXMASAAXXASAMMA +MAMXSMXMAXSXSASASASAMAAXMAAXXMMMMMXMMSMAXAMSMMASMSAAAMAAXAMMMMAAXAMMSAMMAXMXAAMMMMMSMSXAXMMMMSMSAMXXAXSMSSMSAAMASXMAAAXMMSAMXSXSXMMXSXMMAMAM +MMMMMMSMMMMAXXMXMXMASMSMMSSSMSSSMMSSMMAMAXMAASMMASMMMSMMSMMAAXMMMSMAMMMMXMSSSSMXMAAASMXSASAMXXASXXXXMXMMAXAXMASASMSSMMSXAMXSAMMMSMASMXSSSMSX +AXASAAXSAAMMMXMASASMAAXXAMAMXAAAAXAAAMMMAMSSMMMMAMXSXSAMAMSSMSAMAXMXMAXXSAMAMXAASMSXSMAXAXASAMXMASMMSASXXMSMXXMASAMXAMXMSMAMAMAXAXMAXAMAAAXA +XSMSMSMXSSSSXXSASXSAMAXMMXMSSMSMMMSSMSAMAMAXMAMMMSAMXSAXXXAMXAAMSMXAMSSMMXXAMXXAMAXMSMMSSMAMMMMMAMAAXAMXXXMMSMMMMAMSXMASAMASASMSMXXMMSMSMMAS +XXASMMMMAMAMSAMXSXSAXASXXSAAXMXXXAXAASMSMSSMSASAAMMMAXXMSMMSSMMMXAMXMMAMXSXMASMMMAXAXMXAAXSMSMSMAMMMMSMXMASAXMAASAMXMXMSASMXMAAXXMSAMXAAXMAM +MMMMMAAMAMAMASXXMASXMASAAMMMSMMXMMSMMMASAMAASMSMSSMMSSMAXAAAAAAMSSMMMSAMAMXMASASMSMMMMMSXMMAAXXXASAXXXAXXSMAMSSXSMMMSAMSXMASMMMSXXXAAMSMMMAS +MAMAMXXMXMSSMMSAMAMXSXMMMMMXMASXMXSXSMXMAMMMMAXMMMAAMAXMSMMXMMMXAAAXASXMAMAXAMAMAAMXAXMMMSMSMSASXSXSMSXSMMMSMAMXSASASAMXMMAMAAAAMSMMMMXAASAS +SASASMSMSMMAMAMMMSAAMXMAXAMSSXMXSAMXAMXAAMMXMSMMASMMSSMXXMSSSSSMMSSMMXXSMSMSXMXMAMMSMMMXAAAAXSASASMSASMMAAAXMAMXSAMMMMMAMMAXXXMASAAXSXXSMSAX +SASMSMSAAASAMMSXSAMXMASXSXSXMASAMASXSXSSMMXAXXAXASMMXMSAMXAAXAAMXMAAXMMMMAXXMSSXAXMMSMMMSSXMXMAMAMAMSMASMMSMSASAMAMASMSAMASMSSSSSXSMXMAXAMXM +MXMAXAMSMMMMXSAXAXSAAXXAAMSASAMXSAMXMAXAAMSXMMSMASXXAMMMXMASMSMMAXXMMMAAXXMXAXMAMSAAAMAMMXMSXMSMXMSMXMXSXAMASXMAMAMAXAAAXXMAAXXAMAXXAMAMAMXA +MAMMMMMAXMASMMMSMMSMSSMMMMSAMASMMMSASXSSMMSASAMMAMXSASAXXAAXAMXSASXMSSSMSASMSAMMMSMMXSASAAASAMXXXMMAMXASMXMMSASMMSSSMSMSMMSMMMMMMAMSMSSSMSXS +SXSAAXSASXXSASAMXMSAAMAAMMMXMAXMAMSAAAXMAXSAMASMASAMASMSXXMSAMXMMSAAMAAMSXXAMMMAAMASMSASMMMSAMASXSMASMMSAXSASXMASAAMAMXAAXMAXMAMMAMXAAAAASAM +SASMSMMSAMXSAMXSMXMMMSSMSXSSMSSSXMMXMAMMMMMAMAMXXSAMXMAXXXXSAMXSXSMMMMMMXXMSMSSMSSXMMMAMXMMSAMXXAXSMMXXMMMMASXSSMMSMSMSSSMSMMASXSMSMMMSMMMSM diff --git a/day4/part1.zig b/day4/part1.zig new file mode 100644 index 0000000..efc89cb --- /dev/null +++ b/day4/part1.zig @@ -0,0 +1,156 @@ +const std = @import("std"); +const print = std.debug.print; + +var file_buf: [140 * 141]u8 = undefined; +var matrice: [143][143]u8 = undefined; +const masks = [_][4][4]u8{ + [4][4]u8{ + [4]u8{ ' ', ' ', ' ', ' ' }, + [4]u8{ 'X', 'M', 'A', 'S' }, + [4]u8{ ' ', ' ', ' ', ' ' }, + [4]u8{ ' ', ' ', ' ', ' ' }, + }, + [4][4]u8{ + [4]u8{ ' ', ' ', ' ', ' ' }, + [4]u8{ 'S', 'A', 'M', 'X' }, + [4]u8{ ' ', ' ', ' ', ' ' }, + [4]u8{ ' ', ' ', ' ', ' ' }, + }, + [4][4]u8{ + [4]u8{ ' ', 'X', ' ', ' ' }, + [4]u8{ ' ', 'M', ' ', ' ' }, + [4]u8{ ' ', 'A', ' ', ' ' }, + [4]u8{ ' ', 'S', ' ', ' ' }, + }, + [4][4]u8{ + [4]u8{ ' ', 'S', ' ', ' ' }, + [4]u8{ ' ', 'A', ' ', ' ' }, + [4]u8{ ' ', 'M', ' ', ' ' }, + [4]u8{ ' ', 'X', ' ', ' ' }, + }, + [4][4]u8{ + [4]u8{ 'X', ' ', ' ', ' ' }, + [4]u8{ ' ', 'M', ' ', ' ' }, + [4]u8{ ' ', ' ', 'A', ' ' }, + [4]u8{ ' ', ' ', ' ', 'S' }, + }, + [4][4]u8{ + [4]u8{ 'S', ' ', ' ', ' ' }, + [4]u8{ ' ', 'A', ' ', ' ' }, + [4]u8{ ' ', ' ', 'M', ' ' }, + [4]u8{ ' ', ' ', ' ', 'X' }, + }, + [4][4]u8{ + [4]u8{ ' ', ' ', ' ', 'X' }, + [4]u8{ ' ', ' ', 'M', ' ' }, + [4]u8{ ' ', 'A', ' ', ' ' }, + [4]u8{ 'S', ' ', ' ', ' ' }, + }, + [4][4]u8{ + [4]u8{ ' ', ' ', ' ', 'S' }, + [4]u8{ ' ', ' ', 'A', ' ' }, + [4]u8{ ' ', 'M', ' ', ' ' }, + [4]u8{ 'X', ' ', ' ', ' ' }, + }, +}; + +pub fn main() !void { + const time_start = std.time.microTimestamp(); + + setMatrice('.'); + try fillMatrice(); + const total = countMask(); + + const time_end = std.time.microTimestamp(); + print("Total time: {d}μs\n", .{time_end - time_start}); + print("Total: {d}\n", .{total}); +} + +fn evaluate(mask: [4][4]u8, sub: [4][4]u8) bool { + var count: u3 = 0; + + for (mask, sub) |maskX, subX| { + for (maskX, subX) |maskY, subY| { + count += if (maskY == subY) 1 else 0; + } + } + + return count == 4; +} + +fn setMatrice(c: u8) void { + for (0..143) |x| { + for (0..143) |y| { + matrice[x][y] = c; + } + } +} + +fn fillMatrice() !void { + const file = try std.fs.cwd().openFile("day4/input", .{}); + defer file.close(); + + _ = try file.readAll(&file_buf); + + var iter = std.mem.split(u8, &file_buf, "\n"); + + var x: usize = 1; + while (iter.next()) |line| { + defer x += 1; + + for (line, 1..) |c, y| { + matrice[x][y] = c; + } + } +} + +fn countMask() u32 { + var total: u32 = 0; + + var iter = MatriceIterator.init(); + + while (iter.next()) |sub| { + for (masks) |mask| { + total += if (evaluate(mask, sub)) 1 else 0; + } + } + + return total; +} + +const MatriceIterator = struct { + x: u32 = 0, + y: u32 = 0, + return_buf: [4][4]u8 = undefined, + + fn init() MatriceIterator { + return MatriceIterator{}; + } + + fn next(self: *MatriceIterator) ?[4][4]u8 { + if (self.x == 139 and self.y == 139) return null; + self.y += 1; + if (self.y == 140) { + self.x += 1; + self.y = 0; + } + + for (self.x..(self.x + 4), 0..) |x, a| { + for (self.y..(self.y + 4), 0..) |y, b| { + self.return_buf[a][b] = matrice[x][y]; + } + } + + return self.return_buf; + } +}; + +test "evaluate" { + const toEval = [4][4]u8{ + [4]u8{ '.', '.', '.', '.' }, + [4]u8{ 'X', 'M', 'A', 'S' }, + [4]u8{ '.', '.', '.', '.' }, + [4]u8{ '.', '.', '.', '.' }, + }; + try std.testing.expect(evaluate(masks[0], toEval)); +} diff --git a/day4/part2.zig b/day4/part2.zig new file mode 100644 index 0000000..357e122 --- /dev/null +++ b/day4/part2.zig @@ -0,0 +1,118 @@ +const std = @import("std"); +const print = std.debug.print; + +var file_buf: [140 * 141]u8 = undefined; +var matrice: [142][142]u8 = undefined; +const masks = [_][3][3]u8{ + [3][3]u8{ + [3]u8{ 'M', ' ', 'S' }, + [3]u8{ ' ', 'A', ' ' }, + [3]u8{ 'M', ' ', 'S' }, + }, + [3][3]u8{ + [3]u8{ 'M', ' ', 'M' }, + [3]u8{ ' ', 'A', ' ' }, + [3]u8{ 'S', ' ', 'S' }, + }, + [3][3]u8{ + [3]u8{ 'S', ' ', 'S' }, + [3]u8{ ' ', 'A', ' ' }, + [3]u8{ 'M', ' ', 'M' }, + }, + [3][3]u8{ + [3]u8{ 'S', ' ', 'M' }, + [3]u8{ ' ', 'A', ' ' }, + [3]u8{ 'S', ' ', 'M' }, + }, +}; + +pub fn main() !void { + const time_start = std.time.microTimestamp(); + + setMatrice('.'); + try fillMatrice(); + const total = countMask(); + + const time_end = std.time.microTimestamp(); + print("Total time: {d}μs\n", .{time_end - time_start}); + print("Total: {d}\n", .{total}); +} + +fn evaluate(mask: [3][3]u8, sub: [3][3]u8) bool { + var count: u4 = 0; + + for (mask, sub) |maskX, subX| { + for (maskX, subX) |maskY, subY| { + count += if (maskY == subY) 1 else 0; + } + } + + return count == 5; +} + +fn setMatrice(c: u8) void { + for (0..142) |x| { + for (0..142) |y| { + matrice[x][y] = c; + } + } +} + +fn fillMatrice() !void { + const file = try std.fs.cwd().openFile("day4/input", .{}); + defer file.close(); + + _ = try file.readAll(&file_buf); + + var iter = std.mem.split(u8, &file_buf, "\n"); + + var x: usize = 1; + while (iter.next()) |line| { + defer x += 1; + + for (line, 1..) |c, y| { + matrice[x][y] = c; + } + } +} + +fn countMask() u32 { + var total: u32 = 0; + + var iter = MatriceIterator.init(); + + while (iter.next()) |sub| { + for (masks) |mask| { + total += if (evaluate(mask, sub)) 1 else 0; + } + } + + return total; +} + +const MatriceIterator = struct { + x: u32 = 0, + y: u32 = 0, + return_buf: [3][3]u8 = undefined, + + fn init() MatriceIterator { + return MatriceIterator{}; + } + + fn next(self: *MatriceIterator) ?[3][3]u8 { + if (self.x == 139 and self.y == 139) return null; + self.y += 1; + if (self.y == 140) { + self.x += 1; + self.y = 0; + } + + for (self.x..(self.x + 3), 0..) |x, a| { + for (self.y..(self.y + 3), 0..) |y, b| { + self.return_buf[a][b] = matrice[x][y]; + } + } + + return self.return_buf; + } +};