diff --git a/2016/src/bin/2016_08a.rs b/2016/src/bin/2016_08a.rs index a750d24..1076fde 100644 --- a/2016/src/bin/2016_08a.rs +++ b/2016/src/bin/2016_08a.rs @@ -1,5 +1,5 @@ -const SCREEN_COLS: usize = 8; -const SCREEN_ROWS: usize = 3; +const SCREEN_COLS: usize = 50; +const SCREEN_ROWS: usize = 6; const SCREEN_SIZE: usize = SCREEN_COLS * SCREEN_ROWS; #[derive(Debug, Copy, Clone)] @@ -17,25 +17,35 @@ struct World { impl Actions { // rotate a column 1 time. - fn rotate_column(&self, column_index: u32, target: &mut [bool; SCREEN_SIZE]) { - let first_value = target[column_index as usize]; - let mut last_value = false; - for index in (0..SCREEN_COLS).rev() { - let offset = index as u32 * SCREEN_COLS as u32 + column_index; - let next_offset = offset + SCREEN_COLS as u32; - println!("index: {} offset: {} next_offset: {}", - index, offset, next_offset); - last_value = target[offset as usize]; - target[offset as usize] = last_value; + fn rotate_column(&self, column_index: usize, target: &mut [bool; SCREEN_SIZE]) { + // Save the bottom value (wrap-around) + let bottom = target[(SCREEN_ROWS - 1) * SCREEN_COLS + column_index]; + + // Shift everything down + for row in (1..SCREEN_ROWS).rev() { + let from = (row - 1) * SCREEN_COLS + column_index; + let to = row * SCREEN_COLS + column_index; + target[to] = target[from]; } + + // Put the old bottom value at the top + target[column_index] = bottom; } // rotate a row 1 time. fn rotate_row(&self, row_index: u32, target: &mut [bool; SCREEN_SIZE]) { - for index in (SCREEN_ROWS..0).rev() { - let offset = index as u32 * SCREEN_COLS as u32 + index as u32; - println!("index = {index} offset = {offset}"); - } + // Save the last element of the row + let rightmost = target[(row_index * SCREEN_COLS as u32 + (SCREEN_COLS - 1) as u32) as usize]; + + // Shift everything to the right + for col in (1..SCREEN_COLS).rev() { + let from = row_index * SCREEN_COLS as u32 + (col - 1) as u32; + let to = row_index * SCREEN_COLS as u32 + col as u32; + target[to as usize] = target[from as usize]; + } + + // Put the old rightmost value at the start + target[(row_index * SCREEN_COLS as u32) as usize] = rightmost; } pub fn apply(&self, target: &mut [bool; SCREEN_SIZE]) { @@ -61,7 +71,7 @@ impl Actions { let actual_rotate = distance_to_rotate % 6; println!("Rotate Column {column_to_rotate} by {distance_to_rotate} ({actual_rotate})"); for _ in 0..*distance_to_rotate { - self.rotate_column(*column_to_rotate, target) + self.rotate_column(*column_to_rotate as usize, target) } } } @@ -83,13 +93,27 @@ impl Actions { let (_, axis_to_rotate_s) = axis_stub.split_once('=').unwrap(); let distance_to_rotate = distance_to_rotate_s.parse::().unwrap(); let axis_to_rotate = axis_to_rotate_s.parse::().unwrap(); - Actions::RotateColumn(axis_to_rotate, distance_to_rotate) + match direction { + "column" => {Actions::RotateColumn(axis_to_rotate, distance_to_rotate)} + "row" => {Actions::RotateRow(axis_to_rotate, distance_to_rotate)} + _ => { unreachable!("Invalid rotation"); } + } } _ => { unreachable!("Invalid command -> [[{input}]]"); } } } + + pub fn num_lit(body: &[bool; SCREEN_SIZE]) -> u32 { + let mut num_lit = 0; + + for index in 0..SCREEN_SIZE { + if body[index] { num_lit += 1; } + } + + num_lit + } } @@ -97,28 +121,25 @@ fn dump_screen(to_display: &[bool; SCREEN_SIZE]) { for row in 0..SCREEN_ROWS { for column in 0..SCREEN_COLS { let offset = row * SCREEN_COLS + column; - // println!("Rendering offset {offset}"); print!("{}", if to_display[offset] { '#' } else { ' ' }); } println!(); } } +use core::read_data; + fn main() { let mut screen_space:[bool; SCREEN_SIZE] = [false; SCREEN_SIZE]; - let mut world = World { - width: 8, - height: 3, - memory: Box::new([false; 8*3]), - }; - let directions = vec![ "rect 3x2", "rotate column x=1 by 1", "rotate row y=0 by 4", "rotate column x=1 by 1" ]; + let binding = read_data("2016_08_data.txt"); + let directions = binding.lines(); for direction in directions { let parsed = Actions::parse(direction); @@ -126,6 +147,9 @@ fn main() { println!("[[{direction}]] -> [[{parsed:?}]]"); dump_screen(&screen_space); } + + println!("There are {} lit.", Actions::num_lit(&screen_space)); } - +// 106 lit. +// b> Code is CFLELOYFCS \ No newline at end of file diff --git a/2016/src/bin/2016_08b.rs b/2016/src/bin/2016_08b.rs new file mode 100644 index 0000000..f1c2964 --- /dev/null +++ b/2016/src/bin/2016_08b.rs @@ -0,0 +1,3 @@ +fn main() { + println!("The answer is CFLELOYFCS. Part A display showed that."); +} diff --git a/2016/src/bin/2016_09a.rs b/2016/src/bin/2016_09a.rs index cb932e6..e60333c 100644 --- a/2016/src/bin/2016_09a.rs +++ b/2016/src/bin/2016_09a.rs @@ -56,4 +56,4 @@ fn main() { } } -// 138735 ChatGPT held my hand through this as parsing text is not my strong point. \ No newline at end of file +// 138735 ChatGPT held my hand through this as parsing text is not my strong point. diff --git a/2016/src/bin/2016_09b.rs b/2016/src/bin/2016_09b.rs new file mode 100644 index 0000000..aca818d --- /dev/null +++ b/2016/src/bin/2016_09b.rs @@ -0,0 +1,59 @@ +use std::ptr::hash; +use core::read_data; +/// Calculate the decompressed length of a string. +/// If `recursive` is true, markers are expanded recursively (Part 2). +/// If `recursive` is false, markers are expanded only once (Part 1). +fn decompressed_len(input: &str, recursive: bool) -> usize { + let mut total = 0; + let mut i = 0; + let binding = input.to_ascii_uppercase(); + let bytes = binding.as_bytes(); + + while i < bytes.len() { + if bytes[i] == b'(' { + // find end of marker + let end = input[i..].find(')').unwrap() + i; + let marker = &input[i + 1..end]; + let (a, b) = marker.split_once('x').unwrap(); + let a: usize = a.parse().unwrap(); + let b: usize = b.parse().unwrap(); + i = end + 1; + + let segment = &input[i..i + a]; + let seg_len = if recursive { + decompressed_len(segment, true) + } else { + segment.len() + }; + total += seg_len * b; + i += a; + } else { + total += 1; + i += 1; + } + } + total +} + + +fn main() { + let puzzle_input = read_data("2016_09_data.txt"); + let params = vec![ + ("ADVENT", 6), + ("A(1x5)BC", 7), + ("(3x3)XYZ", 9), + ("A(2x2)BCD(2x2)EFG", 11), + ("(6x1)(1x3)A", 6), + ("X(8x2)(3x3)ABCY", 18), + (puzzle_input.as_str(), 100) + ]; + + for (input, size) in params { + + let decompressed_size = decompressed_len(input, true); + println!("Tested {} char string for expanded size of {} -> Calculated {}", input.len(), size, decompressed_size); + + } +} + +// 11125026826 ChatGPT held my hand through this as parsing text is not my strong point. diff --git a/2016/src/bin/2016_10a.rs b/2016/src/bin/2016_10a.rs new file mode 100644 index 0000000..75f994e --- /dev/null +++ b/2016/src/bin/2016_10a.rs @@ -0,0 +1,77 @@ +use std::collections::HashMap; +use core::read_data; +#[derive(Debug)] +enum InputLines { + Distribution { bot_id: u32, low_target: u32, high_target: u32 }, + Allocation { bot_id: u32, value: u32 }, +} + +struct Bot { + id: u32, + values: [u32; 2], + low_target: u32, + high_target: u32 +} + +impl Default for Bot { + fn default() -> Self { + Bot { + id: u32::MAX, + values: [u32::MAX; 2], + low_target: u32::MAX, + high_target: u32::MAX + } + } +} + +fn parse_line(input: &str) -> InputLines { + let parts: Vec<_> = input.split_whitespace().collect(); + + match parts[0] { + "bot" => { + InputLines::Distribution { + bot_id: parts[1].parse::().unwrap(), + low_target: parts[6].parse::().unwrap(), + high_target: parts[11].parse::().unwrap(), + } + } + "value" => { + InputLines::Allocation { + bot_id: parts[5].parse::().unwrap(), + value: parts[1].parse::().unwrap(), + } + } + _ => { unreachable!("") } + } +} + +fn main() { + let lines = "value 5 goes to bot 2\nbot 2 gives low to bot 1 and high to bot 0\nvalue 3 goes to bot 1\nbot 1 gives low to output 1 and high to bot 0\nbot 0 gives low to output 2 and high to output 0\nvalue 2 goes to bot 2"; + let lines = read_data("2016_10_data.txt"); + + let mut botmap: HashMap = HashMap::new(); + + for line in lines.lines() { + let parsed = parse_line(line); + match parse_line(line) { + InputLines::Distribution { bot_id, low_target, high_target } => { + // find the bot if it exists... + botmap.entry(bot_id).or_insert(Bot { id: bot_id, values: [0, 0], low_target, high_target } ); + } + InputLines::Allocation { bot_id, value: value_new } => { + botmap.entry(bot_id).or_insert(Bot { id: bot_id, values: [0, 0], low_target: 0, high_target: 0 } ); + } + } + } + println!("Botmap has {} entries.", botmap.keys().len()); + + + let mut num_2chips = 0; + for (key, bot) in botmap { + println!("Bot ID : {key} / {} & {}", bot.values[0], bot.values[1]); + if bot.values[0] != 0 && bot.values[1] != 0 { + num_2chips += 1; + } + } + println!("Found {num_2chips} bots with 2 chips."); +} diff --git a/2016/src/bin/2016_19a.rs b/2016/src/bin/2016_19a.rs new file mode 100644 index 0000000..0f117a7 --- /dev/null +++ b/2016/src/bin/2016_19a.rs @@ -0,0 +1,61 @@ +const NUM_ELVES: u32 = 3014603; + +fn next_elf_id(current_elf: u32, elves: &Vec) -> u32 { + let mut real_return_value: i32 = -1; + while real_return_value < 0 { + let mut working_next = if current_elf + 1 == NUM_ELVES { + 0 + } else { + current_elf + 1 + }; + + while elves[working_next as usize] == 0 { + working_next += 1; + if working_next == NUM_ELVES { + working_next = 0; + } + } + real_return_value = working_next as i32 + } + + real_return_value as u32 +} + +fn main() { + let mut elves = vec![1; NUM_ELVES as usize]; + let mut elf_with_presents = -1; + let mut num_loops = 0; + let mut num_with_presents = 0; + + while num_with_presents != 1 && num_loops < 80 { + for current_elf in 0..NUM_ELVES { + // if the elf has a present... + if elves[current_elf as usize] > 0 { + let next_elf_id = next_elf_id(current_elf, &elves); + // ...look at the next elf and take their presents. + let num_to_take = elves[next_elf_id as usize]; + elves[current_elf as usize] += num_to_take; + let new_total = elves[current_elf as usize]; + elves[next_elf_id as usize] = 0; + // println!("Elf {} took {} presents from {} and has {} now.", current_elf + 1, num_to_take, next_elf_id + 1, new_total); + } else { + // println!("Elf {} has no presents and is skipped.", current_elf + 1); + } + } + + let mut last_elf = -1i32; + num_with_presents = 0; + last_elf = 0; + for count_elf in 0..NUM_ELVES { + if elves[count_elf as usize] > 0 { + num_with_presents += 1; + last_elf = count_elf as i32; + } + } + println!("There are {num_with_presents} elves with presents. Last ID was {last_elf}"); + num_loops += 1; + } + // println!("Elves: {elves:?}"); +} +// 1834903 + diff --git a/2016/src/bin/2016_20a.rs b/2016/src/bin/2016_20a.rs new file mode 100644 index 0000000..8617990 --- /dev/null +++ b/2016/src/bin/2016_20a.rs @@ -0,0 +1,63 @@ +use std::arch::x86_64::__get_cpuid_max; +use std::io::{stdout, Write}; +use core::read_data; + +struct Firewall { + blocked_ranges: Vec<(u32, u32)> +} + +impl Firewall { + pub fn new() -> Self { + Firewall { blocked_ranges: vec![] } + } + + pub fn add_range(&mut self, min: u32, max: u32) { + self.blocked_ranges.push((min, max)); + } + + /// Check if the target IP is allowed. + pub fn valid(&self, target: u32) -> (bool, u32) { + let mut is_valid = true; + let mut return_max = target + 1; + + for (cmin, cmax) in self.blocked_ranges.clone() { + if target <= cmax && target >= cmin { + return_max = cmax; + is_valid = false + } + } + + (is_valid, return_max) + } + + pub fn add_range_str(&mut self, line: &str) { + let (new_min_s, new_max_s) = line.split_once('-').unwrap(); + self.blocked_ranges.push((new_min_s.parse::().unwrap(), new_max_s.parse::().unwrap())); + } +} + +fn main() { + let binding = read_data("2016_20_data.txt"); + let lines = binding.lines(); + // let lines = "5-8\n0-2\n4-7".lines(); + + let mut firewall = Firewall::new(); + + for line in lines { + firewall.add_range_str(line) + } + println!("Firewall has {} rules.", firewall.blocked_ranges.len()); + + let mut current_target = 0; + while current_target < i32::MAX { + let (check_result, next_id) = firewall.valid(current_target as u32); + if check_result { + println!("Rule for {current_target} passed."); + break + } + current_target = next_id as i32; + current_target += 1; + if current_target % 10000 == 0 { print!("."); stdout().flush().unwrap() } + } +} +// 4793564 \ No newline at end of file diff --git a/2016/src/bin/2016_20b.rs b/2016/src/bin/2016_20b.rs new file mode 100644 index 0000000..95427d9 --- /dev/null +++ b/2016/src/bin/2016_20b.rs @@ -0,0 +1,101 @@ +use std::collections::HashMap; +use std::io::{stdout, Write}; +use core::read_data; + +struct Firewall { + blocked_ranges: Vec<(u32, u32)>, +} + +impl Firewall { + pub fn new() -> Self { + Firewall { blocked_ranges: vec![] } + } + + pub fn add_range(&mut self, min: u32, max: u32) { + self.blocked_ranges.push((min, max)); + } + + /// Check if the target IP is allowed. + pub fn valid(&self, target: u32) -> bool { + let mut is_valid = true; + + for (cmin, cmax) in self.blocked_ranges.clone() { + if target <= cmax && target >= cmin { + is_valid = false + } + } + + is_valid + } + + pub fn add_range_str(&mut self, line: &str) { + let (new_min_s, new_max_s) = line.split_once('-').unwrap(); + self.blocked_ranges.push((new_min_s.parse::().unwrap(), new_max_s.parse::().unwrap())); + } + + pub fn sort_rules(&mut self) { + self.blocked_ranges.sort_by_key(|x| x.0) + } +} +use core::merge_ranges; +use core::format_with_commas; + +fn main() { + let binding = read_data("2016_20_data.txt"); + let lines = binding.lines(); + let mut firewall = Firewall::new(); + for line in lines { + print!("."); + stdout().flush().unwrap(); + firewall.add_range_str(line); + } + firewall.sort_rules(); + + println!("Found {} ranges.", firewall.blocked_ranges.len()); + let mut working_lines = vec![]; + + let mut index = 0; + + let mut last_num_rows = i32::MAX; + + while index < firewall.blocked_ranges.len() - 1 { + let r1 = firewall.blocked_ranges[index]; + let r2 = firewall.blocked_ranges[index + 1]; + let merge_result = merge_ranges(r1, r2); + match merge_result { + None => { + // println!("NO MERGE -> {}-{} / {}-{}", + // format_with_commas(r1.0), + // format_with_commas(r1.1), + // format_with_commas(r2.0), + // format_with_commas(r2.1)); + } + Some(merged) => { + // println!("MERGED -> {}-{} / {}-{} = {}-{}", + // format_with_commas(r1.0), + // format_with_commas(r1.1), + // format_with_commas(r2.0), + // format_with_commas(r2.1), + // format_with_commas(merged.0), + // format_with_commas(merged.1)); + working_lines.push(merged); + } + } + index += 1; + } + + println!("Went from {} to {}", firewall.blocked_ranges.len(), working_lines.len()); + + let mut num_blocked = 0u64; + let mut last_max = 0; + for index in 0..working_lines.len() { + let (cmin, cmax) = working_lines[index]; + num_blocked += (cmax - cmin) as u64; + last_max = cmax; + } + println!("Found {num_blocked} blocked."); + let allowed = last_max - num_blocked as u32; + println!("Found {allowed} permitted."); +} +// 852102276 too high +// 851631862 \ No newline at end of file diff --git a/2017/src/bin/2017_04a.rs b/2017/src/bin/2017_04a.rs index 59fab9e..6d4164d 100644 --- a/2017/src/bin/2017_04a.rs +++ b/2017/src/bin/2017_04a.rs @@ -9,27 +9,41 @@ // use std::collections::HashMap; +use std::str; use core::read_data; fn is_valid(input: &str) -> bool { + let mut is_valid = true; let parts = input.split(' '); - let mut working = HashMap::new(); + let expected_parts = parts.clone().count(); + let mut working: HashMap<&str, u32> = HashMap::new(); for part in parts { - working.entry(part); + *working.entry(part).or_insert(0); } - true + println!("Working has {} entries.", working.keys().len()); + expected_parts == working.keys().len() } fn main() { - // let binding = read_data("2017_04_data.txt"); + let binding = read_data("2017_04_data.txt"); let params = vec![ ("aa bb cc dd ee", true), ("aa bb cc dd aa", false), ("aa bb cc dd aaa", true) ]; + for (input, expected) in params { let actual = is_valid(input); - println!("||{input}|| was expected to be {expected} but was {actual}"); + println!("{}\t||{input}|| expected to be {expected} and was {actual}", + if actual == expected { '✔' } else { '❌' } + ); } -} \ No newline at end of file + + let mut num_valid = 0; + for to_check in binding.lines() { + if is_valid(to_check) { num_valid += 1 } + } + println!("Found {num_valid} valid entries."); +} +// 451 diff --git a/2017/src/bin/2017_05a.rs b/2017/src/bin/2017_05a.rs new file mode 100644 index 0000000..3914e67 --- /dev/null +++ b/2017/src/bin/2017_05a.rs @@ -0,0 +1,27 @@ +use core::read_data; + +fn main() { + let mut instructions = vec![]; + let mut instruction_pointer: i32 = 0; + let input = "0\n3\n0\n1\n-3"; + //let input = read_data("2017_05_data.txt"); + let lines = input.lines(); + let num_lines = lines.clone().count(); + println!("Found {num_lines}"); + for line in lines { + let value = line.parse::().unwrap(); + instructions.push(value); + // println!("Line = [{value}]"); + } + println!("Instructions loaded...Executing."); + let mut should_exit = false; + + while !should_exit { + if instruction_pointer < 0 || instruction_pointer > num_lines as i32 { should_exit = true } + // find out the instruction we have at the current pointer... + let current_instruction = instructions[instruction_pointer as usize]; + instructions[instruction_pointer as usize] += 1; + instruction_pointer += current_instruction; + } + println!("Final IP value is {instruction_pointer}"); +} diff --git a/2018/src/bin/2018_01b.rs b/2018/src/bin/2018_01b.rs index 6f0ee4d..1742c92 100644 --- a/2018/src/bin/2018_01b.rs +++ b/2018/src/bin/2018_01b.rs @@ -16,7 +16,11 @@ fn main() { let direction_val : i32 = velocity.parse().unwrap(); match direction { "+" => { - working_value += direction_val; + let destination = working_value + direction_val; + for index in working_value..destination { + println!("At {index}"); + } + working_value = destination; } "-" => { working_value -= direction_val; @@ -25,15 +29,6 @@ fn main() { unreachable!("Invalid direction"); } } - println!("||{working_value}||\t"); - if let Some(found) = visited_locations.get(&working_value) { - println!("GET SUCCESS -> {working_value} / {found}"); - break; - } - for index in 0..working_value.abs() { - println!("Adding visit to {}", index + working_value); - visited_locations.insert(index + working_value, 0); - } } } // BROKEN \ No newline at end of file diff --git a/2018/src/bin/2018_10a.rs b/2018/src/bin/2018_10a.rs new file mode 100644 index 0000000..e0ad595 --- /dev/null +++ b/2018/src/bin/2018_10a.rs @@ -0,0 +1,62 @@ +use core::read_data; + +struct MovingPoint { + position_x: i32, + position_y: i32, + velocity_x: i32, + velocity_y: i32 +} + +impl MovingPoint { + fn current_position(&self) -> (i32, i32) { + (self.position_x, self.position_y) + } + + fn current_velocity(&self) -> (i32, i32) { + (self.velocity_x, self.velocity_y) + } + + fn tick(&mut self) { + self.position_x += self.velocity_x; + self.position_y += self.velocity_y; + } + + // parse line like + // position=<-2, 3> velocity=< 1, 0> + fn parse(input: &str) -> Self { + let (_, balance) = input.split_once("=").unwrap(); + let (pos_parts, vel_balance) = balance.split_once(">").unwrap(); + let (pos_x, pos_y) = pos_parts.split_once(",").unwrap(); + let (_, vel_balance) = vel_balance.split_once("=").unwrap(); + let (vel_x, vel_y) = vel_balance.split_once(",").unwrap(); + + let position_x = pos_x.clone()[1..].trim().parse::().unwrap(); + let position_y = pos_y.trim().parse::().unwrap(); + let velocity_x = vel_x.clone()[1..].trim().parse::().unwrap(); + let velocity_y = vel_y[0..(vel_y.len() - 1)].trim().parse::().unwrap(); + + MovingPoint { + position_x, + position_y, + velocity_x, + velocity_y, + } + } +} + +fn main() { + let mut points = vec![]; + + let binding = read_data("2018_10_data_SAMPLE.txt"); + let lines = binding.lines(); + for line in lines { + // println!("Input: [[{line}]]"); + let parsed = MovingPoint::parse(line); + points.push(parsed); + } + println!("Loaded {} points. Preparing to move them.", points.len()); + + for mut point in points { + point.tick() + } +} diff --git a/2024/src/bin/2024_09a.rs b/2024/src/bin/2024_09a.rs new file mode 100644 index 0000000..721d0ab --- /dev/null +++ b/2024/src/bin/2024_09a.rs @@ -0,0 +1,92 @@ +use core::read_data; + +fn display_filesystem(from: &[u32]) { + for (index, value) in from.iter().enumerate() { + if index.is_multiple_of(16) { println!(); } + if *value < u32::MAX { print!("{value}"); } else { print!("_"); } + } + println!(); +} + +fn build_filesystem(from: String) -> Vec { + let mut fs: Vec = vec![]; + let mut file_entry = true; + let mut last_file_entry_id = 0; + for current_char in from.chars() { + let as_digit = current_char.to_digit(10).unwrap_or(0); + + let (to_push, should_inc) = if file_entry { + (last_file_entry_id, true) + } else { + (u32::MAX, false) + }; + + if should_inc { last_file_entry_id += 1; } + for i in 0..as_digit { + fs.push(to_push) + } + file_entry = !file_entry; + } + fs +} +fn compact_filesystem(from: &[u32]) -> Vec { + let mut fs = from.clone().to_vec(); + + let mut left = 0; + let mut right = fs.len() - 1; + let fs_len = fs.len(); + + while left < right { + // find next empty slot from the left + while left < fs_len && fs[left] != u32::MAX { + left += 1; + } + + // find next data slot from the right + while right > 0 && fs[right] == u32::MAX { + right -= 1; + } + + if left >= right { + break; + } + + // move data left + fs[left] = fs[right]; + fs[right] = u32::MAX; + } + + fs +} + +fn calculate_checksum(from: &[u32]) -> u64 { + let mut checksum: u64 = 0; + for (index, &value) in from.iter().enumerate() { + if value != u32::MAX { + checksum += index as u64 * value as u64; + } + } + checksum +} + +fn main() { + // let binding = "2333133121414131402".to_string(); + let binding = read_data("2024_09_data.txt"); + // build out the filesystem... + let mut filesystem = build_filesystem(binding); + + println!("Filesystem built..."); + // display_filesystem(&filesystem); + // ...start to compact it... + + filesystem = compact_filesystem(&filesystem); + + // ...calculate the checksum + + // println!("filesystem post compact:"); + // display_filesystem(&filesystem); + println!("Filesystem compacted..."); + println!("Calculated Checksum = {} / Expected 1928", calculate_checksum(&filesystem)); +} + +// 6331212425418 diff --git a/core/src/lib.rs b/core/src/lib.rs index 246951e..4b9faee 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -56,3 +56,37 @@ pub fn sum_of_vec(to_add: &Vec) -> u32 { } working } + +pub fn merge_ranges(range_1: (u32, u32), range_2: (u32, u32)) -> Option<(u32, u32)> { + let (r1_start, r1_end) = (range_1.0.min(range_1.1), range_1.0.max(range_1.1)); + let (r2_start, r2_end) = (range_2.0.min(range_2.1), range_2.0.max(range_2.1)); + + if r1_start <= r2_end && r2_start <= r1_end { + Some((r1_start.min(r2_start), r1_end.max(r2_end))) + } else { + None // no overlap + } +} + +pub fn can_merge_ranges(range_1: (u32, u32), range_2: (u32, u32)) -> bool { + let (r1start, r1end) = range_1; + let (r2start, r2end) = range_2; + + let (r1start, r1end) = (r1start.min(r1end), r1start.max(r1end)); + let (r2start, r2end) = (r2start.min(r2end), r2start.max(r2end)); + + r1start <= r2end && r2start <= r1end +} + +pub fn format_with_commas(n: u32) -> String { + let s = n.to_string(); + let mut result = String::new(); + let chars: Vec<_> = s.chars().collect(); + for (i, c) in chars.iter().rev().enumerate() { + if i > 0 && i % 3 == 0 { + result.push(','); + } + result.push(*c); + } + result.chars().rev().collect() +} \ No newline at end of file diff --git a/data/2016_08_data.txt b/data/2016_08_data.txt index e69de29..2243b3a 100644 --- a/data/2016_08_data.txt +++ b/data/2016_08_data.txt @@ -0,0 +1,170 @@ +rect 1x1 +rotate row y=0 by 5 +rect 1x1 +rotate row y=0 by 5 +rect 1x1 +rotate row y=0 by 3 +rect 1x1 +rotate row y=0 by 2 +rect 1x1 +rotate row y=0 by 3 +rect 1x1 +rotate row y=0 by 2 +rect 1x1 +rotate row y=0 by 5 +rect 1x1 +rotate row y=0 by 5 +rect 1x1 +rotate row y=0 by 3 +rect 1x1 +rotate row y=0 by 2 +rect 1x1 +rotate row y=0 by 3 +rect 2x1 +rotate row y=0 by 2 +rect 1x2 +rotate row y=1 by 5 +rotate row y=0 by 3 +rect 1x2 +rotate column x=30 by 1 +rotate column x=25 by 1 +rotate column x=10 by 1 +rotate row y=1 by 5 +rotate row y=0 by 2 +rect 1x2 +rotate row y=0 by 5 +rotate column x=0 by 1 +rect 4x1 +rotate row y=2 by 18 +rotate row y=0 by 5 +rotate column x=0 by 1 +rect 3x1 +rotate row y=2 by 12 +rotate row y=0 by 5 +rotate column x=0 by 1 +rect 4x1 +rotate column x=20 by 1 +rotate row y=2 by 5 +rotate row y=0 by 5 +rotate column x=0 by 1 +rect 4x1 +rotate row y=2 by 15 +rotate row y=0 by 15 +rotate column x=10 by 1 +rotate column x=5 by 1 +rotate column x=0 by 1 +rect 14x1 +rotate column x=37 by 1 +rotate column x=23 by 1 +rotate column x=7 by 2 +rotate row y=3 by 20 +rotate row y=0 by 5 +rotate column x=0 by 1 +rect 4x1 +rotate row y=3 by 5 +rotate row y=2 by 2 +rotate row y=1 by 4 +rotate row y=0 by 4 +rect 1x4 +rotate column x=35 by 3 +rotate column x=18 by 3 +rotate column x=13 by 3 +rotate row y=3 by 5 +rotate row y=2 by 3 +rotate row y=1 by 1 +rotate row y=0 by 1 +rect 1x5 +rotate row y=4 by 20 +rotate row y=3 by 10 +rotate row y=2 by 13 +rotate row y=0 by 10 +rotate column x=5 by 1 +rotate column x=3 by 3 +rotate column x=2 by 1 +rotate column x=1 by 1 +rotate column x=0 by 1 +rect 9x1 +rotate row y=4 by 10 +rotate row y=3 by 10 +rotate row y=1 by 10 +rotate row y=0 by 10 +rotate column x=7 by 2 +rotate column x=5 by 1 +rotate column x=2 by 1 +rotate column x=1 by 1 +rotate column x=0 by 1 +rect 9x1 +rotate row y=4 by 20 +rotate row y=3 by 12 +rotate row y=1 by 15 +rotate row y=0 by 10 +rotate column x=8 by 2 +rotate column x=7 by 1 +rotate column x=6 by 2 +rotate column x=5 by 1 +rotate column x=3 by 1 +rotate column x=2 by 1 +rotate column x=1 by 1 +rotate column x=0 by 1 +rect 9x1 +rotate column x=46 by 2 +rotate column x=43 by 2 +rotate column x=24 by 2 +rotate column x=14 by 3 +rotate row y=5 by 15 +rotate row y=4 by 10 +rotate row y=3 by 3 +rotate row y=2 by 37 +rotate row y=1 by 10 +rotate row y=0 by 5 +rotate column x=0 by 3 +rect 3x3 +rotate row y=5 by 15 +rotate row y=3 by 10 +rotate row y=2 by 10 +rotate row y=0 by 10 +rotate column x=7 by 3 +rotate column x=6 by 3 +rotate column x=5 by 1 +rotate column x=3 by 1 +rotate column x=2 by 1 +rotate column x=1 by 1 +rotate column x=0 by 1 +rect 9x1 +rotate column x=19 by 1 +rotate column x=10 by 3 +rotate column x=5 by 4 +rotate row y=5 by 5 +rotate row y=4 by 5 +rotate row y=3 by 40 +rotate row y=2 by 35 +rotate row y=1 by 15 +rotate row y=0 by 30 +rotate column x=48 by 4 +rotate column x=47 by 3 +rotate column x=46 by 3 +rotate column x=45 by 1 +rotate column x=43 by 1 +rotate column x=42 by 5 +rotate column x=41 by 5 +rotate column x=40 by 1 +rotate column x=33 by 2 +rotate column x=32 by 3 +rotate column x=31 by 2 +rotate column x=28 by 1 +rotate column x=27 by 5 +rotate column x=26 by 5 +rotate column x=25 by 1 +rotate column x=23 by 5 +rotate column x=22 by 5 +rotate column x=21 by 5 +rotate column x=18 by 5 +rotate column x=17 by 5 +rotate column x=16 by 5 +rotate column x=13 by 5 +rotate column x=12 by 5 +rotate column x=11 by 5 +rotate column x=3 by 1 +rotate column x=2 by 5 +rotate column x=1 by 5 +rotate column x=0 by 1 \ No newline at end of file diff --git a/data/2016_10_data.txt b/data/2016_10_data.txt new file mode 100644 index 0000000..20e8010 --- /dev/null +++ b/data/2016_10_data.txt @@ -0,0 +1,231 @@ +bot 135 gives low to bot 27 and high to bot 166 +bot 57 gives low to bot 4 and high to bot 186 +bot 115 gives low to output 2 and high to bot 80 +bot 44 gives low to bot 175 and high to bot 88 +bot 167 gives low to bot 42 and high to bot 168 +bot 18 gives low to bot 32 and high to bot 89 +bot 199 gives low to bot 75 and high to bot 40 +bot 129 gives low to bot 178 and high to bot 147 +bot 163 gives low to bot 49 and high to bot 160 +value 2 goes to bot 143 +bot 176 gives low to bot 139 and high to bot 117 +bot 194 gives low to bot 11 and high to bot 37 +bot 99 gives low to bot 163 and high to bot 138 +value 53 goes to bot 9 +bot 159 gives low to output 1 and high to bot 207 +bot 0 gives low to bot 105 and high to bot 13 +bot 6 gives low to bot 66 and high to bot 116 +bot 81 gives low to bot 54 and high to bot 10 +bot 27 gives low to bot 188 and high to bot 199 +bot 186 gives low to bot 84 and high to bot 123 +bot 154 gives low to bot 21 and high to bot 107 +bot 188 gives low to bot 92 and high to bot 75 +bot 164 gives low to bot 115 and high to bot 28 +bot 106 gives low to bot 48 and high to bot 155 +bot 193 gives low to bot 101 and high to bot 110 +bot 136 gives low to bot 166 and high to bot 152 +bot 7 gives low to bot 156 and high to bot 24 +bot 103 gives low to bot 182 and high to bot 0 +bot 101 gives low to bot 16 and high to bot 72 +bot 86 gives low to bot 102 and high to bot 48 +bot 78 gives low to bot 177 and high to bot 113 +value 17 goes to bot 198 +bot 54 gives low to bot 161 and high to bot 111 +bot 46 gives low to bot 74 and high to bot 39 +bot 22 gives low to bot 56 and high to bot 161 +bot 5 gives low to bot 186 and high to bot 123 +bot 137 gives low to bot 202 and high to bot 85 +bot 202 gives low to bot 108 and high to bot 118 +bot 174 gives low to bot 0 and high to bot 21 +bot 119 gives low to bot 68 and high to bot 53 +bot 151 gives low to bot 83 and high to bot 164 +bot 160 gives low to bot 33 and high to bot 97 +bot 76 gives low to bot 40 and high to bot 120 +bot 60 gives low to bot 103 and high to bot 174 +bot 203 gives low to bot 120 and high to bot 132 +bot 157 gives low to bot 116 and high to bot 11 +bot 98 gives low to bot 208 and high to bot 16 +bot 142 gives low to bot 114 and high to bot 71 +bot 143 gives low to bot 198 and high to bot 146 +bot 30 gives low to bot 59 and high to bot 135 +bot 87 gives low to bot 39 and high to bot 104 +bot 161 gives low to bot 173 and high to bot 125 +bot 104 gives low to bot 34 and high to bot 68 +bot 70 gives low to bot 112 and high to bot 176 +bot 92 gives low to bot 122 and high to bot 46 +bot 148 gives low to bot 28 and high to bot 58 +bot 49 gives low to output 0 and high to bot 33 +bot 140 gives low to bot 136 and high to bot 134 +bot 16 gives low to bot 170 and high to bot 79 +bot 13 gives low to bot 204 and high to bot 22 +bot 189 gives low to bot 148 and high to bot 45 +bot 89 gives low to bot 73 and high to bot 86 +value 31 goes to bot 50 +bot 166 gives low to bot 199 and high to bot 76 +bot 178 gives low to output 5 and high to bot 159 +bot 58 gives low to bot 167 and high to bot 126 +bot 149 gives low to bot 180 and high to bot 153 +bot 131 gives low to bot 97 and high to bot 66 +bot 64 gives low to bot 192 and high to bot 44 +bot 117 gives low to bot 140 and high to bot 134 +bot 156 gives low to bot 174 and high to bot 154 +value 11 goes to bot 19 +bot 1 gives low to bot 26 and high to bot 144 +bot 171 gives low to output 7 and high to bot 150 +bot 31 gives low to bot 110 and high to bot 127 +value 5 goes to bot 162 +bot 9 gives low to bot 8 and high to bot 128 +bot 93 gives low to bot 109 and high to bot 188 +value 47 goes to bot 184 +bot 80 gives low to output 19 and high to bot 42 +bot 155 gives low to bot 149 and high to bot 52 +bot 108 gives low to output 14 and high to bot 47 +bot 165 gives low to bot 200 and high to bot 141 +bot 184 gives low to bot 162 and high to bot 20 +bot 50 gives low to bot 143 and high to bot 4 +bot 28 gives low to bot 80 and high to bot 167 +bot 66 gives low to bot 151 and high to bot 55 +bot 201 gives low to bot 124 and high to bot 41 +bot 204 gives low to bot 94 and high to bot 56 +bot 134 gives low to bot 152 and high to bot 203 +bot 51 gives low to bot 36 and high to bot 142 +bot 2 gives low to bot 52 and high to bot 201 +bot 183 gives low to bot 38 and high to bot 78 +bot 26 gives low to bot 142 and high to bot 69 +bot 182 gives low to bot 3 and high to bot 105 +bot 72 gives low to bot 79 and high to bot 209 +bot 8 gives low to bot 185 and high to bot 65 +bot 75 gives low to bot 46 and high to bot 87 +bot 38 gives low to bot 82 and high to bot 177 +bot 147 gives low to bot 159 and high to bot 207 +bot 195 gives low to bot 104 and high to bot 119 +bot 63 gives low to bot 126 and high to bot 172 +bot 144 gives low to bot 69 and high to bot 82 +bot 83 gives low to output 3 and high to bot 115 +bot 43 gives low to bot 194 and high to bot 91 +value 37 goes to bot 8 +bot 82 gives low to bot 193 and high to bot 31 +bot 150 gives low to output 18 and high to bot 49 +value 23 goes to bot 182 +bot 67 gives low to bot 61 and high to bot 165 +bot 77 gives low to bot 107 and high to bot 122 +bot 130 gives low to bot 141 and high to bot 30 +value 73 goes to bot 12 +bot 41 gives low to bot 99 and high to bot 208 +bot 170 gives low to bot 131 and high to bot 6 +bot 120 gives low to bot 195 and high to bot 132 +bot 118 gives low to bot 47 and high to bot 129 +bot 100 gives low to bot 150 and high to bot 163 +value 67 goes to bot 185 +bot 152 gives low to bot 76 and high to bot 203 +bot 162 gives low to bot 67 and high to bot 205 +value 7 goes to bot 32 +bot 121 gives low to bot 172 and high to bot 158 +bot 65 gives low to bot 57 and high to bot 5 +bot 122 gives low to bot 81 and high to bot 74 +bot 21 gives low to bot 13 and high to bot 17 +bot 23 gives low to bot 133 and high to bot 1 +bot 36 gives low to bot 201 and high to bot 114 +bot 138 gives low to bot 160 and high to bot 131 +bot 55 gives low to bot 164 and high to bot 148 +bot 123 gives low to bot 70 and high to bot 176 +value 61 goes to bot 61 +bot 107 gives low to bot 17 and high to bot 81 +bot 19 gives low to bot 60 and high to bot 156 +value 41 goes to bot 12 +value 29 goes to bot 18 +value 13 goes to bot 60 +bot 62 gives low to bot 20 and high to bot 64 +bot 40 gives low to bot 87 and high to bot 195 +bot 90 gives low to bot 64 and high to bot 112 +bot 69 gives low to bot 71 and high to bot 193 +bot 35 gives low to output 4 and high to bot 108 +bot 177 gives low to bot 31 and high to bot 113 +bot 59 gives low to bot 93 and high to bot 27 +bot 187 gives low to bot 89 and high to bot 94 +bot 73 gives low to output 9 and high to bot 102 +bot 45 gives low to bot 58 and high to bot 63 +bot 39 gives low to bot 23 and high to bot 34 +bot 110 gives low to bot 72 and high to bot 190 +bot 181 gives low to bot 15 and high to bot 93 +bot 95 gives low to bot 7 and high to bot 15 +bot 33 gives low to output 13 and high to bot 169 +bot 20 gives low to bot 205 and high to bot 192 +bot 158 gives low to bot 85 and high to bot 29 +bot 61 gives low to bot 14 and high to bot 200 +value 71 goes to bot 103 +bot 192 gives low to bot 130 and high to bot 175 +bot 112 gives low to bot 44 and high to bot 139 +bot 96 gives low to bot 144 and high to bot 38 +bot 32 gives low to output 11 and high to bot 73 +bot 180 gives low to output 10 and high to bot 171 +value 59 goes to bot 3 +bot 208 gives low to bot 138 and high to bot 170 +bot 198 gives low to bot 184 and high to bot 62 +bot 207 gives low to output 16 and high to output 8 +bot 196 gives low to bot 43 and high to bot 91 +bot 10 gives low to bot 111 and high to bot 133 +bot 168 gives low to bot 35 and high to bot 202 +bot 113 gives low to bot 127 and high to bot 196 +bot 169 gives low to output 20 and high to bot 83 +bot 3 gives low to bot 18 and high to bot 187 +bot 52 gives low to bot 153 and high to bot 124 +bot 190 gives low to bot 209 and high to bot 43 +bot 125 gives low to bot 2 and high to bot 36 +bot 173 gives low to bot 155 and high to bot 2 +bot 153 gives low to bot 171 and high to bot 100 +bot 34 gives low to bot 1 and high to bot 96 +bot 84 gives low to bot 90 and high to bot 70 +bot 12 gives low to bot 9 and high to bot 128 +bot 24 gives low to bot 154 and high to bot 77 +bot 179 gives low to bot 63 and high to bot 121 +bot 85 gives low to bot 118 and high to bot 29 +bot 11 gives low to bot 189 and high to bot 145 +bot 116 gives low to bot 55 and high to bot 189 +bot 132 gives low to bot 119 and high to bot 53 +bot 15 gives low to bot 24 and high to bot 109 +bot 102 gives low to output 15 and high to bot 197 +value 43 goes to bot 206 +bot 37 gives low to bot 145 and high to bot 25 +bot 53 gives low to bot 183 and high to bot 78 +bot 197 gives low to output 12 and high to bot 180 +bot 47 gives low to output 17 and high to bot 178 +bot 17 gives low to bot 22 and high to bot 54 +bot 56 gives low to bot 106 and high to bot 173 +bot 191 gives low to bot 135 and high to bot 136 +bot 127 gives low to bot 190 and high to bot 196 +bot 172 gives low to bot 137 and high to bot 158 +bot 4 gives low to bot 146 and high to bot 84 +bot 42 gives low to output 6 and high to bot 35 +bot 145 gives low to bot 45 and high to bot 179 +bot 133 gives low to bot 51 and high to bot 26 +bot 139 gives low to bot 88 and high to bot 117 +bot 105 gives low to bot 187 and high to bot 204 +bot 126 gives low to bot 168 and high to bot 137 +bot 128 gives low to bot 65 and high to bot 5 +bot 114 gives low to bot 41 and high to bot 98 +bot 14 gives low to bot 206 and high to bot 95 +bot 91 gives low to bot 37 and high to bot 25 +bot 206 gives low to bot 19 and high to bot 7 +value 19 goes to bot 14 +bot 185 gives low to bot 50 and high to bot 57 +bot 205 gives low to bot 165 and high to bot 130 +bot 109 gives low to bot 77 and high to bot 92 +bot 175 gives low to bot 30 and high to bot 191 +bot 29 gives low to bot 129 and high to bot 147 +bot 74 gives low to bot 10 and high to bot 23 +bot 94 gives low to bot 86 and high to bot 106 +bot 25 gives low to bot 179 and high to bot 121 +bot 71 gives low to bot 98 and high to bot 101 +bot 209 gives low to bot 157 and high to bot 194 +bot 88 gives low to bot 191 and high to bot 140 +bot 124 gives low to bot 100 and high to bot 99 +bot 97 gives low to bot 169 and high to bot 151 +bot 141 gives low to bot 181 and high to bot 59 +bot 146 gives low to bot 62 and high to bot 90 +bot 200 gives low to bot 95 and high to bot 181 +bot 79 gives low to bot 6 and high to bot 157 +bot 48 gives low to bot 197 and high to bot 149 +value 3 goes to bot 67 +bot 68 gives low to bot 96 and high to bot 183 +bot 111 gives low to bot 125 and high to bot 51 \ No newline at end of file diff --git a/data/2016_20_data.txt b/data/2016_20_data.txt new file mode 100644 index 0000000..6e0ff85 --- /dev/null +++ b/data/2016_20_data.txt @@ -0,0 +1,1176 @@ +2365712272-2390766206 +2569947483-2579668543 +1348241901-1362475328 +2431265968-2450509895 +2146385-2259474 +2935960035-2940597034 +448888033-460770571 +1993433098-1995841061 +1479295247-1481053053 +2315798162-2331724795 +553124643-558300256 +2221609952-2221736791 +2528284970-2536413665 +1003828483-1008019254 +2460073010-2461391392 +1756403373-1774263374 +181708677-181820620 +4105906368-4108964079 +2803753677-2810396331 +3872622758-3876157728 +4222455331-4230019102 +2566685080-2569947482 +2546666999-2560222508 +2563776047-2567373420 +669206125-670672126 +3047016482-3068254467 +2412767568-2415681466 +3832227190-3836056110 +1752672085-1778896581 +3612964446-3613428692 +473462452-473507720 +558414399-558825886 +174888587-188726755 +3681687609-3688894180 +482298773-513769024 +1105376539-1109259196 +2626549708-2635018162 +2221569800-2221688559 +3217908441-3218365608 +1839378196-1839704131 +4006631148-4018637666 +1033070477-1039079720 +3614366173-3619803122 +1651631132-1657688516 +3148614241-3149307836 +2922404131-2925650734 +2967474818-2979959263 +3674334884-3677432948 +2194863661-2195245017 +1723397977-1746877683 +246394156-253325513 +577459246-594741177 +410425445-412372582 +1287281042-1288450150 +2546572083-2552459138 +3284505169-3292205355 +2572957308-2615378907 +2689345749-2699114021 +3296227141-3297518289 +3695819772-3697468770 +412372583-422306605 +2699114022-2714857638 +2059138236-2060952632 +117089981-120121935 +2848444484-2857342976 +352052590-358986830 +2656447256-2685668729 +454980721-460461657 +1027539209-1041751363 +1913417-3826887 +1062494257-1082863054 +2282966419-2286017938 +394757734-421655845 +2106693263-2115236723 +1124719891-1127653202 +3292205357-3293681013 +117011952-119543627 +2181915940-2184656064 +1045705528-1078679114 +290113491-291311039 +2278026399-2284902493 +841914150-848969885 +3952731875-3959197013 +1938643863-1940674602 +1036550327-1041084034 +63607243-63644812 +3769265734-3769975585 +51653989-55144083 +1799892196-1812471751 +1371739118-1372165373 +3561636732-3569279384 +1823678708-1830435069 +4012340693-4047186502 +3697468771-3719107288 +1963424400-1964720496 +254179574-261945026 +2639565460-2643861101 +2489776747-2498561347 +1528974499-1529888310 +2272121277-2279366265 +2063178650-2063502047 +2631423649-2635927617 +1360641171-1369732967 +352866001-362403909 +2982988833-2999220870 +2226316378-2236701767 +3581998091-3588302160 +3905167888-3909688736 +2410405177-2416922214 +2221793009-2222205811 +1682009735-1689579607 +2551217715-2555588513 +4111825736-4139764825 +1495499947-1496504480 +1126815599-1132033603 +262946528-267481743 +2190431207-2194125961 +3056852838-3057666713 +3852657771-3855744213 +814188270-815660610 +1370082674-1372874146 +2698266605-2707295552 +2623491116-2632182274 +556237979-558470744 +4221727965-4242434586 +1373248698-1389927798 +3269334240-3276265066 +2266535688-2268367969 +3098582122-3101205009 +1909408103-1909548530 +2822711293-2831177968 +848969887-859626993 +46887186-54157057 +2762897904-2771117185 +289933294-290354931 +1088830930-1093432672 +2443230763-2461276873 +3160139479-3173260442 +1527097290-1531435951 +1799540955-1800006056 +1369732968-1371815843 +2622838271-2625104782 +1173393865-1173503336 +1909254997-1910983838 +1299664180-1322001993 +1688665208-1691812251 +1887810466-1890884113 +2869886503-2875645396 +582392092-606025972 +4267022320-4275265906 +3859201994-3893484463 +3589262267-3596650599 +912537182-912907636 +2221654107-2222088287 +4057523345-4060042618 +3697080984-3697115223 +970916665-977773714 +1357371244-1357771399 +300561490-351155869 +1312775715-1335513565 +117013732-119708846 +425465828-460547231 +1934707608-1943900203 +1872455505-1883131224 +1265429510-1270058235 +1351349572-1360842989 +3949672363-3965375662 +757393179-769131755 +1140550254-1155907063 +2362581541-2384858143 +3767349312-3769448384 +1010152192-1021680403 +3719107290-3724947612 +793186065-798493071 +3543437818-3570393128 +2142580414-2155598642 +570014715-594180691 +2268145476-2268275380 +682993360-688547687 +882429283-885295513 +2061317899-2062340917 +3080454969-3087996304 +1509787381-1515229305 +1792788995-1805479181 +471893034-478588629 +2469289299-2469834064 +3435184443-3439758093 +1972314440-1984109813 +897623204-906019235 +3309685433-3316891985 +2022851-2168311 +3425944138-3434725507 +1573705848-1574774103 +1843461004-1851252409 +275830302-287491224 +1099676859-1106356804 +3201885249-3216240573 +890516875-914189870 +1045475561-1045705526 +858602633-861745342 +1722754472-1729362918 +1999030390-2001346788 +2295812200-2297395314 +545671618-547361797 +1925762580-1932504567 +2469834065-2488585001 +962891401-973508116 +3056544703-3057098061 +1964666710-1968283715 +4153249699-4156067673 +2269509587-2272121275 +113577026-129098597 +2544925116-2547575012 +3930954397-3932696547 +1940360721-1941087983 +989005807-1006335777 +1715546619-1723575645 +946249856-956419020 +2580089074-2609078369 +118138523-133562721 +1418940971-1433573243 +3116049988-3117047351 +2819201530-2820204193 +609029102-631859346 +1236996385-1243667312 +2071060282-2090563034 +3275297026-3287385948 +557242553-558842013 +2340595893-2346006065 +1763694009-1772957054 +3039028781-3066739550 +2678983882-2689345747 +1496448610-1497010926 +3783756301-3783968438 +4011127020-4023009734 +2455737032-2469289297 +911816966-912509075 +2275917994-2288190359 +1405416423-1419176714 +2642680237-2644300616 +3826507233-3826769507 +3791085814-3803870306 +3990925848-3994761120 +1574446563-1576228425 +1634308286-1635388054 +3770072854-3783827763 +859626994-872001663 +1678998549-1682009733 +3615640609-3625220434 +3756046034-3759831577 +4219956234-4225730655 +1944691819-1972314439 +3232924024-3243647347 +2819804415-2821623032 +1041187113-1041438684 +1234384868-1251566238 +1707319358-1710481231 +3338081719-3342039539 +3919045080-3932932694 +1618322267-1618915594 +1196499550-1204759606 +354238054-359105442 +2788225259-2807617695 +1817797800-1818404115 +3314463142-3319629375 +3220899130-3223901824 +463163318-471893033 +2108731258-2118466370 +2531905696-2534895562 +872001665-885348477 +3618924494-3633614536 +1286808229-1287787318 +1686812571-1709789731 +1667289113-1675800071 +1288046293-1288760085 +115133053-118531268 +3084925009-3087972171 +2107005650-2118671640 +2206689406-2208120987 +2965687206-2969477736 +2789286984-2795621824 +1510800557-1520242850 +1372577266-1373248696 +3908185397-3914112662 +3027341861-3028862050 +2551506862-2563776045 +3457830284-3476082138 +2330638928-2335068417 +3754091818-3760153804 +1700898897-1708456845 +2653919552-2678983881 +1718586248-1752672083 +1909974346-1911447514 +740859879-743318742 +632094677-641123609 +2717310519-2722969125 +2429156614-2450453303 +3573769011-3581998089 +804909837-807598669 +2645933387-2650206634 +3906744049-3908084382 +1088710392-1093793913 +2945948817-2961003764 +2154975171-2170652704 +705358087-723167844 +2623774017-2637924339 +1527448631-1531925852 +541284581-550148134 +822228123-845259076 +2725319909-2726283018 +90504693-97857953 +2151018859-2156845889 +3875175237-3880661438 +2174472127-2175522174 +1053913106-1073312877 +4151957167-4159217706 +408096359-410929997 +3494935822-3518493936 +4018415387-4034413199 +1318527150-1335393593 +4094276281-4100264566 +3296618992-3305730207 +3827540382-3834020598 +1792716600-1804353554 +486286244-509649426 +2820166268-2822489545 +943117353-944243402 +4250879477-4288162587 +1092150174-1096445797 +659715146-669206123 +424405829-425465827 +2903268723-2916344920 +2825756580-2827850093 +2197813619-2221567221 +2222205813-2242661939 +1909398015-1909639813 +2085646-2171133 +3237410359-3243293444 +2488585003-2500532520 +1719496111-1733109286 +3101107881-3101724703 +4292290133-4294130012 +2682533716-2682557737 +478588631-499658423 +2056703122-2057132500 +10759205-22974868 +288949273-290120633 +3295342764-3300711505 +4144392189-4146507469 +1377845154-1383061661 +1470042236-1484545053 +2929570686-2942193911 +663447966-667304777 +2250137488-2260767053 +2916852498-2920130617 +560916716-582392091 +3826421034-3826753059 +4205391625-4209582225 +3098065613-3099195513 +1523618109-1529220622 +1280876899-1287180580 +2896461712-2914779142 +3059619066-3072535463 +3594066104-3603694944 +206442883-222778068 +4057343389-4058593137 +3040726007-3067509699 +783978732-804864426 +3782497016-3783855888 +3771309186-3798156648 +1806086747-1808455979 +2509648237-2520128379 +2655519435-2688778011 +466454947-475885979 +764443451-778431348 +942699799-943817373 +2707406125-2710335531 +3532789271-3534889466 +161216255-168066537 +3959810178-3972378256 +1216245-1730562 +820810878-827132162 +3840466779-3849871670 +241662240-244306234 +1308539-1732730 +2644300617-2653919550 +1245139600-1257000695 +472344288-476821359 +360421650-365291918 +4157074002-4160043617 +3475229162-3494935820 +4021239535-4026837101 +1122221983-1122467302 +3524503684-3534615536 +294914250-297074740 +3315785542-3320016807 +3207399725-3218904107 +3399796042-3432628902 +2415031178-2417587472 +637037746-641909503 +4125051011-4125349366 +2792226042-2796333812 +1090609063-1093811054 +3826753967-3826928901 +2845981709-2846071766 +1884551628-1888679834 +1867383722-1901804607 +1138049177-1150698174 +2489168484-2503275369 +3844741449-3859201992 +2059227603-2061190162 +2725980853-2726316169 +3950461578-3982076979 +2964040486-2971816053 +3117022269-3125872507 +4205459617-4208901905 +3223901825-3259939574 +2043681871-2056703120 +2862497588-2874433217 +1545573025-1550810115 +558470745-560916714 +2204957059-2206941462 +687956243-693820818 +1006335778-1027539207 +1683104091-1691973027 +1281662230-1286185165 +2457027525-2467523425 +3910944384-3915139260 +1812471753-1823678707 +3439758094-3449375742 +4180271874-4183028052 +3145750655-3149232555 +1063127835-1081739469 +912453784-912787957 +757841367-763656320 +970465196-984461751 +2682535644-2682561899 +1103041548-1124501094 +711829065-712418631 +786434450-810431275 +526718776-547605908 +411642224-419649420 +442563986-451494166 +3916556398-3932893207 +4178915874-4181659654 +931371848-932759051 +226571744-227466085 +586436371-589611958 +2138685204-2148239206 +2786369133-2807032221 +3902400566-3910944383 +356708623-360421649 +1195358721-1201587206 +2986693403-2997511709 +1160749272-1164268031 +1138794253-1160582337 +1316625314-1322081912 +2546426233-2547478858 +631117298-638088180 +490462991-510876262 +1585596253-1598442115 +1691404689-1708777514 +21958182-34768708 +3033283449-3033532644 +850358573-850941928 +2532323467-2533835875 +2571607510-2576905211 +3838468698-3844741448 +3633614538-3658935402 +1267571462-1273337904 +820046167-821948762 +1818557964-1821003970 +1656682467-1658689820 +3572000906-3576107308 +3518493937-3521124207 +2316622941-2320028763 +3234261481-3244439202 +1762170451-1767000441 +403695570-413282241 +1446563227-1455229013 +994814766-1020194067 +1103304248-1123109762 +1358159388-1364262240 +2643072595-2647827063 +1761152300-1771038779 +814235534-818070036 +3658935403-3674334882 +1143690782-1167938223 +956027555-959929296 +78736212-103134510 +897919912-910244590 +991162491-1009670900 +3730115132-3731119302 +3693059535-3697085999 +310695719-311355138 +3792190887-3811128942 +3236342985-3241419480 +932285275-939464714 +1690112643-1694719438 +964486517-974083673 +2886004632-2887772395 +400201502-410632385 +4151877322-4155177505 +4146634947-4148274967 +4142431183-4151685720 +108233930-110782083 +11764001-28124816 +255280185-265644134 +1604894700-1610024510 +2746388028-2755644917 +257526100-265688716 +2979959265-2981174695 +3675625153-3678243537 +946960127-957058942 +158966202-168896939 +885386378-890516873 +3944559186-3950461577 +3436884337-3440035586 +1998995929-2004489839 +1029028825-1029925818 +860116537-869330710 +534657657-536577765 +2792605215-2809178574 +83479693-101592615 +206521107-208527729 +3681963513-3682865724 +2913358381-2916852496 +3172620089-3183275609 +649130727-656267839 +1264638271-1274096286 +1029718677-1030140380 +3643603238-3653831146 +3061231145-3063632127 +2585980608-2609955243 +1316394181-1319520040 +211076367-219280164 +3240385969-3251259062 +2120060-4441033 +3278363479-3278515140 +3831551420-3838468696 +1173779057-1176512368 +4071597616-4101375293 +2781084212-2783642342 +2743354447-2760958028 +4114529275-4137230617 +3752969032-3767349311 +424150040-425393208 +26532978-29480043 +1006115405-1009958851 +2845371314-2850260793 +1267920977-1271152591 +3709512503-3716036930 +3368253421-3392905399 +2452693801-2465509837 +3534255481-3543437816 +4160043619-4178915873 +3954591115-3974152768 +677298953-691027000 +1685806773-1690772816 +436652774-450179768 +3588302161-3612662806 +83367242-100910390 +1633907668-1651631131 +443592135-463163316 +369907897-388846763 +388962875-390004346 +2306861374-2315798161 +591078-868213 +1229951959-1242298204 +3014332113-3031527143 +1171615958-1176617364 +3062064123-3063637314 +2087862269-2089342604 +1672729270-1679677272 +3733541117-3748642488 +3075188797-3083692289 +2520128380-2544925114 +1997250353-1999097991 +2326010770-2328459525 +3335649815-3359666038 +1093811055-1099676857 +1939453065-1940109461 +2260767055-2269509586 +1694740480-1710532828 +48862588-54135685 +2194651149-2194876489 +3261664286-3284505168 +712077073-718032346 +2714857640-2733949192 +3084808742-3090381388 +2326056027-2328734209 +2966286735-2970371217 +3682357002-3688783396 +222778070-246394155 +255495869-263746137 +778431350-801595041 +554816671-557769418 +2287063002-2290447136 +1204759607-1221061934 +3191695158-3195022731 +1937411520-1939682964 +3683208458-3683317560 +3724947613-3752969030 +2655947194-2686070304 +3319632926-3320555728 +3874349431-3892283480 +3524323559-3534255480 +3392910453-3425944137 +2864015808-2880343338 +3603278173-3607977481 +2221685432-2221741276 +3821784373-3831551419 +2340560220-2355630152 +117804595-135520674 +970739667-977759407 +612826307-617050682 +2420630784-2422511751 +4041221294-4053276651 +1783176414-1792788994 +1661820734-1672783713 +2285020555-2288812517 +1145717399-1147147799 +1160582338-1171067340 +2969768222-2978509720 +2241558918-2248366876 +3842088825-3849544675 +3220876335-3220899128 +3612828177-3614366172 +1848099469-1860064576 +1453352598-1457451860 +4131921387-4136290418 +1186411872-1221604187 +4271276227-4274727942 +1972041789-1977505124 +3130652998-3145750654 +4206797669-4211676679 +3382975599-3392910451 +3075497812-3098065611 +2819298198-2826283738 +1358156767-1363896494 +1209838280-1225553470 +3101724704-3130652996 +2874696153-2876992505 +1279193633-1279368007 +2044384098-2052585053 +1778896582-1783176412 +365291920-384429458 +1410453073-1423638312 +3149307838-3160666386 +3115765500-3124715535 +2524674650-2540040296 +312386716-315692662 +3195022733-3220876334 +1528945394-1531524966 +1190783271-1221823104 +1374677110-1382957599 +496392908-504137572 +3152103031-3191695157 +1706509680-1714907014 +2642314466-2645833233 +3893484464-3898889230 +3331226932-3338281520 +3421612598-3423251948 +2376098338-2382856038 +30669693-46887184 +3701470920-3709586949 +974101275-985095687 +3754694204-3762024757 +3199920021-3213832756 +3937237796-3943044170 +519102356-526718775 +3595418820-3608680530 +3132319868-3142292446 +2415135665-2422698971 +2512723394-2531872720 +2831177970-2843852399 +4067331024-4083628214 +974512957-981076935 +1939102143-1939797065 +3362465663-3382975598 +1081727915-1086599484 +62892604-66661231 +3596147589-3597403547 +2427949019-2455737031 +734503945-751972019 +4274360201-4275638496 +546152564-553124641 +1672412404-1675035441 +1799317782-1799878394 +3899929168-3902400564 +2090563035-2093365570 +2502990872-2504573807 +196879713-202383888 +1041219675-1045475560 +288505150-290311818 +2335068419-2337479072 +3115770397-3116114052 +1759780530-1779756738 +3848355565-3857570445 +2887262512-2892926939 +3297920188-3304753747 +2837362258-2846430149 +2365620967-2397295181 +2130880010-2144109636 +850356647-852183547 +2547575013-2555977963 +3293681014-3298307912 +2838677121-2848444483 +1378317671-1378385207 +3932893208-3942847442 +2775955760-2802739818 +3000621764-3001860005 +3878325586-3889110731 +1634960329-1635718125 +3570393129-3575649486 +3359666039-3362465661 +2221578838-2221700311 +307265752-314765240 +823227617-824317407 +923124066-946249854 +4151685721-4154340765 +424138334-424809502 +2057132501-2071060280 +647961093-660004652 +3307622347-3312520961 +3259939576-3281494745 +1887577612-1888900146 +1189371904-1198571936 +1234031907-1247954865 +610600287-612214510 +1630355907-1632283896 +1634415839-1636037634 +3824506379-3826246351 +3847566968-3849532976 +1588959146-1616167991 +4142261326-4149638559 +1813668039-1819668003 +269833124-284269645 +1445572315-1448859107 +3312520962-3326324517 +4134904662-4142261324 +286352057-295053323 +2093365572-2104458852 +2964496323-2978996654 +1589041634-1610897669 +4017779362-4023249218 +710580357-719926955 +3695217573-3697711534 +3119922419-3128398873 +1973300202-1979672054 +2647661251-2652365333 +1618800796-1618963161 +914189871-916240439 +70592825-75578072 +1931515004-1937254405 +2472726189-2479284501 +2073603890-2087967511 +4288162588-4289142874 +1651148640-1652304033 +384429459-393421986 +208944718-214460830 +250825858-254179572 +2845961347-2846405094 +3683052176-3689023082 +2548531964-2548558043 +3326324519-3343805565 +351155871-359398929 +4232721631-4250879475 +3459529479-3474108150 +1909441969-1909689691 +1932119221-1939290766 +2762860344-2765962584 +942511347-943894644 +3682865725-3687083046 +742172772-743598853 +382176907-388584692 +4086908517-4100905688 +2961073615-2978624771 +3753936484-3758588765 +357622008-361838888 +393421988-409475636 +4210437626-4216399302 +3866457812-3901968872 +943727563-944059707 +2919715277-2920771136 +1627803704-1630982586 +1111194889-1126815598 +1637697658-1639829508 +518330921-521079203 +558771603-558831008 +1627521188-1629733196 +2531822532-2533342258 +1722060329-1725371759 +916240441-923124065 +2267284366-2270810897 +4289142876-4294967295 +496711691-511059121 +297074742-300561489 +74957232-86751750 +67820201-89362971 +879194017-883306027 +874758234-886383957 +518363334-546855682 +606025974-631117297 +27195455-41332971 +2870905604-2878387377 +3084839165-3086179322 +4152483704-4155490661 +3992240000-3998336821 +3612662808-3613179304 +2144109637-2171654935 +2912881674-2913811866 +3683215934-3683776929 +744692065-746814759 +648698022-654389148 +770363291-773532218 +1961187739-1981201058 +833212292-844968840 +2279366266-2306861372 +1525437167-1529355367 +783203836-797187462 +743069797-747604954 +2726435221-2743671505 +716822331-723267087 +236924668-243049788 +1819907565-1821265293 +2459006570-2462769060 +261945027-269833122 +2251634561-2252542708 +3077512678-3082900025 +4178034955-4178140732 +517575846-518330919 +1833921219-1854646670 +1863586802-1867383721 +1688123912-1691016809 +3613097833-3613214641 +182210169-189009626 +299267101-339546807 +829601778-834904352 +481358143-505095971 +2224935194-2228740812 +4083628215-4105906366 +3938942245-3941751692 +983920144-989005805 +113931896-118379003 +3330676862-3358266446 +3778252069-3806861354 +751972021-764443450 +4108964080-4140242300 +1576228427-1585596252 +2268397999-2270766178 +1924059333-1931515003 +3938054379-3940855319 +4216399304-4232721630 +203859682-211512236 +1506317175-1508820099 +2082159387-2091680640 +3509536520-3513399808 +152981470-173147952 +1984109815-1997250352 +2104458853-2130880008 +2998034397-2999606176 +2081152422-2086162418 +1628568484-1631818535 +1469298549-1472797586 +2706655046-2709540287 +2171654937-2192635909 +3997842771-4006631146 +3806238246-3814481469 +3687035617-3693059533 +1714907016-1715546618 +2268214620-2268517442 +4168814485-4173314719 +4290592397-4294496881 +3026587742-3028212258 +109629716-117011951 +2227635708-2258663804 +4153336546-4157695457 +4183028054-4210437625 +1359555284-1365047163 +385317924-388866137 +956914163-980424242 +971923920-984657935 +3372104235-3387022483 +2459697795-2461023615 +4054424978-4061962114 +2531190780-2540332177 +981076936-984403766 +1943900205-1955571856 +1092170655-1096453697 +4188253293-4210273531 +1476473552-1484327172 +422306607-424937626 +3616461090-3629002324 +280581464-294914249 +1814486124-1821348543 +538601282-545721176 +4165166009-4178721021 +1988368657-1999218926 +3683738155-3686068920 +2339202139-2341973045 +1618530377-1618985589 +1061405927-1067161088 +1586686087-1588534608 +4187607606-4189350663 +1129004649-1138049175 +3769446976-3770072852 +2023963853-2036589722 +2154869719-2158914742 +4239846195-4246356778 +4051209708-4054424976 +2896089935-2914808278 +1435815375-1450285026 +145909747-170128283 +1885652106-1891564474 +1282644829-1292952382 +2286826126-2293672278 +818070038-841914149 +3335638754-3341961960 +1618857702-1619359406 +3939705062-3944559184 +2203145858-2219094358 +3769401246-3769482197 +2922943756-2925135318 +3468068444-3477636928 +3778956860-3790280017 +4073540020-4096504022 +3814481471-3828523511 +1415617645-1423826462 +3031527144-3033419898 +4062168143-4068151354 +1286492281-1286940405 +2428194387-2465453645 +801595042-817285567 +63581388-63635672 +4117266117-4119442082 +11602511-25799879 +1092570588-1093985932 +3296956776-3307622345 +2221567222-2221613969 +558232945-558709807 +3639754422-3650743589 +3437931121-3440846855 +3675035968-3681981311 +1433573245-1442758111 +1471139709-1473858291 +629519040-641689686 +4117209430-4119122433 +52713726-57736371 +2706992741-2707821184 +3602086332-3604188767 +3915139262-3922929260 +1634469269-1636558185 +2200025248-2210330662 +3521124209-3529596728 +1086599486-1093798819 +1309801249-1314575942 +3656835500-3663825208 +1519294415-1521662532 +3848027323-3849548785 +1907694975-1914277280 +1318019570-1322413873 +3338464003-3356847371 +3982076981-3997842770 +1267783432-1278940858 +1658689822-1678998548 +2857342978-2887262511 +4061962115-4062168141 +1459666268-1492181176 +2615378909-2638121319 +4134040495-4139294664 +1278940860-1279210793 +670672127-703998141 +1279368008-1294345099 +1816032308-1825117169 +5682-591077 +3367275968-3384214515 +64315567-67820199 +2502622426-2509648235 +2384858144-2400945744 +2328968349-2329640362 +3697104193-3697121849 +2192635910-2197813617 +948400714-955452470 +1616167993-1628568483 +2344207001-2347832306 +4065174279-4066995234 +2501136056-2507987954 +238478069-238584796 +2983949242-3005737605 +2500532521-2503210360 +1393768957-1418940970 +4267061677-4267804887 +1878114-2022850 +1632283898-1647333210 +2400945746-2409724446 +2869179197-2876746583 +1106490177-1115256489 +4061093101-4061131252 +2810396333-2822711292 +885348478-889915910 +1830435071-1837694596 +1837694597-1863586800 +2658513248-2682334850 +2924284916-2928154608 +2880061840-2880744733 +2598258370-2614301028 +2919390200-2945948816 +724929680-734503944 +2662412166-2665780598 +1178177517-1198965930 +1557905942-1573183772 +3563817129-3577035331 +486771190-517575845 +3645420942-3645846054 +703998143-706055398 +2004489841-2043681870 +2409724447-2427949017 +3620235480-3626019843 +1551168080-1572791868 +3438270145-3440465241 +2043792287-2048576193 +4189961855-4207923535 +1572791869-1573838792 +1560630061-1568705988 +1945995416-1972395216 +3154257326-3170804412 +2638121320-2639565458 +641909505-659715145 +706055399-724929678 +1322001994-1348241899 +178460965-196879712 +4290596074-4292022319 +951225450-964656102 +1286720286-1299664178 +4267798816-4281427565 +2473150224-2483209210 +1466959722-1495499946 +202383890-206442882 +2980151171-2982988832 +3724920258-3748749341 +3449375744-3467888004 +4793565-27195454 +2763578266-2769445414 +3551501696-3577270805 +103134511-108233928 +3985777319-3995983153 +4056112707-4056303018 +1113372127-1127291361 +3450126345-3475229161 +4289501916-4292619355 +2447323006-2456025596 +3080941568-3084548509 +3455764745-3467066059 +2180674525-2191641368 +4011611611-4029364618 +2171134-4793563 +315731014-335056809 +3397886846-3414158394 +2762557710-2767579504 +1521662534-1545573024 +1442758112-1459666266 +1415183222-1422510841 +1396869120-1432423701 +173147954-191770601 +307244055-331462148 +303700109-329107070 +3367139562-3375242354 +1257000697-1267783431 +3441110255-3441542687 +868214-1216244 +2348268821-2362581539 +135520676-152981469 +3590167439-3598674695 +1497010928-1519294414 +2990327259-3014332111 +1174787708-1178177515 +3724679263-3737472563 +3530672381-3532472131 +2337479073-2362367605 +204565716-213455559 +2725271867-2749432076 +3527158276-3529338030 +1732731-1878113 +2234307311-2250137487 +3503793539-3507292135 +2764054784-2767560591 +0-97802 +3497142772-3509229752 +2252345137-2252983294 +2511786509-2525437254 +534322385-552469473 +2032077105-2039311638 +1930871028-1935831989 +1999927802-2002593859 +2034870570-2046166201 +2416773420-2418971941 +2326019770-2327054298 +3587252557-3596385967 +3004640283-3006650230 +2504389437-2504604683 +1389927799-1393768955 +458800944-461346308 +1225553472-1229951958 +1901804609-1911376516 +628245201-636898070 +1241514379-1244482846 +1911376517-1924059331 +2179314-4534265 +2590117386-2604230483 +1171067342-1174787707 +1526785599-1531893226 +3055633094-3057199924 +1568124522-1572160758 +2966347008-2978486706 +54831687-66550552 +1550497473-1551168078 +2892926941-2903268722 +2771117187-2775955759 +1234521852-1241992108 +1691973028-1696406355 +2837877932-2849517138 +2480932114-2481698709 +2845946431-2846057821 +1233941434-1246198098 +3002861655-3005365109 +3434725509-3435993674 +2173341542-2184849378 +3896230707-3900645720 +822740965-823550270 +4110021562-4121150778 +63603171-63635151 +3132070451-3134002144 +4152899097-4154706289 +3072535465-3075497811 +2963912450-2969754776 +3143800036-3144360416 +3033532646-3059619065 +2870120437-2886869710 +3274547143-3278505007 +2749432077-2762094882 +1081689983-1081835641 +850604533-852396063 +238560784-238982766 +3023322565-3025688956 +54157058-66147301 +820647222-823031869 +2961003766-2967474817 +1576566644-1606323350 +2582544240-2595513897 +4151772914-4155462854 +71629773-74290540 +2762094884-2762897903 +3179890008-3180299038 +4012179467-4051209707 +1967679449-1971418911 +2845141471-2846053808 +2816320795-2827745715 +3780956085-3792190886 +3098898720-3099568383 +3275561729-3284901540 +1402054763-1425346693 +1070235712-1081689982 +2897914307-2900470075 +2823031175-2825449030 +3751706906-3751753267 +970815395-976275417 +47997723-60304756 +3794263864-3796550694 +2743705045-2750732810 +76689052-80924970 +2919462546-2939875618 +376886072-388318966 +1787682465-1808426641 +856379509-864589444 +2378537309-2380543166 \ No newline at end of file diff --git a/data/2017_05_data.txt b/data/2017_05_data.txt new file mode 100644 index 0000000..0c0a0fa --- /dev/null +++ b/data/2017_05_data.txt @@ -0,0 +1,1003 @@ +1 +1 +1 +1 +0 +0 +0 +-4 +-1 +0 +-3 +-4 +0 +-9 +-3 +2 +-14 +0 +-17 +-12 +-15 +-7 +0 +-7 +-12 +-3 +-17 +-11 +-24 +-10 +-16 +-15 +-28 +-13 +-28 +-15 +-28 +-29 +-20 +0 +-10 +-30 +-13 +-24 +-34 +-42 +-25 +-36 +-38 +-35 +-23 +-11 +-4 +-16 +-15 +-10 +-31 +0 +-16 +-21 +-50 +-26 +-31 +-36 +-53 +-54 +-12 +-28 +1 +-16 +-65 +-69 +-4 +-47 +1 +-42 +-33 +-55 +-72 +-29 +-2 +-62 +-40 +-28 +0 +-42 +-78 +2 +-23 +-86 +-75 +-17 +-15 +-9 +0 +-24 +-36 +-91 +-64 +-65 +-98 +-30 +-21 +-80 +0 +-88 +-105 +-103 +-32 +-54 +-62 +-105 +-68 +-101 +-73 +-26 +-112 +-96 +-66 +-115 +-53 +-69 +-99 +-84 +-46 +-105 +-16 +-18 +-104 +-19 +-16 +-9 +-45 +-40 +-40 +-11 +-105 +-105 +-72 +-89 +-3 +-119 +-74 +-124 +-111 +-128 +-79 +-145 +-138 +-147 +-92 +-44 +-115 +-51 +-139 +-15 +-72 +-116 +-149 +-38 +-55 +-63 +-62 +-3 +-48 +-115 +-33 +-56 +-51 +-28 +-8 +-15 +-162 +-7 +-24 +-72 +-104 +-7 +-23 +-16 +-25 +-169 +-157 +-53 +-123 +-183 +-127 +-98 +-133 +-180 +-96 +-56 +-57 +-123 +-123 +0 +-35 +-174 +-91 +-167 +-121 +-67 +-47 +-201 +0 +-111 +-158 +-36 +-62 +-111 +-114 +-183 +-139 +-108 +-74 +-154 +-12 +-18 +-182 +-217 +-199 +-68 +-212 +-183 +-126 +-56 +-112 +-211 +-203 +-223 +-40 +0 +-225 +-101 +-24 +-91 +-94 +-80 +-190 +-6 +-234 +-2 +-222 +-208 +-46 +-163 +-136 +-45 +-17 +-141 +-18 +-67 +-224 +-39 +-135 +-91 +-91 +-146 +-158 +-70 +-33 +-232 +-54 +-45 +-80 +-124 +-221 +-130 +-236 +-112 +-238 +-11 +-34 +-110 +-198 +-15 +-252 +-230 +-118 +-230 +-193 +-119 +-162 +-214 +-206 +-158 +-199 +-141 +-167 +-9 +-140 +-185 +-126 +-106 +-293 +-142 +-290 +-78 +-137 +-274 +-186 +-88 +-167 +-287 +-218 +-300 +-5 +-81 +-108 +-287 +-276 +-235 +-189 +-116 +-16 +-232 +-32 +-189 +-78 +-8 +-72 +-219 +-12 +-63 +-7 +-114 +-170 +-125 +-162 +-19 +-140 +-152 +-3 +-127 +-314 +-158 +-301 +-153 +-62 +-7 +-94 +-182 +-61 +-6 +-285 +-260 +-123 +-298 +-131 +-66 +-155 +-347 +-181 +-71 +-143 +-232 +-146 +-100 +0 +-101 +-315 +-53 +-348 +-209 +-320 +-212 +-358 +-108 +-101 +-188 +-218 +-309 +-290 +-245 +-253 +-111 +-188 +-104 +-296 +-14 +-306 +-335 +-87 +-284 +-14 +-117 +-143 +-386 +-367 +-292 +-251 +-289 +-340 +-41 +-85 +-52 +-236 +-265 +-265 +-341 +-395 +-110 +-311 +-391 +-79 +-262 +-214 +-395 +-205 +-50 +-318 +-198 +-199 +-44 +-153 +-403 +-261 +-290 +-55 +-321 +-407 +-17 +-30 +-342 +-321 +-37 +-197 +-5 +-305 +-394 +-373 +-297 +-40 +-114 +-240 +-218 +-164 +-334 +-337 +-38 +-124 +-362 +-209 +-79 +-208 +-277 +-341 +-345 +-112 +-137 +-306 +-90 +-10 +-50 +-447 +-445 +-50 +-327 +-374 +-441 +-197 +-231 +-31 +-361 +-444 +-109 +-294 +-452 +-327 +-411 +-137 +-326 +-201 +-217 +-277 +-245 +-263 +-111 +-286 +-265 +-298 +-107 +-204 +-395 +-299 +-175 +-158 +-94 +-34 +2 +-55 +-113 +-278 +-74 +-380 +-167 +-429 +-261 +-57 +-95 +-215 +-392 +-121 +-460 +-250 +-393 +-41 +-183 +-123 +-367 +-387 +-66 +-431 +-399 +-295 +-449 +-10 +-461 +-392 +-277 +-302 +-460 +-197 +-307 +-229 +-296 +-415 +-313 +-334 +-172 +-303 +-439 +-479 +-364 +-156 +-287 +-315 +-265 +-153 +-134 +-238 +-88 +1 +-306 +-399 +-197 +-363 +-156 +-370 +-313 +-365 +-510 +-91 +-464 +-177 +-550 +-95 +-49 +-108 +-24 +-289 +-229 +-547 +0 +-538 +-164 +-202 +-190 +-92 +-302 +-416 +-42 +-148 +-192 +-246 +-118 +-144 +-264 +-497 +-276 +-350 +-318 +-219 +-301 +-398 +-12 +-292 +-395 +-565 +-102 +-118 +-424 +-3 +-473 +-94 +-413 +-145 +-38 +-97 +-485 +-363 +-309 +-250 +-506 +-345 +-346 +-447 +-319 +-330 +-198 +-255 +-353 +-260 +-370 +-22 +-91 +-345 +-333 +-315 +-593 +-450 +-37 +-380 +-543 +-5 +-556 +-164 +-135 +-513 +-56 +-166 +-474 +-14 +-84 +-561 +-596 +-454 +-429 +-457 +-69 +-59 +-597 +-598 +-391 +-260 +-596 +-384 +-267 +-34 +-158 +-531 +-243 +-495 +-165 +-190 +-466 +-574 +-344 +-365 +-277 +-329 +-64 +-616 +-123 +-551 +-537 +-412 +-333 +-589 +-212 +-376 +-290 +-366 +-363 +-477 +-39 +-37 +-495 +-317 +-554 +-675 +-442 +-427 +-407 +-515 +-169 +-113 +-395 +-561 +-358 +-214 +-20 +-424 +-74 +-311 +-110 +-353 +-112 +-217 +-181 +-496 +-336 +-311 +-585 +-407 +-383 +-663 +-266 +-591 +-235 +-266 +-406 +-347 +-268 +-281 +-449 +-569 +-8 +-178 +-62 +-139 +-89 +-72 +-487 +-352 +-164 +-244 +-640 +-139 +-639 +-330 +-348 +-390 +-260 +-632 +-171 +-343 +-700 +-21 +-653 +-250 +-20 +-587 +-357 +-151 +-536 +-287 +-614 +-582 +-564 +-136 +-613 +-130 +-717 +-54 +-35 +-205 +-49 +-711 +-538 +-342 +-222 +-579 +-300 +-641 +-240 +-198 +-76 +-550 +-73 +-528 +-465 +-485 +-327 +-433 +-325 +-441 +-575 +-661 +-126 +-588 +-315 +-651 +-692 +-189 +-656 +-533 +-627 +-459 +-244 +-737 +-422 +-647 +-324 +-759 +-592 +-305 +-281 +-360 +-79 +-271 +-52 +-129 +-416 +-39 +-497 +-147 +-755 +-398 +-382 +-217 +-301 +-581 +-345 +-310 +-68 +-90 +-128 +-303 +-416 +-348 +-745 +-204 +-795 +-482 +-537 +-315 +-662 +-432 +-464 +-239 +-19 +-216 +-230 +-240 +-612 +-129 +-655 +-197 +-369 +-89 +-573 +-180 +-229 +-264 +-268 +-401 +-820 +-412 +-99 +-666 +-360 +-814 +-348 +-755 +-772 +-296 +-851 +-818 +-394 +-161 +-77 +-109 +-362 +-273 +-688 +-574 +-50 +-137 +-550 +-380 +-462 +-851 +-611 +-237 +-853 +-11 +-383 +-767 +-349 +-170 +-389 +-747 +-247 +-462 +-839 +-87 +-852 +-672 +-796 +-839 +-788 +-78 +-151 +-507 +-414 +-363 +-750 +-521 +-468 +-418 +-251 +-803 +-802 +-269 +-766 +-520 +-301 +-156 +-488 +-130 +-100 +-191 +-45 +-352 +-774 +-506 +-306 +-517 +-220 +-62 +-523 +-111 +-157 +-516 +-541 +-888 +-514 +-223 +-902 +-159 +-255 +-699 +-901 +-893 +-273 +-602 +-850 +-382 +-207 +-528 +-566 +-834 +-695 +-25 +-166 +-650 +-569 +-667 +-771 +-809 +-922 +-858 +-53 +-703 +-552 +-584 +-190 +-193 +-146 +-218 +-503 +-252 +-432 +-93 +-180 +-277 +-250 +-610 +-194 +-415 +-67 +-793 +-413 +-930 +-785 +-890 +-417 +-501 +-109 +-839 +-916 +-860 +-467 +-741 +-645 +-795 +-769 +-665 +-974 +-318 +-334 +-963 +-674 +-432 +-402 +-702 +-724 +-524 +-753 +-146 +-719 +-953 \ No newline at end of file diff --git a/data/2018_10_data.txt b/data/2018_10_data.txt new file mode 100644 index 0000000..c071f05 --- /dev/null +++ b/data/2018_10_data.txt @@ -0,0 +1,391 @@ +position=<-50429, 40580> velocity=< 5, -4> +position=< 30528, -40359> velocity=<-3, 4> +position=< 20386, -40351> velocity=<-2, 4> +position=< -9924, 30462> velocity=< 1, -3> +position=<-30203, -50470> velocity=< 3, 5> +position=< 50746, -40351> velocity=<-5, 4> +position=< 50778, -20120> velocity=<-5, 2> +position=<-20046, 10229> velocity=< 2, -1> +position=< 40645, 30467> velocity=<-4, -3> +position=<-50419, -10005> velocity=< 5, 1> +position=<-20089, -9999> velocity=< 2, 1> +position=<-50386, -10003> velocity=< 5, 1> +position=< 40613, -20117> velocity=<-4, 2> +position=<-40272, 50699> velocity=< 4, -5> +position=< 20406, -50467> velocity=<-2, 5> +position=< -9972, -10000> velocity=< 1, 1> +position=< -9921, 10229> velocity=< 1, -1> +position=< 40635, -30240> velocity=<-4, 3> +position=<-50389, -30237> velocity=< 5, 3> +position=< 20390, 10231> velocity=<-2, -1> +position=<-40325, 50694> velocity=< 4, -5> +position=< 20382, 20350> velocity=<-2, -2> +position=< 50749, -10007> velocity=<-5, 1> +position=<-20046, 40584> velocity=< 2, -4> +position=< 40633, -20120> velocity=<-4, 2> +position=< 20416, -10005> velocity=<-2, 1> +position=< 30520, 40577> velocity=<-3, -4> +position=< 20377, -10004> velocity=<-2, 1> +position=< 40608, 20348> velocity=<-4, -2> +position=<-40309, -30237> velocity=< 4, 3> +position=< 10305, -20123> velocity=<-1, 2> +position=< 40669, 30464> velocity=<-4, -3> +position=<-30150, 50700> velocity=< 3, -5> +position=<-20090, -40359> velocity=< 2, 4> +position=< 30496, 20352> velocity=<-3, -2> +position=< 20387, 10235> velocity=<-2, -1> +position=<-50445, 40581> velocity=< 5, -4> +position=< 20398, -20119> velocity=<-2, 2> +position=< 20374, 10232> velocity=<-2, -1> +position=< 20414, -50472> velocity=<-2, 5> +position=< -9916, -9999> velocity=< 1, 1> +position=< 50765, 40585> velocity=<-5, -4> +position=<-50426, 50694> velocity=< 5, -5> +position=< -9920, 50699> velocity=< 1, -5> +position=<-50408, 30464> velocity=< 5, -3> +position=< 50781, -20123> velocity=<-5, 2> +position=<-30211, 30462> velocity=< 3, -3> +position=< 40617, -20116> velocity=<-4, 2> +position=< 50765, 10227> velocity=<-5, -1> +position=<-20066, 40585> velocity=< 2, -4> +position=<-30170, 40582> velocity=< 3, -4> +position=< 10290, 50698> velocity=<-1, -5> +position=<-40318, 10235> velocity=< 4, -1> +position=< 50785, 10227> velocity=<-5, -1> +position=< 30526, 10230> velocity=<-3, -1> +position=< -9977, -20120> velocity=< 1, 2> +position=<-40327, -20121> velocity=< 4, 2> +position=< 10299, -30236> velocity=<-1, 3> +position=< 40632, -20117> velocity=<-4, 2> +position=< -9958, 10230> velocity=< 1, -1> +position=<-50420, -50471> velocity=< 5, 5> +position=< 10281, 50699> velocity=<-1, -5> +position=< 50749, 50700> velocity=<-5, -5> +position=< 50786, 20351> velocity=<-5, -2> +position=< 50776, 20348> velocity=<-5, -2> +position=< 50733, -30238> velocity=<-5, 3> +position=< -9932, -30242> velocity=< 1, 3> +position=< 40612, 30466> velocity=<-4, -3> +position=< 30496, -20122> velocity=<-3, 2> +position=<-30174, 30461> velocity=< 3, -3> +position=< 30534, -50474> velocity=<-3, 5> +position=< 40661, -9999> velocity=<-4, 1> +position=< 30552, 50696> velocity=<-3, -5> +position=< 50775, 30464> velocity=<-5, -3> +position=<-20057, 20345> velocity=< 2, -2> +position=< 20410, 50698> velocity=<-2, -5> +position=< 10297, -50474> velocity=<-1, 5> +position=<-50429, -20118> velocity=< 5, 2> +position=<-40327, -20121> velocity=< 4, 2> +position=<-30194, -20121> velocity=< 3, 2> +position=< -9956, 40580> velocity=< 1, -4> +position=< 20427, -10008> velocity=<-2, 1> +position=< 10257, -20122> velocity=<-1, 2> +position=<-20075, -40355> velocity=< 2, 4> +position=<-20041, 10234> velocity=< 2, -1> +position=<-20033, 30468> velocity=< 2, -3> +position=<-50389, 30464> velocity=< 5, -3> +position=< 50773, -9999> velocity=<-5, 1> +position=<-30179, -50474> velocity=< 3, 5> +position=< 40659, 30465> velocity=<-4, -3> +position=< 50781, -20123> velocity=<-5, 2> +position=< 40632, -10001> velocity=<-4, 1> +position=<-30194, -30238> velocity=< 3, 3> +position=<-20073, -20117> velocity=< 2, 2> +position=< 50730, 10228> velocity=<-5, -1> +position=< 10313, 40579> velocity=<-1, -4> +position=<-50421, -10003> velocity=< 5, 1> +position=< -9924, 40581> velocity=< 1, -4> +position=<-30151, -30237> velocity=< 3, 3> +position=< -9965, 20343> velocity=< 1, -2> +position=< 50759, 50698> velocity=<-5, -5> +position=<-20036, -30237> velocity=< 2, 3> +position=<-20070, -20122> velocity=< 2, 2> +position=< 40641, -50472> velocity=<-4, 5> +position=<-40293, 50698> velocity=< 4, -5> +position=< 50736, -30233> velocity=<-5, 3> +position=<-50389, 20351> velocity=< 5, -2> +position=< 20374, -30234> velocity=<-2, 3> +position=<-20043, -20119> velocity=< 2, 2> +position=<-50445, -10005> velocity=< 5, 1> +position=< -9961, -20116> velocity=< 1, 2> +position=<-40328, 40578> velocity=< 4, -4> +position=<-50405, 10226> velocity=< 5, -1> +position=< 10305, -40359> velocity=<-1, 4> +position=< -9929, -40358> velocity=< 1, 4> +position=< 30499, -50470> velocity=<-3, 5> +position=< 50741, -30234> velocity=<-5, 3> +position=< -9965, 20348> velocity=< 1, -2> +position=<-20062, -30238> velocity=< 2, 3> +position=<-20066, -30234> velocity=< 2, 3> +position=< 50773, 10235> velocity=<-5, -1> +position=< 20430, -40353> velocity=<-2, 4> +position=<-40311, -40359> velocity=< 4, 4> +position=< 50757, -30236> velocity=<-5, 3> +position=<-30198, 20350> velocity=< 3, -2> +position=< 40632, -10006> velocity=<-4, 1> +position=<-50444, -40355> velocity=< 5, 4> +position=< 20422, 10232> velocity=<-2, -1> +position=<-50393, 50701> velocity=< 5, -5> +position=<-50429, -40350> velocity=< 5, 4> +position=<-20046, -30238> velocity=< 2, 3> +position=<-50397, -30233> velocity=< 5, 3> +position=< 40618, -10008> velocity=<-4, 1> +position=<-40271, -10007> velocity=< 4, 1> +position=<-20069, 10230> velocity=< 2, -1> +position=<-30154, 40578> velocity=< 3, -4> +position=<-20057, 50696> velocity=< 2, -5> +position=< 40634, -20119> velocity=<-4, 2> +position=< 30523, -10007> velocity=<-3, 1> +position=< 10305, 50694> velocity=<-1, -5> +position=< 30547, -10003> velocity=<-3, 1> +position=< 10257, -50468> velocity=<-1, 5> +position=< 40628, 10230> velocity=<-4, -1> +position=<-20078, -30233> velocity=< 2, 3> +position=<-40312, -50471> velocity=< 4, 5> +position=< 30500, 20343> velocity=<-3, -2> +position=< 10273, 40585> velocity=<-1, -4> +position=< 10314, -30237> velocity=<-1, 3> +position=< 20414, 40582> velocity=<-2, -4> +position=< 30531, 50701> velocity=<-3, -5> +position=<-30170, -20120> velocity=< 3, 2> +position=<-50413, -20120> velocity=< 5, 2> +position=< -9945, -40359> velocity=< 1, 4> +position=<-40275, 30465> velocity=< 4, -3> +position=<-40312, 40583> velocity=< 4, -4> +position=<-30179, 40580> velocity=< 3, -4> +position=< -9974, 30465> velocity=< 1, -3> +position=< 10284, 10228> velocity=<-1, -1> +position=< 20374, 50694> velocity=<-2, -5> +position=< -9937, 50701> velocity=< 1, -5> +position=<-50441, 50701> velocity=< 5, -5> +position=< 10270, -50468> velocity=<-1, 5> +position=< 50773, 50697> velocity=<-5, -5> +position=< 40619, -40359> velocity=<-4, 4> +position=<-40315, 40586> velocity=< 4, -4> +position=<-30179, 10232> velocity=< 3, -1> +position=<-20049, 30460> velocity=< 2, -3> +position=< 10289, -50473> velocity=<-1, 5> +position=<-20033, -20119> velocity=< 2, 2> +position=< 50766, -40355> velocity=<-5, 4> +position=<-30191, 50701> velocity=< 3, -5> +position=< 10273, 30463> velocity=<-1, -3> +position=< 50778, -9999> velocity=<-5, 1> +position=< 50730, 50695> velocity=<-5, -5> +position=< -9929, -50473> velocity=< 1, 5> +position=< 40644, -20121> velocity=<-4, 2> +position=< 50725, -40352> velocity=<-5, 4> +position=<-50388, 40582> velocity=< 5, -4> +position=< 50741, 20345> velocity=<-5, -2> +position=<-20090, 40581> velocity=< 2, -4> +position=<-30191, -10008> velocity=< 3, 1> +position=< 10273, 20348> velocity=<-1, -2> +position=< 10268, 20343> velocity=<-1, -2> +position=< 30533, 40580> velocity=<-3, -4> +position=<-20041, -40358> velocity=< 2, 4> +position=< 30531, 50703> velocity=<-3, -5> +position=< 50757, -30234> velocity=<-5, 3> +position=<-30187, -9999> velocity=< 3, 1> +position=<-50442, 40582> velocity=< 5, -4> +position=< 50749, -30242> velocity=<-5, 3> +position=<-30158, -20121> velocity=< 3, 2> +position=<-50386, -20125> velocity=< 5, 2> +position=< 40637, 10235> velocity=<-4, -1> +position=<-30203, -20117> velocity=< 3, 2> +position=<-50392, -20118> velocity=< 5, 2> +position=< 30493, 20347> velocity=<-3, -2> +position=<-30163, 40582> velocity=< 3, -4> +position=< 30499, 40580> velocity=<-3, -4> +position=<-50392, -50474> velocity=< 5, 5> +position=<-20085, 10235> velocity=< 2, -1> +position=< 10313, 20346> velocity=<-1, -2> +position=< 40636, 50695> velocity=<-4, -5> +position=<-50384, -30235> velocity=< 5, 3> +position=< -9956, -9999> velocity=< 1, 1> +position=< 30547, 50703> velocity=<-3, -5> +position=< -9957, -50472> velocity=< 1, 5> +position=<-30174, 10232> velocity=< 3, -1> +position=< 30544, 40586> velocity=<-3, -4> +position=< 30552, 40582> velocity=<-3, -4> +position=< 40611, 40577> velocity=<-4, -4> +position=< 30549, -50476> velocity=<-3, 5> +position=< -9945, -50473> velocity=< 1, 5> +position=<-40296, -40352> velocity=< 4, 4> +position=<-30163, -20117> velocity=< 3, 2> +position=<-50405, -40357> velocity=< 5, 4> +position=< 50786, -30236> velocity=<-5, 3> +position=< 50757, -20124> velocity=<-5, 2> +position=< 20392, 10230> velocity=<-2, -1> +position=< 30531, 20348> velocity=<-3, -2> +position=< 50735, 10235> velocity=<-5, -1> +position=<-30198, -30233> velocity=< 3, 3> +position=<-50397, -50469> velocity=< 5, 5> +position=<-50441, 30467> velocity=< 5, -3> +position=<-30163, -10000> velocity=< 3, 1> +position=< 50773, -40355> velocity=<-5, 4> +position=<-20086, -30234> velocity=< 2, 3> +position=< 10276, 40577> velocity=<-1, -4> +position=< 40661, 50700> velocity=<-4, -5> +position=< 50728, 50699> velocity=<-5, -5> +position=< 10313, -40353> velocity=<-1, 4> +position=<-50445, 50697> velocity=< 5, -5> +position=<-20050, 10227> velocity=< 2, -1> +position=< 10315, -40359> velocity=<-1, 4> +position=< 20379, 40579> velocity=<-2, -4> +position=< 30507, -40359> velocity=<-3, 4> +position=<-50444, -50476> velocity=< 5, 5> +position=< 40637, -40350> velocity=<-4, 4> +position=< 20427, -10005> velocity=<-2, 1> +position=< 10318, 10233> velocity=<-1, -1> +position=<-30190, 30463> velocity=< 3, -3> +position=< 10300, 20345> velocity=<-1, -2> +position=<-50408, 40578> velocity=< 5, -4> +position=< 10297, -10002> velocity=<-1, 1> +position=<-20060, 40581> velocity=< 2, -4> +position=< 40640, 20352> velocity=<-4, -2> +position=<-50437, 10231> velocity=< 5, -1> +position=<-50429, -20119> velocity=< 5, 2> +position=<-50396, -50474> velocity=< 5, 5> +position=<-20078, -40358> velocity=< 2, 4> +position=< 20376, -30242> velocity=<-2, 3> +position=< 30528, 50695> velocity=<-3, -5> +position=<-20043, -30236> velocity=< 2, 3> +position=< 40632, 10226> velocity=<-4, -1> +position=<-50413, 20344> velocity=< 5, -2> +position=< -9940, -40356> velocity=< 1, 4> +position=< 10308, 30465> velocity=<-1, -3> +position=<-30171, -20118> velocity=< 3, 2> +position=<-20066, 30461> velocity=< 2, -3> +position=<-40291, -40351> velocity=< 4, 4> +position=<-30191, 50700> velocity=< 3, -5> +position=<-20054, -10007> velocity=< 2, 1> +position=< 10270, 30461> velocity=<-1, -3> +position=< -9940, -30234> velocity=< 1, 3> +position=<-30150, 50703> velocity=< 3, -5> +position=< -9965, -50476> velocity=< 1, 5> +position=< 40664, -10002> velocity=<-4, 1> +position=<-40324, 10230> velocity=< 4, -1> +position=< -9924, -40354> velocity=< 1, 4> +position=< 20416, 20349> velocity=<-2, -2> +position=<-50397, -50471> velocity=< 5, 5> +position=< 40610, -30242> velocity=<-4, 3> +position=< -9964, -30236> velocity=< 1, 3> +position=<-20094, 30464> velocity=< 2, -3> +position=< 40660, -10000> velocity=<-4, 1> +position=<-40311, 50698> velocity=< 4, -5> +position=<-20091, -50472> velocity=< 2, 5> +position=<-30154, -20124> velocity=< 3, 2> +position=<-50389, 10229> velocity=< 5, -1> +position=<-20094, 20344> velocity=< 2, -2> +position=<-20074, -30235> velocity=< 2, 3> +position=<-50433, 30468> velocity=< 5, -3> +position=<-20054, -30238> velocity=< 2, 3> +position=< -9945, -10006> velocity=< 1, 1> +position=< -9945, 20347> velocity=< 1, -2> +position=<-30193, 30460> velocity=< 3, -3> +position=< 40632, 10227> velocity=<-4, -1> +position=<-40315, 20344> velocity=< 4, -2> +position=<-40303, 50698> velocity=< 4, -5> +position=< 30526, 40581> velocity=<-3, -4> +position=<-40300, 10234> velocity=< 4, -1> +position=< 30507, 50700> velocity=<-3, -5> +position=<-20083, -50471> velocity=< 2, 5> +position=< 50733, 20344> velocity=<-5, -2> +position=< -9969, -10006> velocity=< 1, 1> +position=<-30174, 30469> velocity=< 3, -3> +position=< 40660, 50702> velocity=<-4, -5> +position=<-50393, -50468> velocity=< 5, 5> +position=<-20054, 30462> velocity=< 2, -3> +position=<-50404, -10004> velocity=< 5, 1> +position=<-50440, 20351> velocity=< 5, -2> +position=<-20042, -20118> velocity=< 2, 2> +position=< 10289, -40350> velocity=<-1, 4> +position=<-30162, 50695> velocity=< 3, -5> +position=<-30171, 20349> velocity=< 3, -2> +position=<-50413, -20125> velocity=< 5, 2> +position=<-50424, -50467> velocity=< 5, 5> +position=<-40315, 20348> velocity=< 4, -2> +position=<-50392, -50470> velocity=< 5, 5> +position=< 10281, -50473> velocity=<-1, 5> +position=< 20395, -30240> velocity=<-2, 3> +position=< 30499, -40356> velocity=<-3, 4> +position=< 30531, 50697> velocity=<-3, -5> +position=< 50766, 10230> velocity=<-5, -1> +position=<-40291, -40355> velocity=< 4, 4> +position=<-40291, 50699> velocity=< 4, -5> +position=< 20418, 30461> velocity=<-2, -3> +position=<-50400, -50467> velocity=< 5, 5> +position=<-30202, 10226> velocity=< 3, -1> +position=< 30540, 30462> velocity=<-3, -3> +position=< 20376, -10008> velocity=<-2, 1> +position=< -9953, -50473> velocity=< 1, 5> +position=< 30512, 30468> velocity=<-3, -3> +position=<-40328, -10001> velocity=< 4, 1> +position=< -9933, -40351> velocity=< 1, 4> +position=< 40645, 30460> velocity=<-4, -3> +position=<-40316, 50699> velocity=< 4, -5> +position=< -9965, -50476> velocity=< 1, 5> +position=<-20046, -50468> velocity=< 2, 5> +position=< -9921, 40584> velocity=< 1, -4> +position=<-40275, 10232> velocity=< 4, -1> +position=< -9916, 30467> velocity=< 1, -3> +position=<-50445, 20349> velocity=< 5, -2> +position=<-30168, -20118> velocity=< 3, 2> +position=< 50773, -40354> velocity=<-5, 4> +position=<-50397, 40584> velocity=< 5, -4> +position=< 20392, -10008> velocity=<-2, 1> +position=<-40272, -20116> velocity=< 4, 2> +position=<-20078, 30468> velocity=< 2, -3> +position=< 10299, 20346> velocity=<-1, -2> +position=<-40328, -50469> velocity=< 4, 5> +position=< 20395, 50695> velocity=<-2, -5> +position=<-20086, -30236> velocity=< 2, 3> +position=<-30169, 10232> velocity=< 3, -1> +position=<-50396, 10227> velocity=< 5, -1> +position=<-20081, 10232> velocity=< 2, -1> +position=< 20430, 50701> velocity=<-2, -5> +position=< 50775, -10005> velocity=<-5, 1> +position=< 40648, -20125> velocity=<-4, 2> +position=<-30191, 10230> velocity=< 3, -1> +position=<-20062, -10002> velocity=< 2, 1> +position=< 50745, 40577> velocity=<-5, -4> +position=<-30179, -30237> velocity=< 3, 3> +position=< 30544, -20125> velocity=<-3, 2> +position=<-30187, 20347> velocity=< 3, -2> +position=< 50773, 20343> velocity=<-5, -2> +position=<-40267, 40580> velocity=< 4, -4> +position=< 20406, -10000> velocity=<-2, 1> +position=<-40291, 30465> velocity=< 4, -3> +position=<-20084, 50694> velocity=< 2, -5> +position=< 50725, -20124> velocity=<-5, 2> +position=<-20078, 10230> velocity=< 2, -1> +position=< 30528, -20119> velocity=<-3, 2> +position=< 10273, 10227> velocity=<-1, -1> +position=< -9964, 40584> velocity=< 1, -4> +position=<-50445, 10235> velocity=< 5, -1> +position=< 50729, -30236> velocity=<-5, 3> +position=< -9916, 30468> velocity=< 1, -3> +position=<-30167, -20124> velocity=< 3, 2> +position=< 10270, -20117> velocity=<-1, 2> +position=<-50405, 30465> velocity=< 5, -3> +position=<-30184, -50469> velocity=< 3, 5> +position=<-40312, 40584> velocity=< 4, -4> +position=<-20065, 10226> velocity=< 2, -1> +position=< 50762, -9999> velocity=<-5, 1> +position=< 40648, -50475> velocity=<-4, 5> +position=< 20401, 30467> velocity=<-2, -3> +position=<-20081, -10000> velocity=< 2, 1> +position=<-30190, 10229> velocity=< 3, -1> +position=<-50389, 20350> velocity=< 5, -2> +position=< 30520, 10235> velocity=<-3, -1> +position=< -9951, -40356> velocity=< 1, 4> +position=< 40659, -30236> velocity=<-4, 3> +position=< 50762, 30467> velocity=<-5, -3> +position=<-50402, -50469> velocity=< 5, 5> +position=< 40624, -30235> velocity=<-4, 3> +position=< 40629, -30233> velocity=<-4, 3> +position=< -9918, 20348> velocity=< 1, -2> +position=<-30203, -30239> velocity=< 3, 3> +position=<-50387, 20348> velocity=< 5, -2> +position=< 30528, -20125> velocity=<-3, 2> +position=< 20384, -20125> velocity=<-2, 2> \ No newline at end of file diff --git a/data/2018_10_data_SAMPLE.txt b/data/2018_10_data_SAMPLE.txt new file mode 100644 index 0000000..794273a --- /dev/null +++ b/data/2018_10_data_SAMPLE.txt @@ -0,0 +1,31 @@ +position=< 9, 1> velocity=< 0, 2> +position=< 7, 0> velocity=<-1, 0> +position=< 3, -2> velocity=<-1, 1> +position=< 6, 10> velocity=<-2, -1> +position=< 2, -4> velocity=< 2, 2> +position=<-6, 10> velocity=< 2, -2> +position=< 1, 8> velocity=< 1, -1> +position=< 1, 7> velocity=< 1, 0> +position=<-3, 11> velocity=< 1, -2> +position=< 7, 6> velocity=<-1, -1> +position=<-2, 3> velocity=< 1, 0> +position=<-4, 3> velocity=< 2, 0> +position=<10, -3> velocity=<-1, 1> +position=< 5, 11> velocity=< 1, -2> +position=< 4, 7> velocity=< 0, -1> +position=< 8, -2> velocity=< 0, 1> +position=<15, 0> velocity=<-2, 0> +position=< 1, 6> velocity=< 1, 0> +position=< 8, 9> velocity=< 0, -1> +position=< 3, 3> velocity=<-1, 1> +position=< 0, 5> velocity=< 0, -1> +position=<-2, 2> velocity=< 2, 0> +position=< 5, -2> velocity=< 1, 2> +position=< 1, 4> velocity=< 2, 1> +position=<-2, 7> velocity=< 2, -2> +position=< 3, 6> velocity=<-1, -1> +position=< 5, 0> velocity=< 1, 0> +position=<-6, 0> velocity=< 2, 0> +position=< 5, 9> velocity=< 1, -2> +position=<14, 7> velocity=<-2, 0> +position=<-3, 6> velocity=< 2, -1> \ No newline at end of file diff --git a/data/2024_09_data.txt b/data/2024_09_data.txt new file mode 100644 index 0000000..96e2ec6 --- /dev/null +++ b/data/2024_09_data.txt @@ -0,0 +1 @@ +3757112515452571411168788924797849913516953199196383971485363287256821453837652888519332636175284314972817516149789564582078874646458762801512403595788778539994587964111076719860265782786310176920353582325040543376701822901867946536952291189587194548163446998075681297769672277085874218399345332841853953317565584855657229339470995383762540196887741883872363922318627123693067326545332230752229351073631849683913871447615473196133997289443692436428217771997932554764434326587590405652705744454736413030985957681060448270828681411311325085892037236559408314247299164674692271685161942246989880724175544711743292158729615582271423629673741837145936595156344516257696113853756984121010909414684827921220149982631041822531148043492721875797374767608160635579109155454299904023523157747757245043197620104056607423515299564430859422772641172334701418793235778959427223519797834719654682451151255013961566917193859153177456205258596448291573747331246544299717288626614158426338647981107353976911603337167673265623309062432215597741684527452432817877667787873342385026404120254577409538943847564060887099895510555730952312899660521750478013806448794030463891313398747264839185561741523684262559129896871030575380313967818235435438161412315944897779813958676248958459682698685670483572427121541586773364979066101755378576722749939422946045213014386615993645363980221899295213155557523652911946127081105143975361986277662051505816401418723742234551656456526358229968925920722693864036553250387788502322211838252994362961732845194720449782253894365381759923603491329586814173684096436219646252251418382789593795118798129229142895934937792749292124434079697331228918142818338127799378841595368978352557934894342055414945819215585422667697648699549421475973401321279798992538795540932059246587535430422417594172741187253140137914357391291080591459807434865396522933409992495536622473621891166692133857368236354972948515517718376976275415659515773411332112125025438862671167429789936743936371846356248910975919604850701021295817842569975574215330658912765183243550455170101068376298807431106996191312553248844424914480712154994832731521747363971446369063746197206599739349253114563623165525959333842867615534809380556398597973504263835712951967258669302158971428429861456843585288158745524054818863597554894694254637734640841189948064103262624479475697113124499551352914476617346424667683141415378117288455885847194671304061893412623596163789721524657839487458718616346656683588162545388975137054872860438853664043136390675594312691452365469199325120556043414110658044998456554844207166923740549430404860771063661468383220241033705770178867484395192051589917946451469914451892264425351263791582938655195755969876562231619829713945491273544694237157165038672834785516583561628298989498273075178738777542391474873469859248617599414184959953186545667489983678447980507126233940135640177955297734492083261497118393224565437495317520433629693918355140875586862659626763983813967211497918929814286160545853861227582776685593561597172019468050548837489678856848951195174359577448992945327382165947599013472360367049164837746092889210354247149288148719184851877643727428207949546333409193653979769689942050181486924037134374352191481411126593879595247040881699659875828046794617146565969816948347913654746256216735295981331783801881911789837123118030513170699054604253939983409837338820513019525217792695172116959079185682689236221244813430409573407621515127159284766476513081744816243724529131225335177990148165588499434636174044695233431972868197374070341217905026217915562280467973497214597660683269636492628773672661594842501911703299913333595134282277687320873976779960315574763557371549291846971486857193565980699840291672722835931531939117629260266238275872104982847399888324561329178755633553968629883016975214974589821854751334487115504244781198998646439370737799433327172723507236876083179678181189228643136487279396106881336620791849257225648315283044292782795298551259202136212213784423511368408658679015671315495664877774268071719778932721768644454133641626757994826535495122315719115898706721612448704539515062768437956690456846344340635731591964825750927349313822629767396386753310207892144747939971582460631036253188874787542971808273973881946871355768108931554262419899731671478184986663705323997614595546256952675122292890321536302812904719933147919092395153846248137344699168145852577025128020197242637565503768675053247598324484421628698993332829748297115968567647264098277918433339913618655335317623239376767275253699205721625492851015841945502831541985534455425240897134219355811545924094522881425093213886452337241394127379174459597027706941459518396644786243305458704943392597368985982356729535468939892754176552419326885119286077908752175159494945856335795138788225571334452229165338611141784258476641536325583494745531436573453854898072945192186173524752707491445344543941922462689026974383389295639893936693532884631192932625319744636282539812922467357823495065107455301319919127787369292074595293163265578630474633266213409356775869161951914959852558779532169724916181443182844268993693225690721310891788726046125138187934308415123931549890565649179660777863712185986483686086705234107238783458417372635014181098341517133853511661688320417565156673328669867866983263137033331747711330712934467469147699834998493084849840829471452448957946352654748668632721527968187612877437732831688514394975374120765313692352152779338825186515705813578127813262192357843360301451545043752694749973938756808674576370436456188138274124779644759443579359558623748135112144746594434345888158734173185541451546984817531637392849946612258472411225792798865711496465683946212952136143186721211884116770154981456020868127988592808423941044719512424051217982634838237549742178375926277521265519329129691742599686704240669063277572307551227068995141466270458018371789193260446591874646956085269570744811551021147656833063979524986455395664494582675550945584204760937685701960423990432464288895314511895694305462236642994893448575357017523483892558621125345015401145323120695398723962534094912958275541561019984246202122438130951484282321845395203626132260129523603267178156742612201586988877226534165942471428472447264569809834661514198743266529465269389820971716553826638246281122132898788241407485273547641981892354513332532755899797174569912656425864707735938232363630564153986839466852768064976090149325403871268815779158242454166966924332508484791557378331122126337925874718208972799258705769177582454167463887176041583368594750924370958254742276455619411880899097213184255098307961178256514064954387438323448383928569863532866084916541966361948964484497379368645244535555688620762015905024716956795059882359264169815449444025646337753998716747202291526823425357558640169691963699124549505466685566347427127045367570726382143156144625152058983588957815938685896793393099715734417074193530941530701239147187938381453096622023156625955882948420878398676144987370186260563873623449919426465079103737742581915168587032295392892284908118113930102733553431855418377242823332753686463930788044645470246877161862386436918142312097808156635075139647272995312091418934542691747045367131454067981381278358362764619686456290221780589576579029157514121753435728599750295134678292899585542025648424976028745621107272508241137079568818685841599691726537197171976040621486939148596199363047391073753461597075452286688724172130142459625860828056718633521937614379528525693194599775907958254893787325519345835932688312357844292115965461475077415210585249672133252920601192138187873892606530638447185242953528882949755090407412834285314767351985915348391739278068232188351711485785937814517242798378922598872423187691833781819979538547377392686959443017829355302332737078469818668182794384673413595973296836597161474035103548609670608865959088996715824367365488248331492552414654502936842331141646935911361113664965592079792847664595735514883282484445678159786363612954982220674679616048222412928854327468541381259776114747153698934836861628876643782558554324771043851550358312849387876419273399518016546991552285558932381690389547858999493046958054743927971234204837118836101196907160125353719217527684649954872327419536598794396016122753981121376257873740548837209976504377201931876334419775523735491592774234752692326550989849181942329877564169546015767370687759398284469254764266373595279116621147479179273985368479725711643788654182321499774985891513908488428155633398434339815392595316505252274418814399451983873287181433446452512614837036666182517721939918853038311166141776156065311881178194451682349976952989106688143837879999386448293684958464483514338045509814719054662349551734775746353670223125786274339280441669425178937779629622502566103366266373519822255437539442791579432120701988444831143948587376773371237837844151881524438213366985322379564055681640807127523947231298387192846725522337109478319849163495895260325072535063733456314169871641137737547947426190441193389141432897729191298577347353213617578179511482478932122835617989329371242163351187523028852091152840324486817245134492247144265472267022148691157140721493817673238225885528688222615229914366155116666467151763594278575173178382451716601529358172612736799489875076165177466198952940873367113531388536827042765845366025676239376047677667672586632111346824795614582029779248879417924184101271928883514771731042652464909665728276441011326457674723293128274961767559214899705627571874329449798464708673306710249082222454936711763398561257889899548871875812608143412016526572829386724629438359583089398619774611151574474259567541746810989822746622613392505793654767842068381770755075382263653899267451172456298137323950904687907126552743714593306734834936913598225391401012451895859594583566954231199656677240468123774684651133807910127745876395617961795276291263221968238732727476709688242779307469804177261339451157272465531756316244835822774765578218702264146222424838519574214882852667718495757441385038397956369070707130822477617973115344212319128474489859612815789655735224891275613998135233853488692774174073558026657290794125614248489567856445168849275796471257469692645827145153656830757167866015781589558635905936888994428274297449635852938429904410553696608217914516659798209448813322699214207840976818469560123696947787869987307348684233179493129133464199667120176214866034112715996273248615897868744672792879632058718979745099211894683958173745255023707545766754928979444512987524894080877258566449792894625047855494301036409725938385173569951591192027988579497270823066238775218753751312743388369832348445824936474543514958248182871753238298852561832390129861992272326793934844305924654491106491232195482166262029523372549738204259314167633867137313698759691483181781928348699943794681418568175684967428278893111419235639372271279118515748415111523885842393776895209282514529136038102780236422672620968549742084439345929723955577196977466992883424772073285876653820995559956165301590117940448842577688624035529477505862764136335012303292662757985168924368171225285431552891519147263289734184217813895887128579744057706231915725945078838252742483811881324453491923168868339363919965673853895373738992905598185874515814645926369293906238991895483395624054956039574320157767631483845387509494937757528757911786832033622274936560527853368186153121713646584267776750663111814222363515282395348344136445722568534029656898949651887461187314786940939911808769775671181285347157137815859689417062875529821142241958588647689117686911293846919976705099459048711586172062497853672366846888269622379713628017411527864517246147905688847954188440799724709946863512858743402923941186261982493946884970178551691945906653458368524590845947961894623216283378446988203149547171201487773136771595758237874717131075544851958025715486521097554326947541379752338335935244628689848635535410519596267882908333539896653811816915873461183715615812807366189527319050158445664350131367915789983670697854146960987833222621726574151341218569922425582430509516149957749027436416474632472110448615892780532760718071535087394560321161269377704566135148247382658343625396173635358211656732929655202993421414654765887311311951394123891269526742542729575945252027836772616053392230587811758292991142339959668828175638152876103236596074115374636938204481358377922946361931229351326927991184264588408327643053384921528640926022378336362496686074419430547237947077642830559049653546969156751380908998721440518062433752102036181132455362335920859448924392178565273164718180842678577947276221274963153696584020306029221417166873318244728557789674159484668214529241349668575476281710785048722823618099511812697621385732505790852073226617675112642644888985617874167480383116629329272314263792561043579020914861545798787215413849621083875455553290614559602346953640846390762843218218874028979380106840434310133233557747913386333366226191548298142234834986144536741191478079852669821052797067181782317382582581511076982630137784743020266236573329622994199212208352789727371537307520499579486938436859289824574795617510147988728716303965242333792817373213368348928637402085144781288472458349945984142753676644464837407189735848703813195786788493674654975621506771722438523950952340931541743821858086664088315121141782971739926763834716451445661585466086432989108812601684552923483181662895461765479543277814251185122274355528791170207569156063546086957030969126265116834934459766858063826784488755827588142265181892327146711487166890637826433785648864519933733736832165458378717550802849386526144427672359271357788293657538344623639449127073956914723328235969116777832921104349804329848460604555602581848345994919717117454393409952747589307459708219979517696035322492699720921457733375101724249836758622995250669832656855211875384340792810415680488619973778799767344052259519308872776185934410642442835381728569743931909949633887885018892576666399144347724580738259858364614415706282549859248552527078941263892027206571402513597287785680949516949085593070489748733299542619649844819249531993331280979086845169631162628477137076949838694026149362768183781583491049359327672274544034471241168228484277971668339978102268222367527976142154796860943426614712855331241754492260771024831880316588244733595210628244947941734767832338215386722276208542597328331458732835719837615610825398477648781348911774415866242432866179251937892953707946584759275970677218268174243963598073441457423030443621197954727314873259818758518124745029738092931274165138939045637587549443655594608012424845848721398260184811728422908569785992811552867689677972811878396635243288422521769756859785514344113938513671733116927123234111943916548817343842462246993644632743182777121168366597322877704276441584545042271443857328794667968618123574771940388271983671837877304736629583337323475859312649335889419626643727644718195698468210266511545572502242145054959751405559716194597965978747864914542083584687332526781757595633677031117892851253481526293523463317661269654837144479279750271185631211285689197148268364644924896486249374446144908083941395206985372556399691985888238517842816147136249057388387607673969799521949849722162690723817856055883041478762939783604364225376521066746343428539294538391291318633256838772215913067864253657742253064778796571028271470373815978833741048334656494488992458675769132596812394443222108333899961778542536741826074189915815927204613611669845426631521691549636959558650374560143472245414785931697746307989519439861459659426874770819741159679868625902610407328641670477578429116722287123894728331219972657973833545454454916032144876966866906073576079764914512164522916545575385358756478357238406767163638713561854053793985828976924822307975866353463393935286446571672855976631776115763944135219475990186072145388824614168746603357593135387521992124791938455979869997507066367072329517366775463731311471938248225933806886931187798425194225637123831861614859576162129525736079179676825072685156911859485770834784574219109315767633281560394473613080734536592757377122344781556384159450893855652971782245427878533420158329804537338596484981847137306337763035298154162741732971112189208821546168935714965532323951582086828731748974694368607681867849201493454454999044143234585730503254253144192923408237839470847475244395163880814257727858986248981764104593628928696872903677654555718090679534114656272029788775864193315969178831901165502255735575661476664782428719154262959537278453896247854840928661441253805280647493496751847320568115429367654755678117792618799220962363694959285981654126387517699221954517961666375522998581822949999646283416835284965858578640678174571826693852891782348334689429515152116230172597757388631599723383437572492654207096655717354356608145394616496170449464164955144789141259376629293619474398371646889828214652779083225132299064886740483450192963335342642251592348469286673180868182803874213691485755405016887633776594539185621943976990346557817053451460537151165168618510901119961957373549472427393558105484603493169132169594412531188456285452188641167247158527732519122597104820718913725438869947815760137084464266716412741255519885867530292257192072654762678282214018335684261292175249836646958289927070412842456262767564494859428842935712303791517336242464143671133292241931966169921244914826892387206091671468168816855047738544696930131761389826365879496089732629431457901816567144786896747179483495207038342013641945789337726717734467738523469998853624154078616175314213892615383156177226113814855698319658791922942310372181415279219219326164258020279473751079639726591753143859387547526259209858119740407530296498584189834763347420997321699433191518401629394281723844213956333760272839724967768024199878882047394528885055533579979680412239943638661985606841603720419379338619306565228564761142659548694036538830943234698381276039132579952769335654952641414854264267568844384780458160656667234768719656619165258236356752766729314655529689423362834675587047239744898979968593726193192866318479405268761560363541394182444498875072273055261623487466193994417581554920216666754083944152587185739058537631544617317465291291444271426692435472676280662092775678159251231284938648642818329940866489417372706929139460313541386345615676746226799390222038972511632530681458355138373160919537829551282464835636167446357055928593568769734223991714938748563626666455876328481997865237888760172387761668216043433247944021816998364927795967225479947160164847375642175840406688689382466599554017773650793768645117188811448152705832462428848553486942916141675194969614901182913339379924177954825341499685186045659067136730214055286792481335571945504644885790704461173752373745399261412246175196446986847137405959822368302065332162546257222712911817268981988540833828475213506990138859204462477925422861929582202018301460462927592479921846492754403259753088114633895517568550109660417275916661761187681876624923426579327948666613634075206344801537969558712077733183971652154067633076577283468735544488474376719920496545326512919239802366852899589617605475911634754867687947293528194577196674545989487148958528696089953988728175665618473968357165137817437026757977599039257179428163729129541427533335793963538617116913716988183087154281501730106171972994672567602247424054459453512776174537643816377338476472704028881464551356967311147486958897517244334022622952764955702871327385623019287830828874994986472433694712233892467212584197676859548845972514248797238789883930672263599948332666112690558024184564141099879112791284136999233589188412269648516628305142494297567281794275387835825987622182294229247586188642421750266625225578214743712698648797232357149432391526993089395877227519769028904637514036184136634948191432198184854164117954145267279468824413999810599691741880827032685539232526847695997055421455976420997023139659563341908640851740509818611723478527243591671279587269865218682798702511847925187776217153534924374130108378744627869383498959165648144088235324743979717210195988486099934597721361122492446918762651943732788171581044531037426121519732804 \ No newline at end of file