diff --git a/R/.Rproj.user/shared/notebooks/paths b/R/.Rproj.user/shared/notebooks/paths index 9d7ed7d..ba3b65e 100644 --- a/R/.Rproj.user/shared/notebooks/paths +++ b/R/.Rproj.user/shared/notebooks/paths @@ -11,6 +11,8 @@ /Users/hrbrmstr/Development/2020-code-advent/R/06.R="E6CEEABC" /Users/hrbrmstr/Development/2020-code-advent/R/06.py="6D546EAC" /Users/hrbrmstr/Development/2020-code-advent/R/07.R="ACB3EB6E" +/Users/hrbrmstr/Development/2020-code-advent/R/08.R="C58FF7C9" +/Users/hrbrmstr/Development/2020-code-advent/R/09.R="22A71914" /Users/hrbrmstr/Development/2020-code-advent/README.md="74DC8DCF" /Users/hrbrmstr/Development/2020-code-advent/Swift/2020-code-advent.playground/Sources/05-01.swift="8E24EF14" /Users/hrbrmstr/Development/2020-code-advent/input/01-01.txt="53BE9636" @@ -18,6 +20,7 @@ /Users/hrbrmstr/Development/2020-code-advent/input/03-01.txt="3353A6D2" /Users/hrbrmstr/Development/2020-code-advent/input/04-01.txt="C5B6BCAC" /Users/hrbrmstr/Development/2020-code-advent/input/06-01.txt="F27C3C93" +/Users/hrbrmstr/Development/2020-code-advent/input/08-01.txt="2702751C" /Users/hrbrmstr/Development/2020-code-advent/js/01.js="77D3BDB6" /Users/hrbrmstr/Development/2020-code-advent/js/02.js="BC8B36A1" /Users/hrbrmstr/Development/2020-code-advent/js/03.js="E24752E6" @@ -25,4 +28,4 @@ /Users/hrbrmstr/Development/2020-code-advent/js/05.js="AFC9E61D" /Users/hrbrmstr/Development/2020-code-advent/scala/01/01/src/main/scala/Main.scala="8F03A1D5" /Users/hrbrmstr/Development/2020-code-advent/scala/02/02/src/main/scala/Main.scala="418A1A5F" -/private/tmp/test.txt="DFC19AA4" +/private/tmp/test.txt="1CB0AD22" diff --git a/R/08.R b/R/08.R new file mode 100644 index 0000000..0e8a475 --- /dev/null +++ b/R/08.R @@ -0,0 +1,162 @@ +# --- Day 8: Handheld Halting --- +# +# Your flight to the major airline hub reaches cruising altitude without +# incident. While you consider checking the in-flight menu for one of those +# drinks that come with a little umbrella, you are interrupted by the kid +# sitting next to you. +# +# Their handheld game console won't turn on! They ask if you can take a look. +# +# You narrow the problem down to a strange infinite loop in the boot code +# (your puzzle input) of the device. You should be able to fix it, but first +# you need to be able to run the code in isolation. +# +# The boot code is represented as a text file with one instruction per line of +# text. Each instruction consists of an operation (acc, jmp, or nop) and an +# argument (a signed number like +4 or -20). +# +# acc increases or decreases a single global value called the accumulator by +# the value given in the argument. For example, acc +7 would increase the +# accumulator by 7. The accumulator starts at 0. After an acc instruction, +# the instruction immediately below it is executed next. +# jmp jumps to a new instruction relative to itself. The next instruction to +# execute is found using the argument as an offset from the jmp instruction; +# for example, jmp +2 would skip the next instruction, jmp +1 would +# continue to the instruction immediately below it, and jmp -20 would +# cause the instruction 20 lines above to be executed next. +# nop stands for No OPeration - it does nothing. The instruction immediately +# below it is executed next. +# +# For example, consider the following program: +# +# nop +0 +# acc +1 +# jmp +4 +# acc +3 +# jmp -3 +# acc -99 +# acc +1 +# jmp -4 +# acc +6 +# +# These instructions are visited in this order: +# +# nop +0 | 1 +# acc +1 | 2, 8(!) +# jmp +4 | 3 +# acc +3 | 6 +# jmp -3 | 7 +# acc -99 | +# acc +1 | 4 +# jmp -4 | 5 +# acc +6 | +# +# First, the nop +0 does nothing. Then, the accumulator is increased from +# 0 to 1 (acc +1) and jmp +4 sets the next instruction to the other acc +1 +# near the bottom. After it increases the accumulator from 1 to 2, jmp -4 +# executes, setting the next instruction to the only acc +3. It sets the +# accumulator to 5, and jmp -3 causes the program to continue back at the +# first acc +1. +# +# This is an infinite loop: with this sequence of jumps, the program will +# run forever. The moment the program tries to run any instruction a second +# time, you know it will never terminate. +# +# Immediately before the program would run an instruction a second time, the +# value in the accumulator is 5. +# +# Run your copy of the boot code. Immediately before any instruction is +# executed a second time, what value is in the accumulator? + +library(tidyverse) + +input <- "../input/08-01.txt" + +read_delim( + file = input, + delim = " ", + col_names = c("instr", "value"), + col_types = "cd" +) %>% + mutate( + visits = 0 + ) -> asm + +curr <- 1 +accumulator <- 0 + +while (all(asm$visits < 2)) { + + asm$visits[curr] <- asm$visits[curr] + 1 + + switch( + asm$instr[curr], + "nop" = curr + 1, + "acc" = curr + 1, + "jmp" = curr + asm[curr,]$value + ) -> nxt + + if (nxt > nrow(asm)) break + + if ((asm$visits[curr] < 2) && (asm$instr[curr] == "acc")) { + accumulator <- accumulator + asm$value[curr] + } + + curr <- nxt + +} + +# 08-02 ------------------------------------------------------------------- + +read_delim( + file = input, + delim = " ", + col_names = c("instr", "value"), + col_types = "cd" +) %>% + mutate( + visits = 0 + ) -> asm + +orig_program <- asm + +for (run in seq_len(nrow(asm))) { + + asm <- orig_program + + curr <- 1 + accumulator <- 0 + + switch( + asm$instr[run], + "acc" = "acc", + "nop" = "jmp", + "jmp" = "nop" + ) -> asm$instr[run] + + while (all(asm$visits < 2)) { + + asm$visits[curr] <- asm$visits[curr] + 1 + + switch( + asm$instr[curr], + "acc" = curr + 1, + "nop" = curr + 1, + "jmp" = curr + asm[curr,]$value + ) -> nxt + + if (nxt > nrow(asm)) break + + if ((asm$visits[curr] < 2) && (asm$instr[curr] == "acc")) { + accumulator <- accumulator + asm$value[curr] + } + + curr <- nxt + + } + + if (all(asm$visits < 2)) break + +} + +accumulator diff --git a/R/09.R b/R/09.R new file mode 100644 index 0000000..db58c4a --- /dev/null +++ b/R/09.R @@ -0,0 +1,149 @@ +# --- Day 9: Encoding Error --- +# +# With your neighbor happily enjoying their video game, you turn your attention +# to an open data port on the little screen in the seat in front of you. +# +# Though the port is non-standard, you manage to connect it to your computer +# through the clever use of several paperclips. Upon connection, the port +# outputs a series of numbers (your puzzle input). +# +# The data appears to be encrypted with the eXchange-Masking Addition System +# (XMAS) which, conveniently for you, is an old cypher with an important weakness. +# +# XMAS starts by transmitting a preamble of 25 numbers. After that, each number +# you receive should be the sum of any two of the 25 immediately previous +# numbers. The two numbers will have different values, and there might be more +# than one such pair. +# +# For example, suppose your preamble consists of the numbers 1 through 25 in a +# random order. To be valid, the next number must be the sum of two of those numbers: +# +# 26 would be a valid next number, as it could be 1 plus 25 (or many other pairs, like 2 and 24). +# 49 would be a valid next number, as it is the sum of 24 and 25. +# 100 would not be valid; no two of the previous 25 numbers sum to 100. +# 50 would also not be valid; although 25 appears in the previous 25 numbers, the two numbers in the pair must be different. +# +# Suppose the 26th number is 45, and the first number (no longer an option, +# as it is more than 25 numbers ago) was 20. Now, for the next number to be +# valid, there needs to be some pair of numbers among 1-19, 21-25, or 45 that +# add up to it: +# +# 26 would still be a valid next number, as 1 and 25 are still within the previous 25 numbers. +# 65 would not be valid, as no two of the available numbers sum to it. +# 64 and 66 would both be valid, as they are the result of 19+45 and 21+45 respectively. +# +# Here is a larger example which only considers the previous 5 numbers (and has a preamble of length 5): +# +# 35 +# 20 +# 15 +# 25 +# 47 +# 40 +# 62 +# 55 +# 65 +# 95 +# 102 +# 117 +# 150 +# 182 +# 127 +# 219 +# 299 +# 277 +# 309 +# 576 +# +# In this example, after the 5-number preamble, almost every number is the sum +# of two of the previous 5 numbers; the only number that does not follow this +# rule is 127. +# +# The first step of attacking the weakness in the XMAS data is to find the +# first number in the list (after the preamble) which is not the sum of two of +# the 25 numbers before it. What is the first number that does not have this +# property? + +library(tidyverse) + +test_input <- c(35, 20, 15, 25, 47, 40, 62, 55, 65, 95, 102, 117, 150, 182, 127, 219, 299, 277, 309, 576) + +# input <- test_input +input <- as.numeric(read_lines("../input/09-01.txt")) + +# preamble_length <- 5 +preamble_length <- 25 +window <- 1:preamble_length +input_start <- preamble_length + 1 +no_sum_found <- TRUE + +while(no_sum_found && (length(input)>=(preamble_length + 1))) { + + as.data.frame(t(combn(window, 2))) %>% + mutate( + val1 = input[V1], + val2 = input[V2], + sum = input[V1] + input[V2] + ) -> pair_sums + + no_sum_found <- any(pair_sums$sum == input[input_start]) + + if (no_sum_found) input <- tail(input, -1) + +} + +(invalid <- input[input_start]) + + +# --- Part Two --- +# +# The final step in breaking the XMAS encryption relies on the invalid number +# you just found: you must find a contiguous set of at least two numbers in +# your list which sum to the invalid number from step 1. +# +# Again consider the above example: +# +# 35 +# 20 +# 15 +# 25 +# 47 +# 40 +# 62 +# 55 +# 65 +# 95 +# 102 +# 117 +# 150 +# 182 +# 127 +# 219 +# 299 +# 277 +# 309 +# 576 +# +# In this list, adding up all of the numbers from 15 through 40 produces the +# invalid number from step 1, 127. (Of course, the contiguous set of numbers +# in your actual list might be much longer.) +# +# To find the encryption weakness, add together the smallest and largest +# number in this contiguous range; in this example, these are 15 and 47, +# producing 62. +# +# What is the encryption weakness in your XMAS-encrypted list of numbers? +# s +# 09-02 ------------------------------------------------------------------- + +# input <- test_input +input <- as.numeric(read_lines("../input/09-01.txt")) + +for (i in seq_along(input)) { + + csum <- cumsum(input[i:length(input)]) + if (any(csum == invalid)) break + +} + +sum(range(input[i:(i+which(csum == invalid)-1)])) diff --git a/input/08-01.txt b/input/08-01.txt new file mode 100644 index 0000000..2bfc3b3 --- /dev/null +++ b/input/08-01.txt @@ -0,0 +1,610 @@ +acc +0 +jmp +516 +acc -16 +nop +326 +jmp +366 +jmp +400 +jmp +494 +acc -5 +jmp +475 +acc +29 +nop +24 +jmp +186 +jmp -5 +acc +50 +acc +49 +acc +49 +nop +507 +jmp +236 +acc -4 +acc +50 +acc +48 +jmp +293 +jmp +461 +acc +48 +acc +2 +jmp +241 +acc +38 +jmp +544 +jmp +1 +jmp +382 +acc -4 +acc -10 +acc +44 +jmp +444 +jmp +1 +acc +20 +acc -1 +acc +25 +jmp +332 +acc +18 +jmp +184 +acc +1 +acc +20 +acc -7 +acc -12 +jmp +84 +acc +30 +jmp -19 +nop +491 +acc +37 +acc +44 +jmp +220 +acc +3 +acc +19 +jmp +485 +jmp +222 +nop +264 +acc +4 +jmp +151 +nop -36 +acc +48 +jmp +356 +acc +28 +acc +29 +nop +397 +jmp +168 +nop +115 +acc -13 +acc -11 +jmp +470 +jmp +201 +acc +48 +acc -6 +acc -18 +acc -13 +jmp +442 +jmp +266 +acc +10 +acc +30 +acc -7 +acc -8 +jmp +380 +acc +1 +nop +106 +acc +9 +acc -11 +jmp -79 +jmp +166 +acc -9 +jmp +300 +acc +39 +acc +1 +acc +27 +acc +26 +jmp +367 +jmp +291 +acc +18 +jmp +100 +acc +25 +acc +43 +acc -8 +acc -12 +jmp +475 +acc +15 +jmp +492 +acc -5 +acc -12 +acc +35 +acc +25 +jmp +360 +nop +301 +acc +32 +acc -1 +jmp +436 +acc +21 +jmp +109 +acc +1 +nop +230 +jmp -113 +acc +24 +acc +12 +acc +13 +acc +27 +jmp -52 +jmp +476 +acc +15 +acc -18 +acc -13 +jmp +323 +acc -10 +acc +35 +acc -6 +nop +377 +jmp +8 +jmp +430 +nop +50 +acc +33 +acc -1 +jmp -72 +acc -19 +jmp -92 +jmp +1 +jmp -87 +nop -120 +nop -34 +jmp +159 +jmp +183 +jmp +1 +acc -4 +acc +49 +acc -4 +jmp +73 +acc -18 +acc +34 +acc -8 +jmp +403 +acc +32 +acc +0 +acc +0 +jmp +390 +acc +19 +jmp +305 +acc -15 +jmp +176 +acc +3 +jmp +36 +acc +29 +acc +21 +jmp +1 +acc -17 +jmp +144 +acc +16 +acc +4 +acc +49 +acc -7 +jmp -65 +acc +28 +acc +2 +acc +23 +acc +46 +jmp +278 +jmp +424 +acc +45 +acc +7 +jmp -49 +jmp -50 +acc -11 +nop -121 +jmp -140 +jmp +1 +acc -8 +jmp +206 +acc -7 +jmp +1 +acc +20 +acc +30 +jmp +375 +nop +312 +jmp +111 +acc +23 +jmp -15 +acc +27 +acc +46 +acc +36 +jmp +360 +acc +1 +acc +25 +acc +29 +jmp -137 +jmp +177 +acc +15 +acc -13 +acc +48 +acc +29 +jmp +76 +nop -174 +acc +27 +jmp +214 +acc +4 +jmp +120 +nop -165 +acc -16 +jmp +2 +jmp +238 +jmp +224 +jmp -154 +acc +12 +jmp +162 +acc +31 +acc +26 +acc -13 +acc +18 +jmp +173 +acc +38 +jmp +1 +jmp +199 +jmp -202 +jmp +127 +acc -12 +jmp -42 +acc -12 +acc +36 +acc -4 +acc +24 +jmp +343 +acc -17 +nop +277 +acc +13 +jmp +56 +jmp +41 +nop +92 +acc +32 +jmp +182 +nop +111 +acc +0 +acc +29 +jmp +219 +nop -234 +acc +0 +acc +31 +acc +49 +jmp +216 +jmp +247 +acc +24 +acc -10 +jmp +218 +acc +14 +acc -19 +acc +14 +jmp +11 +jmp +82 +acc +5 +acc +28 +acc +35 +jmp -93 +acc +24 +jmp -210 +acc +39 +jmp -107 +jmp -150 +acc -7 +jmp -185 +acc +25 +acc -15 +jmp +63 +acc +14 +acc +50 +jmp -7 +acc +13 +jmp +298 +nop +69 +jmp -268 +acc -5 +jmp +66 +jmp +48 +nop -1 +acc +38 +acc +3 +acc +46 +jmp +259 +nop +235 +acc +4 +jmp -186 +jmp +94 +acc -16 +acc +6 +jmp +287 +acc -19 +jmp -221 +jmp -69 +acc +8 +nop -102 +acc +31 +jmp +204 +jmp -81 +acc +12 +acc +21 +acc -8 +nop +151 +jmp -155 +acc +50 +nop +145 +acc -6 +acc +0 +jmp -296 +acc +16 +acc +30 +acc +11 +jmp +254 +acc +0 +acc -8 +nop +162 +acc -17 +jmp -144 +acc +6 +acc +2 +acc +32 +acc -5 +jmp +21 +jmp -77 +acc +38 +jmp +117 +acc +27 +acc -11 +nop -203 +jmp +201 +jmp -305 +acc +40 +nop -330 +acc -7 +jmp -279 +jmp +60 +nop -163 +jmp -53 +nop +115 +acc +24 +jmp +1 +acc +45 +jmp -92 +acc +0 +acc +13 +jmp -302 +acc +25 +jmp +208 +nop -293 +jmp +5 +jmp +1 +acc -13 +nop -272 +jmp +62 +acc -4 +acc +32 +acc +49 +jmp -124 +acc -19 +nop -246 +jmp -353 +nop -349 +acc +13 +acc +21 +jmp -165 +acc +14 +acc +37 +nop +28 +acc +7 +jmp -308 +acc +11 +jmp +71 +jmp -139 +nop -19 +acc -7 +acc -3 +jmp -302 +acc -2 +acc +1 +nop -43 +jmp -280 +acc +10 +acc +9 +jmp -358 +acc +39 +acc +16 +acc -11 +jmp +1 +jmp +142 +acc -15 +acc -17 +acc +9 +acc +11 +jmp -172 +jmp -90 +nop +135 +acc -1 +jmp -379 +acc +39 +acc -13 +jmp -57 +acc -3 +acc -7 +jmp +1 +jmp +80 +acc +7 +acc +11 +acc +30 +nop +69 +jmp -140 +acc +11 +acc +7 +acc +3 +jmp -417 +jmp -314 +acc -6 +jmp -6 +jmp -224 +acc +0 +jmp -131 +acc +7 +acc +33 +jmp +20 +acc +32 +acc -14 +nop -375 +jmp -394 +acc +8 +acc +47 +acc +29 +acc -6 +jmp -381 +acc -8 +jmp -353 +jmp -108 +acc -16 +acc +21 +jmp -329 +acc +13 +acc +0 +acc +0 +jmp -402 +acc -8 +jmp -307 +jmp -308 +jmp -358 +acc +38 +acc -19 +acc +33 +jmp -276 +jmp -114 +acc -6 +jmp +55 +acc +16 +jmp -244 +nop +22 +acc -7 +acc +19 +jmp -154 +jmp +18 +jmp -50 +acc +31 +acc +50 +acc +2 +jmp -260 +acc -16 +jmp -135 +acc +50 +acc -9 +acc +50 +acc +27 +jmp -323 +acc +26 +nop -249 +acc +46 +acc +3 +jmp -474 +acc +50 +acc -7 +jmp -78 +jmp +1 +acc -6 +acc +6 +jmp +94 +acc +47 +acc -3 +acc +13 +jmp -485 +nop -499 +acc +35 +acc +35 +acc -1 +jmp -259 +nop -486 +acc +48 +acc -4 +jmp +23 +acc +33 +acc +37 +acc +10 +jmp +61 +acc -1 +jmp +1 +jmp +1 +acc -8 +jmp +61 +jmp -237 +jmp -164 +acc +39 +acc +38 +nop -302 +jmp -468 +acc -15 +jmp -6 +acc -9 +acc +1 +acc +41 +acc +48 +jmp -285 +acc +1 +acc +24 +jmp -111 +jmp -90 +acc +46 +acc +21 +acc +43 +jmp -103 +acc -9 +nop -5 +jmp -274 +acc -13 +jmp -262 +jmp -39 +acc +43 +nop -463 +acc +15 +acc +23 +jmp -176 +nop -305 +acc +2 +acc +28 +jmp -198 +acc +15 +acc -18 +jmp -473 +acc -13 +acc +9 +jmp -46 +acc +1 +acc +43 +acc +6 +jmp +10 +acc +24 +acc -3 +jmp -424 +acc -1 +acc +47 +jmp +1 +acc +20 +jmp -17 +jmp -59 +nop -19 +acc +42 +acc +47 +jmp -9 +jmp -576 +nop -148 +acc +0 +jmp +12 +acc -15 +jmp -209 +acc +13 +jmp -442 +nop -548 +nop -62 +acc +22 +jmp -92 +jmp -516 +acc +8 +jmp -301 +acc +1 +jmp -146 +acc -15 +jmp -366 +jmp -440 +acc +17 +acc +25 +acc +28 +jmp -240 +acc -2 +acc +25 +nop -68 +acc +14 +jmp +1 \ No newline at end of file diff --git a/input/09-01.txt b/input/09-01.txt new file mode 100644 index 0000000..16f2293 --- /dev/null +++ b/input/09-01.txt @@ -0,0 +1,1000 @@ +26 +36 +37 +9 +8 +22 +41 +5 +17 +44 +40 +31 +10 +33 +30 +50 +24 +4 +12 +46 +39 +45 +42 +7 +27 +13 +58 +11 +14 +53 +9 +15 +23 +18 +16 +21 +17 +49 +19 +20 +32 +31 +22 +30 +24 +35 +28 +33 +25 +47 +57 +26 +27 +29 +83 +34 +37 +36 +59 +46 +39 +51 +44 +54 +56 +48 +49 +100 +62 +50 +52 +72 +53 +55 +60 +96 +61 +91 +65 +70 +85 +87 +88 +114 +83 +113 +92 +93 +97 +104 +142 +99 +102 +103 +153 +105 +108 +115 +116 +148 +144 +152 +177 +135 +167 +171 +201 +256 +182 +176 +252 +185 +190 +196 +203 +202 +348 +240 +208 +292 +213 +300 +323 +301 +315 +367 +302 +502 +393 +357 +353 +358 +390 +760 +361 +375 +492 +710 +398 +405 +448 +509 +421 +594 +505 +566 +810 +690 +603 +924 +655 +1317 +711 +823 +714 +1171 +719 +736 +759 +1080 +773 +803 +819 +953 +1528 +869 +1195 +1522 +1071 +1509 +1169 +2270 +1314 +1514 +1369 +1366 +1425 +1430 +2620 +2125 +1455 +1830 +1495 +1532 +4045 +1576 +1622 +2397 +1822 +2501 +3331 +2240 +2385 +2664 +2942 +2483 +2680 +2683 +6285 +2791 +2796 +2855 +2987 +4522 +2950 +3108 +3198 +3317 +4207 +3398 +3816 +5031 +4809 +4062 +4868 +4625 +5667 +5049 +5338 +5163 +5587 +5363 +7318 +6506 +5646 +5651 +7405 +5937 +7214 +9874 +6306 +10612 +7379 +11586 +9708 +9179 +15648 +8871 +8687 +16263 +9674 +10212 +10387 +15046 +15901 +19548 +11009 +31549 +40236 +11297 +18965 +13151 +17087 +19920 +16014 +22320 +17766 +16558 +17558 +30262 +17866 +18361 +19083 +19984 +19886 +33617 +39878 +21396 +26343 +22306 +24448 +24160 +27311 +27855 +63879 +29165 +35097 +32572 +47775 +33572 +34324 +40072 +57630 +35919 +53325 +36227 +37444 +38969 +44046 +41282 +45844 +43702 +45556 +58020 +46466 +48608 +51471 +55166 +94135 +80653 +70016 +66144 +70243 +80251 +83910 +76413 +72146 +73363 +77509 +88915 +73671 +103576 +99302 +84984 +188560 +89258 +181085 +92022 +95074 +97937 +136160 +158162 +128529 +136387 +143379 +138290 +168180 +142389 +157273 +145509 +149776 +147034 +169531 +158655 +162586 +162929 +191324 +281669 +174242 +258003 +187195 +187096 +189959 +193011 +226466 +264689 +264916 +266819 +274677 +389395 +301044 +287898 +320202 +292543 +308095 +342787 +309620 +480909 +321584 +325515 +438931 +374291 +361338 +361437 +532680 +377055 +419477 +382970 +607476 +491155 +684166 +531735 +541496 +635135 +602163 +1216846 +580441 +600638 +744992 +617715 +631204 +1022890 +647099 +686952 +686853 +722775 +735629 +738393 +738492 +1271073 +1903798 +1067136 +874125 +1032651 +1149450 +1073231 +1353344 +1121937 +1181079 +1613092 +1231842 +1198156 +1750088 +1248919 +1264814 +1278303 +1333952 +2436941 +2590651 +1805529 +1458404 +2222681 +2936449 +1941261 +1906776 +1947356 +2105882 +2980007 +2872025 +2195168 +2455889 +2320093 +2303016 +2379235 +2429998 +2447075 +2707323 +2513733 +2736707 +2543117 +3263933 +5086558 +3365180 +4136429 +3399665 +3405760 +4053238 +4863210 +3848037 +3854132 +4485117 +4758905 +4498184 +4515261 +4574403 +4816749 +4623109 +4682251 +4826310 +5807050 +4960808 +5056850 +5250440 +8422030 +5908297 +6629113 +6764845 +7219312 +9361394 +7897849 +7253797 +8422440 +8717342 +9932691 +8339249 +9138370 +12962358 +10489301 +13383248 +9631253 +9439858 +9305360 +16126239 +9787118 +10017658 +10211248 +16392167 +14611834 +13393958 +17152003 +15104094 +16615191 +14473109 +15151646 +15593046 +19950349 +17056591 +18936613 +25032904 +17477619 +18443730 +19071111 +27108872 +19226976 +18745218 +31230333 +19516608 +19804776 +36342516 +20228906 +23605206 +27867067 +31668425 +31837688 +36844097 +35101995 +43969517 +29624755 +36704595 +32649637 +35500321 +34534210 +36414232 +35921349 +38298087 +37188948 +68010941 +38974124 +62714735 +38261826 +39321384 +39745514 +64726750 +43834112 +48095973 +60309801 +130725676 +61293180 +67183847 +66329350 +62274392 +87841487 +110163462 +99283925 +72689269 +70034531 +70455559 +75388356 +73110297 +75450774 +76163072 +77235950 +149484846 +77583210 +78007340 +79066898 +132308923 +127001142 +114425323 +131748739 +133982449 +123567572 +134403477 +128603742 +132729951 +137662748 +140490090 +104054607 +145799566 +148038769 +232658349 +143565856 +148498653 +200111439 +179505381 +153399022 +154819160 +155590550 +202634470 +157074238 +213470375 +218479930 +248407772 +238458084 +310409710 +272066225 +227622179 +252093376 +289365422 +286161401 +258873767 +396446541 +247620463 +439560423 +291604625 +430256649 +406912536 +382441339 +308218182 +395532322 +402439623 +311893398 +466080263 +359708708 +370544613 +446102109 +648736579 +479715555 +499688404 +475242642 +530939992 +575526823 +545035168 +506494230 +577766026 +539225088 +986209785 +555838645 +599822807 +603498023 +620111580 +671602106 +667926890 +990656193 +861612585 +730253321 +682438011 +805810817 +834951350 +925817664 +921344751 +954958197 +1133604671 +1006182634 +1014467730 +1062332875 +1432311894 +1045719318 +1868143692 +1223609603 +1095063733 +1609680657 +1155661452 +1203320830 +1271424913 +1545929244 +1339528996 +1488248828 +1608255675 +1731628481 +1565204671 +1744770886 +1939415488 +1756296101 +1932000298 +2179323989 +2000677515 +3476399367 +2571387305 +2250725185 +2108052193 +2317144231 +2904733667 +2298384563 +4230384861 +3695711589 +4503387603 +6248158489 +2474745743 +3003053394 +2827777824 +2947784671 +3935620090 +5936297605 +3296833152 +4040052491 +3501066987 +3688296399 +5155458852 +4406436756 +5007101813 +4549109748 +4358777378 +5078503009 +4425196424 +4582797936 +4615528794 +6163042142 +6234004653 +5302523567 +5422530414 +5477799137 +5975812730 +5771578895 +5830831218 +6124610976 +11398343144 +17522954120 +6797900139 +6985129551 +8990819966 +9971640162 +8113492823 +8765214134 +8783973802 +8907887126 +8941575314 +10591341524 +9040725218 +9007994360 +10558610666 +9918052361 +10725053981 +14889825110 +14838825578 +10900329551 +16956769713 +11602410113 +13783029690 +11955442194 +20739415996 +16769540301 +15750343685 +14911392962 +15769103353 +16878706957 +16897466625 +17805939352 +17549187936 +23897819470 +18048719578 +17949569674 +18926046721 +18958777579 +19566605026 +20476663027 +25811722513 +38736645048 +22502739664 +22855771745 +27797796176 +23557852307 +25385439803 +26866835156 +27705785879 +55615352005 +42422376771 +30661736647 +30680496315 +32647810310 +33776173582 +34847036299 +35755509026 +43360910449 +45825612735 +45747365850 +63775182409 +38492651747 +38525382605 +42069344690 +64925116435 +45358511409 +46060591971 +46413624052 +80205547708 +48943292110 +64456669897 +52252274959 +54572621035 +66198437626 +61342232962 +63309546957 +63328306625 +65527532614 +81853562196 +68623209881 +104020184361 +129148839818 +80561996437 +77018034352 +84272748455 +80594727295 +83851163156 +110870293949 +131951516506 +91419103380 +91772135461 +95003884081 +131590655387 +143871543394 +103515913145 +119029290932 +106824895994 +145991724415 +124651779919 +126869765576 +126637853582 +172139123026 +134150742495 +145641244233 +149185206318 +157580030789 +157612761647 +164445890451 +168123911611 +164867475750 +172013830675 +291083744033 +256010102312 +183191238841 +186422987461 +186776019542 +295176930733 +210340809139 +222545204077 +225854186926 +231476675913 +233462749576 +251289633501 +291505329332 +275823059900 +291730773284 +325736673258 +303221275022 +344356050331 +523207449197 +329626592322 +322058652098 +329313366201 +332991387361 +336881306425 +355205069516 +774497082698 +1000351269624 +617242002590 +373199007003 +397116828681 +448399391003 +432886013216 +454021879990 +457330862839 +509285809476 +484752383077 +613789425382 +567328389232 +567553833184 +594952048306 +625279927120 +632534641223 +1096555734796 +1373550276627 +994038192553 +776080532088 +662304753562 +669872693786 +1454373149614 +770315835684 +1110704144565 +806085020219 +821598398006 +827220886993 +830002841897 +1199863030455 +942083245916 +911352742829 +966616672315 +1052080772309 +1454133039229 +1276094178944 +1134882222416 +1389152231190 +1804754916202 +1619318119673 +1763681643922 +2203553118524 +1440188529470 +1492307595459 +1332177447348 +1483903151568 +2300504974019 +2141946276371 +2946440634688 +2216373118183 +1627683418225 +2449320961570 +2251943802764 +1741355584726 +1853435988745 +1877969415144 +2046234965245 +2018697444624 +3193907147392 +2410976401360 +2772365976818 +2524034453606 +2721329678538 +2816080598916 +4834778043540 +3119991013684 +2824485042807 +2924091681038 +2959860865573 +3185613436093 +3625849427939 +3594791573471 +4235070562807 +4574124052913 +4495555926815 +3369039002951 +3731405403889 +3993299387490 +3760053029350 +4264412390105 +6906532328175 +4064932409869 +4429673845984 +4935010854966 +6149883881545 +5245364132144 +5340115052522 +5645421359576 +6010098478900 +5748576723845 +5784345908380 +5883952546611 +7681169362908 +6145474301666 +11402088254990 +6963830576422 +7354844602821 +7362338390441 +8329344799974 +7100444406840 +7129092032301 +7491458433239 +7753352416840 +7824985439219 +10890785491720 +13429746086753 +8494606255853 +10683587578811 +10180374987110 +10585479184666 +11393998083421 +11088691776367 +11429767267956 +18558859300257 +11532922632225 +13826643664574 +12984396953451 +13245918708506 +15595050662693 +14064274983262 +14491430422742 +21575263508480 +14853796823680 +35401907173054 +53960766473311 +33005030776436 +15244810850079 +15578337856059 +18674981242963 +19080085440519 +54580294284916 +19178193834664 +20765854171776 +21674170961033 +26333502626446 +22926920715646 +22518459044323 +27008105124015 +28318074087316 +27737349131248 +32501624907537 +26230315661957 +37009889467065 +28555705406004 +28918071806942 +70158632140975 +45413588066965 +30098607673759 +30823148706138 +62600232581296 +41475126512036 +33919792093042 +34253319099022 +61261424223037 +38258279275183 +57180239814668 +39944048006440 +44192630005356 +44601091676679 +45445379759969 +52617066718082 +48748774706280 +64351926772781 +53967664793205 +56655420938190 +73519163483621 +109765514839746 +57473777212946 +85667756517392 +59016679480701 +60921756379897 +97274958755884 +126952159354077 +64742940799180 +72511598374205 +92561114724522 +68173111192064 \ No newline at end of file