From 1776ed8f5769c3f2f7ce694a9937d9e5e2c86fc9 Mon Sep 17 00:00:00 2001 From: Trevor Merritt Date: Tue, 2 Sep 2025 09:42:27 -0400 Subject: [PATCH] more progress --- 2017/src/bin/2017_01a.rs | 37 +++--- 2018/src/bin/2018_01b.rs | 17 +-- 2018/src/bin/2018_02a.rs | 34 ++++++ 2024/src/bin/2024_02a.rs | 57 ++++----- data/2018_02_data.txt | 250 +++++++++++++++++++++++++++++++++++++++ data/2024_03_data.txt | 6 + 6 files changed, 341 insertions(+), 60 deletions(-) create mode 100644 2018/src/bin/2018_02a.rs create mode 100644 data/2018_02_data.txt create mode 100644 data/2024_03_data.txt diff --git a/2017/src/bin/2017_01a.rs b/2017/src/bin/2017_01a.rs index 15e2c45..5bd33bc 100644 --- a/2017/src/bin/2017_01a.rs +++ b/2017/src/bin/2017_01a.rs @@ -10,25 +10,19 @@ use core::read_data; fn circular_digit_sum(input: &str) -> u32 { + let all_chars: Vec<_> = input.chars().collect(); let mut running_total = 0; - let mut first_char = ' '; - let mut last_char = ' '; let input_length = input.len(); - for (index, char) in input.chars().enumerate() { - if index == 0 { - first_char = char; - } - if index == input_length - 1 { - if char == first_char { - let num_val = char.to_digit(10).unwrap(); - running_total += num_val; + let half_way = input_length / 2; + println!("TOTAL LENGTH FOR INPUT: {input_length} / {half_way}"); + for (index, char) in all_chars.clone().into_iter().enumerate() { + if index < half_way { + if all_chars[index] == all_chars[index + half_way] { + let val = all_chars[index].to_string().parse::().unwrap(); + running_total += (val * 2); } + println!("Checking {index} against {}", index + half_way); } - if char == last_char { - let num_val = char.to_digit(10).unwrap(); - running_total += num_val; - } - last_char = char; } running_total @@ -38,11 +32,12 @@ fn circular_digit_sum(input: &str) -> u32 { fn main() { let binding = read_data("2017_01_data.txt"); let params = vec![ - ("1122", 3), - ("1111", 4), - ("1234", 0), - ("91212129", 9), - (&*binding, 1031) + ("1212", 6), + ("1221", 0), + ("123425", 4), + ("123123", 12), + ("12131415", 4), + (&*binding, 1080) ]; for (param, expected) in params { @@ -52,4 +47,4 @@ fn main() { println!("success!"); } } -// 1031 +// 1080 diff --git a/2018/src/bin/2018_01b.rs b/2018/src/bin/2018_01b.rs index 8ca7ab0..6f0ee4d 100644 --- a/2018/src/bin/2018_01b.rs +++ b/2018/src/bin/2018_01b.rs @@ -5,14 +5,14 @@ use core::read_data; fn main() { let mut visited_locations: HashMap = HashMap::from([(0, 0)]); - // let binding = read_data("2018_01_data.txt"); - // let lines = binding.lines(); - let lines = "-6\n+3\n+8\n+5\n-6".to_string(); + let binding = read_data("2018_01_data.txt"); + let lines = binding.lines(); + // let lines = "-6\n+3\n+8\n+5\n-6".to_string(); let mut working_value = 0i32; - for line in lines.lines() { + for line in lines { let (direction, velocity) = line.split_at(1); - // println!("{line} split to ||{direction}|| and ||{velocity}||"); + println!("[[[[{line}]]]] split to ||{direction}|| and ||{velocity}||"); let direction_val : i32 = velocity.parse().unwrap(); match direction { "+" => { @@ -25,12 +25,15 @@ fn main() { unreachable!("Invalid direction"); } } - print!("{working_value}\t"); + println!("||{working_value}||\t"); if let Some(found) = visited_locations.get(&working_value) { println!("GET SUCCESS -> {working_value} / {found}"); break; } - visited_locations.insert(working_value, 0); + 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_02a.rs b/2018/src/bin/2018_02a.rs new file mode 100644 index 0000000..ac09f88 --- /dev/null +++ b/2018/src/bin/2018_02a.rs @@ -0,0 +1,34 @@ +use std::collections::HashMap; +use core::read_data; + +fn count_letter_frequency(input: &str) -> HashMap { + let mut working = HashMap::new(); + for current_char in input.chars() { + working.entry(current_char).and_modify(|x| *x += 1).or_insert(1); + } + + working +} + +fn main() { + let binding = read_data("2018_02_data.txt"); + let lines = binding.lines(); + let mut num_good = 0; + let mut num_three = 0; + let mut num_two = 0; + + for line in lines { + let result= count_letter_frequency(line); + let mut found_2 = false; + let mut found_3 = false; + for (_, count) in result { + if count == 2 && !found_2 { found_2 = true; num_two += 1;} + if count == 3 && !found_3 { found_3 = true; num_three += 1; } + } + println!("Found {} {} in ||{line}||", + if found_2 { "✅" } else { "❌" }, + if found_3 { "✅" } else { "❌" }); + if found_2 && found_3 { num_good += 1; } + } + println!("Found {num_good} good boxes? / Checksum {}", num_two * num_three); +} diff --git a/2024/src/bin/2024_02a.rs b/2024/src/bin/2024_02a.rs index 1969eb3..677901a 100644 --- a/2024/src/bin/2024_02a.rs +++ b/2024/src/bin/2024_02a.rs @@ -38,12 +38,13 @@ // So, in this example, 2 reports are safe. use std::{env, fs}; +use core::read_data; fn min_max(num1: u32, num2: u32) -> (u32, u32) { (num1.min(num2), num1.max(num2)) } -fn in_range(min: u32, max:u32, target: u32) -> bool { +fn in_range(min: u32, max: u32, target: u32) -> bool { min <= target && target <= max } @@ -54,50 +55,42 @@ fn parse_numbers(s: &str) -> Vec { } fn is_safe(report: &str) -> bool { let mut is_safe = true; - let mut last_reading = 0; let numbers = parse_numbers(report); - println!("numbers: {:?}", numbers); + println!("*******************************************************\nnumbers: {:?}", numbers); let mut is_increasing = numbers[0] < numbers[1]; - println!("Checking report {report}"); - println!("Found is_increasing = {is_increasing} from {}/{}", numbers[0], numbers[1]); + for index in 0..numbers.len() - 1 { + let first = numbers[index]; + let second = numbers[index + 1]; - for (index, reading) in numbers.iter().enumerate() { - println!("Checking {index}->{reading} in {report} / {is_increasing}"); + if first.abs_diff(second) > 3 || first.abs_diff(second) < 1 { + is_safe = false; + } + if is_increasing && first >= second { + is_safe = false; + } + if !is_increasing && first <= second { + is_safe = false; + } } - // for (index, reading) in numbers.enumerate() { - // let reading_u32: u32 = reading.parse().unwrap(); - // if index == 0 { - // // prime it for the report - // last_reading = reading_u32; - // } else if index == 1 { - // if last_reading > reading_u32 { - // is_increasing = false; - // } - // } else { - // let (min,max) = min_max(last_reading as u32, reading_u32); - // - // // changing too fast - // if (max - min) > 2 { is_safe = false; } - // } - // } is_safe } fn main() { - let input_file = format!("{}/{}" , - std::env::var("CARGO_MANIFEST_DIR").unwrap(), - "data/02_data.txt" - ); - - let binding = fs::read_to_string(input_file).unwrap(); - let reports = binding.lines(); + let input_file = read_data("2024_02_data.txt"); + let mut num_safe = 0; + // let input_file = "7 6 4 2 1\n1 2 7 8 9\n9 7 6 2 1\n1 3 2 4 5\n8 6 4 4 1\n1 3 6 7 9"; + let reports = input_file.lines(); for report in reports { - if is_safe(report) { - println!("Handling report of {report} -> Safe: {}", is_safe(report)); + let is_safe = is_safe(report); + println!("Handling report of {report} -> Safe: {}",is_safe); + if is_safe { + num_safe += 1; } } + println!("Found {num_safe} safe readings."); } +// 606 diff --git a/data/2018_02_data.txt b/data/2018_02_data.txt new file mode 100644 index 0000000..d287775 --- /dev/null +++ b/data/2018_02_data.txt @@ -0,0 +1,250 @@ +ayitmcjvlhedbsyoqfzukjpxwt +agirmcjvlheybsyogfzuknpxxt +wgirmcjvlvedbsyoqfzujnpxwt +agizmcjvlhedbsyoqfzuenlxwt +aryrmcjvlheebsyoqfzuknpxwt +agirmcjelhedbsyoqfzukosxwt +azirmcjvlhedbsooqfzuknpxvt +agirmcjvffedbsyoqfzudnpxwt +agilmcjvlhedbsyrqfzuknpxrt +agirmcjvlhndbsyoofzukcpxwt +awirmcjvlhedbsyoqfzuknpxlz +aghrmcjmlhewbsyoqfzuknpxwt +apirmcjvlmedbsyoqfzcknpxwt +jgiricjvlhedbsyrqfzuknpxwt +abirmcjvlbedbsyoqfzuknpxwo +agirmcjvlhedbsyojfzuknpgkt +agicmclvlhedbmyoqfzuknpxwt +aslrzcjvlhedbsyoqfzuknpxwt +agiqmcjvlhedbsymqfzurnpxwt +agirmcjvlwedbsyoqfzuknfxmt +agiumcjvlhedbsyoqfzuknpbyt +xgirxcjvlwedbsyoqfzuknpxwt +bgtrvcjvlhedbsyoqfzuknpxwt +afirmcjvlpedbsyoqvzuknpxwt +agirmcjjvhedbsyoqfzukmpxwt +ggirmcjvlhedbsyoqfzukypxvt +agirmdjulhekbsyoqfzuknpxwt +agirmcjqlhedbsyoqfztknixwt +agirmcjvjhedbsyomfduknpxwt +agirmcjvlhedbgyoqfzuknpxtq +agirmvjvlhbdbsyfqfzuknpxwt +agirmcjvlhedbsyatfzbknpxwt +agirmcjvlrlybsyoqfzuknpxwt +agirmajvlhedbsqovfzuknpxwt +abinmcrvlhedbsyoqfzuknpxwt +agnrmcjvlhedbsyurfzuknpxwt +agirmpjvlhedbsyoqezuknpxct +agirmxjvlhedbsgoqjzuknpxwt +agirmcjvlhehbstoqfzuknpxht +qgirmcjvlhepcsyoqfzuknpxwt +tgirmcjvlhkdbsyoqszuknpxwt +agirmcjvdhedbscoqftuknpxwt +agbrmcjvlhedbsyoqfzukqpxwj +agurmcjvlhedbsyaqfzuknpxmt +agirmcjvohudbsyoqfmuknpxwt +agirmcjvlhekbsyoqfbuktpxwt +agirmcjvlhedhsyoqfzugnnxwt +agirmcjvlhedbsyjqyzuknpxft +agirmcjvlhedbsymufznknpxwt +agirmcjhlheubsyoqfzuknpxmt +agirmcjvlhwdbsywqfzwknpxwt +agirmcjvljedbsgqqfzuknpxwt +aglrmcjelhedbsyoqfzuknpxkt +agxrmcjvlhxdbsyoqfquknpxwt +agirmcjvnhedbsyoqfzuenfxwt +agirmcjvlhedbsyoqfzatnqxwt +agirmcvvlhedbsboqfzuknuxwt +agirncjvlhezbsyoqfzulnpxwt +agiamcjvdiedbsyoqfzuknpxwt +agirmcjvwhedbskoqfzhknpxwt +agiwmcjflhedbsyoqfzulnpxwt +agirmcjvlhedboyoqfzuknpjwl +agivmcjslhedbsyoqfzdknpxwt +agirmcjvlcedbsyoqfzukepxyt +akirmcjvlhjdbssoqfzuknpxwt +agvrmcjvldedmsyoqfzuknpxwt +agirecjvlhidbsyoqfzukbpxwt +abirmcjvlhjdbsyoqfkuknpxwt +agirmcjelhedbfyoqfzuknpxwj +agirmcjvlhedbbyoqrzukwpxwt +akirmcjvlhedbsyoyfzuknplwt +agirmcjvlhedbsydsfzuknpxwq +agirrcjvlhedbsyoqazuknpmwt +aeirmcjvlhedbsyoqfvuknpwwt +akirmcjvlhedbsyoqpzudnpxwt +agijmcjvlhedbsyuqfzunnpxwt +agirmcjilhedasyoqizuknpxwt +agirmczvlhzdbsyoqfzuknpxwx +agirmcjvlhehbsyoifzuknpxwo +agirwcjvlhedbsyoqfzuenpxst +agirmcjvlhedbsyoquzuknhxft +agirmcqvlkedbsyoqfzrknpxwt +agirmcqvlhenbsyoqfzuknpuwt +agirmcjvleedbsyoqfzhhnpxwt +agirmcjvlhembsyrqfauknpxwt +agirmcjvlhedbssoqflcknpxwt +aqirmcjvlnedbsyoqfzuknpxpt +agirmcjqlhedbxpoqfzuknpxwt +fgirmcjvlhedbsyoqfzukqpqwt +aggrmcjvlhpdbsyoqfzuknpxjt +agirmwjvlhedbsywqfzuknpzwt +agirmcailhembsyoqfzuknpxwt +aglrmcjvlhxdbsyoqfzuknpxet +xgirmcjvlhzdbsyoqfzukrpxwt +agvrmcjvuhedbsyoqfzuknpxgt +agikmcjvlhecbsyoqfzuknpxwr +agyrmcjvlhezbsyoqfouknpxwt +agirmcjvfhjdbsyokfzuknpxwt +agkrmjjvlhedtsyoqfzuknpxwt +agirmgjvlhedbiyoqfzuknpxwv +wcirmcjvlhedbsyoqfzuknpxwo +aairmcjvlhedbstoqfguknpxwt +hgirmcjvlhedwfyoqfzuknpxwt +agirmcjvmhfdbmyoqfzuknpxwt +agirmcjvlhvdbsioqfzuanpxwt +agrrmcjvgsedbsyoqfzuknpxwt +agirmcjvlqetbsysqfzuknpxwt +agirccjvlhedbsyoqfzuknkcwt +agirmqjvlhedbsdoqfzkknpxwt +agirmcjvlheobsyopfzuknpxwg +agirmcjolhedbsyofpzuknpxwt +agirmcjnlhedbsyoqkzukfpxwt +agiumcjvlheabsyoqfzuknpxbt +agipmcjvlhedbsyoqfzukupxwz +atirmcrvlhedbsyoqfnuknpxwt +agirmcjvnhedfkyoqfzuknpxwt +agirmrjvlhedboyoqfzvknpxwt +abhrmcjvlhedbtyoqfzuknpxwt +cbirmcjvlhedbfyoqfzuknpxwt +agirmcjvlhedbsyoqfmwknjxwt +ahirmcjvlhedbsloqfzuknpfwt +agarmjjvlhedbsyoqfzyknpxwt +ajirmcjvlhevjsyoqfzuknpxwt +agirmcjvlhpdbstoqfzuknpewt +agirmcsvlhedbsyoqfbupnpxwt +agirmcjvlhexbsyodfzukqpxwt +auiymcjblhedbsyoqfzuknpxwt +azirmcjvchedbsyoqfziknpxwt +aeirmcjvlhedvsyoqfzuonpxwt +agirmcjvlhedbfyoqfbukjpxwt +ygirmcjvlhidbsyoqfzukncxwt +agirmxpvlhedbsyoqffuknpxwt +ztirmcjvlhedosyoqfzuknpxwt +agirmcjvlhepbsyoqfzuenppwt +agirmcjvshedbsyoqnzaknpxwt +awirmcjvlhydbsyoqfzuknoxwt +ucirmcjvlhedbsyoqfjuknpxwt +agirmwjvlhkbbsyoqfzuknpxwt +agirmcjvldedbsyohfzuknpxzt +agirmcjvwhedbsyoqfznknpxgt +agiricjvlhedxqyoqfzuknpxwt +agirmcjvlhzdbjyoqfzukapxwt +agirmcgvlhedbsyoqfzuknaowt +agidmcjvlhedbsyoqayuknpxwt +agirmcjvlhedisnoqfzuknpxnt +wkjrmcjvlhedbsyoqfzuknpxwt +agirmcjvlhedbuyojfzukxpxwt +agkrmcjvlhedbsybqfzurnpxwt +agirmcjvghedbsyoqfzuknexwj +agirmcjvnhedbsyoqfzuznpxit +agirmcjvlbedbsyoqfiukwpxwt +agirlctvlheabsyoqfzuknpxwt +agirmcjzzhedbsyoqfzcknpxwt +akirmcjvlnedbsyoqfzlknpxwt +agirmdjvlhedpsyoqfzuknpjwt +agiyjcuvlhedbsyoqfzuknpxwt +agirmcbvltedysyoqfzuknpxwt +agirmcjvlhedfdyoqfzubnpxwt +agidmcjvlhedesfoqfzuknpxwt +aeirmcjvlhedqsyoqfxuknpxwt +agifmcjvlhedbsyoqfquknptwt +agidmcjvlhedbsyfqfzuknpxwb +agirvcjvlhedbsroqfzuknjxwt +agirmcqvlhddbsyoqfzuknpxwj +agirmcjvlhmdqsyoqizuknpxwt +atirmcjvltedbsyoqfzuknpxwz +agirxnjvlhedbsyoqfzuknpxkt +agihmcjvlhedbsyoqfzukepxqt +agirmcjvlhedbsmoqzsuknpxwt +agirycjvlhedbuyoqfwuknpxwt +agirmcjvlhedbsyoqfzfkrfxwt +agirzcjvlhedbsyoqfhuknpxnt +agigmcjvlhedbsqnqfzuknpxwt +agirmgzvlhedbsyoqfzuonpxwt +agirmcjvqhedbqyoqfzukqpxwt +anarmcjvlhedbsyocfzuknpxwt +agirmcjuihedbshoqfzuknpxwt +agirdckvlhedbsyoqfzxknpxwt +ugirmujvlhwdbsyoqfzuknpxwt +mgirmcjvlheobsyovfzuknpxwt +agirmcjvghedbsyoqfzufxpxwt +agirmcjvlhedbsyoinzuknuxwt +agirmzjvlhbdbsyoqfzlknpxwt +agivmcjvlhedbsconfzuknpxwt +agirmwfvlhedtsyoqfzuknpxwt +agirmcjvlhedbbyoqrzukncxwt +agirmcjvlhelbsyoqfzupnlxwt +agirmmjvluedqsyoqfzuknpxwt +agjrmcjvlhedbsyaqfcuknpxwt +agiwmcjvlhedbsyoqzzuknpswt +agirxcjvlhedbsyoqfyvknpxwt +agirmljvlhedbsyoqkzuknpxjt +agirmcjvchedbsyoqfzmknyxwt +agirmcjvlhedbsyovfzuynpxwl +agtrmcjvlhedysyoqfzuknexwt +agirmcjvmhedbslonfzuknpxwt +agirmcjfshedbsyoqfziknpxwt +agirmcjvlhedbsygqfzkknpbwt +agyrmcivlhedbsyovfzuknpxwt +agirmcjvghedbsyoqjzuknkxwt +agirmcjvlhedqsyoqfzukspxmt +ayirmcjvhhedbsyomfzuknpxwt +agirmcjvlnembsypqfzuknpxwt +agirmcjqlhedbsyuvfzuknpxwt +agirmcjvlhembsybqfzuknpxwa +agirjcfvlhedbsyoqfuuknpxwt +agirmcjvohedbsyowfzuknxxwt +agirmcjvlhedroyoqfzukncxwt +agrrmijvlhedbsyoqfnuknpxwt +agirmjjvlhsdbsyoqfzumnpxwt +agirrcjvnhedbsyoqfzuktpxwt +agirmcjvlzedjsyoqfzuknpdwt +agirmkjvlhedbsyoqfzxinpxwt +agirmcjvlhedbzyojfzuknpvwt +arirmcjvlheddsyoqfzuknrxwt +agirmcjvlhedbsyoqhzuanpxmt +agirmcjvluedbsyoqozuknwxwt +afirmcjwlhedxsyoqfzuknpxwt +agirmcjvlhefbsyoqfkuinpxwt +agirycjvltedbsypqfzuknpxwt +agirmrxvlhedbsyoqfzeknpxwt +agfrmcqvlhedbsyoqxzuknpxwt +agormcjvuhexbsyoqfzuknpxwt +agyrmcjvehddbsyoqfzuknpxwt +agirmcjvlheqbsynqfzgknpxwt +agirmcjvlhedbsloufwuknpxwt +tgirmcjvlwedbsyoqfzuknpqwt +agirmcjvlhesbzyogfzuknpxwt +agitmdjvlhedpsyoqfzuknpjwt +bgirmejvlhtdbsyoqfzuknpxwt +aginmcjvlhedzsyoqfzuknoxwt +agvrzcjvlhedbsuoqfzuknpxwt +agormcjvlhedbsyoqfzuknpodt +agirmcevlhedbgyojfzuknpxwt +agirmcjblhedboytqfzuknpxwt +qgibmcjvlhedbsyoqfzuknbxwt +agirmcjvlhedbsyoafzutnnxwt +agiamcjvchkdbsyoqfzuknpxwt +agirmcjvehedblyoqwzuknpxwt +agirmcpvlhwdbsyoafzuknpxwt +agirmcjvlhtdbsyoqfzumnpxtt +agirmcjalhegtsyoqfzuknpxwt +agirdijvlhedbsyoqfzutnpxwt +agirmckvlhgdbsyovfzuknpxwt +qgmrmcjvlkedbsyoqfzuknpxwt +agirjcjvlhodbsyoqfzuanpxwt +ajirmcjvlhedbpyoqftuknpxwt +cgirmcjvlhedbsyoqfiuonpxwt +ayirmcjvlhedbsyaqfzuknwxwt +agirmcjvlhedbdyoqbzwknpxwt \ No newline at end of file diff --git a/data/2024_03_data.txt b/data/2024_03_data.txt new file mode 100644 index 0000000..28506d4 --- /dev/null +++ b/data/2024_03_data.txt @@ -0,0 +1,6 @@ +%why();how()*-],+!mul(696,865)why()from()how():,;{where()mul(170,685)who()how()*from(881,957)?&select()mul(894,569):mul(648,114);[:from(657,891)how()mul(740,402)what()&/,do()~^why()who(762,850)mul(80,670)what()^mul(627,741),[?<'when()?-{/mul(609,307)mul(432,475)why()>/mul(325,720)how(555,834)-]~]who()from()mul(823,923)<##how()how()*mul(716,717)'[!:mul(694,196)mul(721,78),*mul(239,457)^who()%~who(),:mul(490,688)(select(140,964)~) where()mul(478,704)when()mul(707,387)?*from()[mul(867,836)how()from()%+?mul(574,230);select()&where()&(&!,mul(817,18)~@mul(995,936){:~#}[{what()how(933,435)%mul(698,758)-mul(155,15)^'who();{;when(538,128)what()([mul(987,654)/>@'mul(547,334)#who()who()mul(481,545)[select()}<*@what()@where()mul(297,163)>~;?mul(569,963) who()%;$?)mul(829,771)'^;^$$<}when()mul(551,298)-![>#%mul(269,961);;$%(select()don't()how()+(mul(490,391)why()where()}}]<])-mul(665,733)* ;select()% ;what()who()!mul(651,691)':mul(972,924)mul(898,314)'/when()><}$)select(196,43)when()mul(622,9)mul(790,299<]~>*from()mul(898,775)mul(433,345)?+mul(936,855)>who()@what()mul(110,344)%mul(375,719)?}'{&where(279,765)mul(846,455)^,{~#<{^;mul(266,935how())~:]-? who()mul(516,281)$~mul(443,485){(mul(798,807)%mul(289,360):*why()~{$!*?'do()?how()mul(316,376)*what()where()[mul(829,9)%$!what()$ &mul(140,439)[why() don't()where(451,986)%]from()mul(335,971),where()^,+mul(109,542);]-when()how()*~mul(209,405)who()$mul(132,427)when()#/>$]mul(773,709)]select()@<^mul(976,853)@where()mul(999,764)who()?^@mul(117,681)/{mul(940,729);})}mul(892,189)why()>,how() &mul(22,503)%+#mul(740,5)mul(848,467),where()>~#^[mul(827,812)!#?'what()$why()what()mul(365,268)$select()+mul(208,463)mul(676,938) +;select()why()^mul(356,375)where()mul(644,829)select()+(&what()&]do()mul(371,455)#}when() select()$mul(652,219)how()/%; >#,'+mul(512,393)where()(+@do()!#where(387,495)select()} why(),where();mul(239,141)+where(){$<;*select()+,mul(96,709)#[how()* +mul(912,58)/,how()mul(683,735)$from()]mul(373,231)from()[why()*how()}%when()+mul(136,796){>don't() ;}<>mul(259,152)mul(263,197)select()where()~(}[:&[mul(77,351)^from()from()who(241,994)select()}&mul(171,570)%mul(468,387)[:when()@>what()^who()[mul(985,798)>&when(578,541):*select()?;mul(686,290)~mul(37,211)?/}*-from()>mul(783,730)({]@why()from()when()&mul(419,383]#%why()where()$who())<~#mul(577,971)*;$& !what() ^mul(912,199)how()don't();when()#mul(294,64)select()where(),'mul(928,320)!+mul(356,471)!where()~]%?]@;mul(118,693)$(mul(300,429)%<[mul(921,437)>how()where(){when()(mul(954,689);how()+$mul(339-,,:mul(368,675)mul~how(81,849)from()?%where();;}where()do(){),>:(#{@where()mul(210,692)!{when(386,55)? mul(930,193) '?mul(346,981)&+-mul(118,871)when()who())when(356,533)mul(953,458)[}why()[{<&where()where()when()@&>where()mul(20,206)#when()select()from()why()$mul(900,802)~(;+(what()mul(995,20)$>'mul(652,338)>mul(363,197)', *?mul(574,101)(when()mul(49,923),;[@:)$select()from()when()@mul(228,113),when();&~/!from()mul(8,372)'}mul(994,769(:@from()<}#why()mul(143,743)>^:!who()$%~?mul(117,918)/@from(),$why()(mul(93,84) mul(672,287)*mul(37,58){^when()~!do()when()!:who(100,513)what()-when()}mul(882,415)-why()~>where()'what()from(838,518)]what()do()@who()]~&mul(29,312)when()why()mul(510[^{*how(663,533)~[*&%mul(664,861)?;$*%+{/mulwho(),what()from()who()!,:where();mul(302,326)when()mul(83,497from()mul(35,835)[mul(429,210){#mul(481,597)+how()&++^+mul(945,205)%don't()^mul(687,611)from()~>why() ,when(140,559)mul(164,17)]~}}-who() mul(520,959)select()select() select()*:mul(575,641)how()mul(842,465)mul(322,73)/&'mul(110,310)>why()from()why(498,7)mul(571,479&from()]%%mul(438,202)who(364,547)from()&; mul(248,502)~{what(),[- select()mul(914,662*{%<~when()mul(508,814)do()%*how()who()from()why(640,284) mul(373,756)'>from()when(904,81)}mul(377,402)mul(352,617)where()select(668,44)+$!mul(977,96)mul(925,147)% select()mul(757,594)mul(667,169) when()who()who()who()mul(12,935)where())%what()what()$from(964,723)mul(84,767)^from() @mul(137^mul(543,4)who()how()};>/do()+select()@}&:+}mul(604,839)from()when()~why()~what()}mul(351,200)where()<)what()}mul(433,87)/$ how()-}mul(666,797)#@+who()how()why()?from()mul(772,579),why()why()from()-{;-}mul(602,921)^>mul(471,330)what()};%when()';:*&mul(438,87)^{( where()!$*from()mul(130,21)from()-[mul(797,649)'{from()/when()mul(897,988) ;when()%!'mulwhy(596,766)$'?how()mul(582,139)} ^><;how(171,166)mul(893,362)where()-'from()how(),mul(371,80):'who(808,795)$mul(72,103)[mul(492,476)(when()~select()~[who()#why()mul(21,185),'?/mul(801,258))mul(548,942) +?-$mul(975 &+#select(489,349)*who())who();)mul(124,21)#from()where()+)/*~ -mul(632,17)%$ don't()mul(939,610)from()(!when()^!^mul(154,101)select()#;mul(338,243)~what()how()&; mul(691,416)*who()@what()mul~where()$<]mul(709,640)? ,/^%where()#*mul(36,427)-where()><#select()mul(457,45)@,*who()when()mul(468,642)where(),how()#'mul(209,501)^;@<+mul(598,391){)(>*mul(760,765)!#}who(894,980)when()what()'%[mul(259,651)^]:mul(955,578)from();({>what()select()*;when()mul(145,399){~what()from()where()who()?-]do();%mul(123,308)mul(488,897)?>';$;where()/mul(249,145)>;select()select()}!]^?mul(204,865)$mul(80,588)-] ;(who()how()*mul(434,798)##)mul(44,74)-mul(520,141)/?(^>+/( who()mul(371,961)#who() ?mul(254,744)-who()*mul(499,955)how()from() >?mul(553,995)>)&-select()>mul(625,699)-,;mul(488,493)?mul(315,42)from()/,:$,,*when()mul(887,391)(#%{ mul(613,520)/'?where()why()mul(709,981)~' how())[mul(460,872) when()%@/?mul(319,730)*) #mul(819,598):; #%mul(186,374)%+{mul(252,553)+}*;]:select()[how()mul(54,460)('mul(767,516)what()!&@[- /~-mul(420,721)where(167,817)}mul(393,198)/what()~^:from()'mul(776,849)<{:/ {?:what()select()mul(503,698)(>~when()what()[,mul(325,23)mul(650,340))mul(206,125)*~%^[&how()<;]/^when()%@(mul(793,635)-*~%how()how()where():mul(91,355)how()[mul(816,280)who(847,273)mul(456,335)%^}#+[mul(111,198)/^mul(104,459))when()%/]{[;why()!mul(915,477)$where()#>where()why()what()what()))mul(842,405)@^$who(){'mul(84,674){&} mul(146,155)mul(833,727);{/;@what()mul(532,66)select()['-]!who()what()'mul(415,148)~<-!{^mul(14,736)where()do()@who()%@>'mul(935,316)how()[<;where()@why()>)what()mul(476,701)?~select()': ^from(639,569);mul(797&+>(%];@};+#!/usr/bin/perl[*/>mul(36,243) +/select()->)*how(386,454)from()mul(300,315)from()#!select()- @-<;mul(363,667)@!<*#*/(^mul(834,851)$ where()@mul(872{{#>$']&how()mul(198,844)'%&# )~;'mul(99,189)!why()when()select()where();mul(834,111)who()mul(679,451):mul(39,313)%{mul(173,934))';'mul(798,4)&?select()who()[select()-mul(311,962)mul(698,905);/{>)?select()where()?mul(803,359)}*'[when())('don't()/<{{)mul(43,610)select()(why(267,624)!'mul(151,244@how()+!>?+who()-%don't()#%,<{what()}from()mul(146,224)mul(863,863):{>where()'+&mul(882,828) what(324,690)from()mul(774,186),+]}:where(824,437)!how()~when()mul(871,259)~(?/],mul(114,251)who()) ?%/when()mul(840@mul(198,246)/};{mul(500,813)/(,@[why()?mul(565,846),&&,#mul(148where()who()where()),?%~'$mul(189,297)&} ['}?}what(),mul(248,226)how()mul(945,791)']*mul(820,292)[>/]do()}what()@why()$^what()-?mulwhere()mul(143,508)do())<$&$'mul(717,939)where() ?mul~@mul?$/!@-~mul(271,138)why()-mul(335,285)when()mul(726,957)select()how():select();mul(231,539)-$ mul(726,673){}mul(78,339)mul@<:mul(119,156)[how()@from()!!$select()mul(828,590)mul(182,837)from()mul(683,176)mul(892{!% who()+!^!mul(403,141)}(}{&mul(324,188)%how()mul(97,443)do()how() [mul(292,615)mul(32,672)<(>)^?$##mul(552,878)mul(190~[select(31,208)how(488,878),mul(803,157)from()]how()&mul(126,470+(*&mul(684,992)when()^[mul(292,454)<}}& ]%# mul(628,183){where()why()!where()where(637,929)^+]do()[mul(673,37)mul(26,197)why()^where()where()>who()when()[-mul(732,481)%/how()~:mul(920,980)'>@)select()[when()mul(832,2)^select()>,*!@where()#(mul(806,526),#}'-/~how()mul(373,273)%why()/mul(948,279) %/$mul(673,973){>?&how()?[(mul(93,63) [select()mul(9,899)]mul(348,281)who()mul(703,726)who()%}/!)select():*%mul(638,192):~who()mul(344,465)~+%where()mul(505,323)[); <[(don't()from(930,874)where()^' %where()mul(860,614)mul(970,547)where()mul(856,910)$^}who()/{-<]mul(685,705-[{when():why()why()%^>mul(133,409)where())-mul(494,959)-where())(mul(391,829) why()['-from(),:mul(773,546)^mul(209,866)'>!who()/~ *[mul(96,420):!where()when()>@]mul(963,114) mul(19,791)<>[what()/[(}mul(514,90)!who())from(){why()mul(421,374)']{$}?(when(){mul(290,986)mul(761,102)[where()*what(72,427)&do()@?'where()mul(14,42)!{select(286,515)#why()mul(229,685)who(){&[mul(395,229)where(254,749)]where()~mul(180,611)-[don't()select()<'where()where()*/mul(854,240)how(565,94)(@}@#select()!mul(369,579)(-when()-from()*mul(878,354)from()why()%%>select(315,631)!(mul(44,680)''&~mul(755,993)}?< (mul(164,540)&?(;mul(49,686)how()[mul(892%*why(),-mul(499,202)mul(802,67)@why()how()?>*]-$mul(754,607)why()how()'from()how()}mul(316,411),where()mul(160,695)#from()who()!](^'!mul(72,797)^^how();where())mul(117,420)mul(222,643)what()+*&,^#-who();mul(582,187)^'(what()/mul(762,337)why()[)%:&^'mul(200,220)#what()[~(mul(869,922)-~mul(174,220)[)#how()+when()>'mul(336,741){[^]+!{^]?mul(72,869)why()mul(968,607)([~!-[/how()%when()mul(315,514)/*<#/?mul(287,442)< ;)*:~?why()mul(932,398); mul(339,6)what()what()%'!$-mul(541,481)*:%mul(278,722) '/mul(221,745)when()?why()'how()&select()mul(863,756)why())?mul(853,974)'~#*when()mul[^},mul(426,383);mul(363,22)+mul(48,755)'[?!+,}select()+mul(450,379) from()where()@![-#mul(504,685)what()!({how()/where()select()select(75,232)(mul(57,262)select()(mul(101,248)$~what()select()who() /!mul(963,497)*where()!~%how()>where()%select(185,346)mul(656,42)@?)$-mul(685,559)how(){^how()from()):]+mul(20,248)'-don't()mul(795,333)^}when();?!)#~+mul(391,920)select()why(998,378)when()((why()why()mul(270,352)[-&>/:why()~,mul(152,35):select()select()select(781,981)mul(262,158)@&%{mul(34,360)where()from(),what()mul(187what()mul(729,608)%mul(339,440)**'!!mul(979,318)''+mul(836,175),<^:(!%{:~mul(829,318)*&?-/[/why()why()~do()~select();(-[mul(558,465)from()who()who()//)-mul(339,776)';}what()from(837,48)how()don't()]where()mul(154,719)#{{mul(308,919)@~*)mul(354,252)select(481,19)who()from(447,581)&%what()>when()mul(261,491)mul(148,283)select()mul(891,12)!$mul(705,454)<$)how()~mul(569,693why()mul(66,218)<^mul(31,825):*what()why()[;#mul(436,424)%how()>[how(727,535)%!do(),~~/mul(269,856)mul(857,460)>%?]/mul(792,512)&},*#mul(744,858);+[#!)(%-?mul(330,415)do()where()mul(527,833):where()+>-!mul(223,83)#![ how()!/mul(549,333),mul(595,422)~mul(980,75)<%^<^~%$mul(403,977)who()![<~what()])/from()mul(862,856)#^&?select()> &+mul^)<^-{when()~{%mul(245,795))who())mul(998,777):@%how()mul(855,136where()<(]@what()#:how()>!mul(385,193)~-what()^why(){mul(844,123)what()#)&?mul(268,192)~&;how()when()>([)mul(316,777)mul(517,887)>(+,what(){mul(488,952)^?- mul(910,954)!%%mul(489,386)mul(665,70)%~when(620,413)/-{%mul(359-?+where()select()~mul(280,485)select()^:mul(821,371)who()}, why(){what(698,375)##^#?}mul(49,637)where()/+[^@)$?mul(60,27)-:>why()#;$do()what(),&@-mul(197,825)when(177,701)-[@^why()#mul(113,357)#}why()/mul(779,647)/why()%from()mul(475,558)@?}who()what()~#; @mul(449,48)why();)[]#,>mul(909,644)%~>don't():##[:mul(203,56)[who()mul(5,956)~select()mul(542,429)!'mul(334,58)@:']/:^mul(315,673)mul(266,818)where():why()'do()-}why()?>when()''$#mul(356,845): mul(75,208)*'*mul(197,931)from()>)&#+]mul(773,636)why()where()^}where()mul(895,801)from()(/^who()}why()[~don't()>!,why():,@where()}mul(630,443):~}$-':<;mul(200,170'[where()how()+};where()mul(79,420)[+@#/select()!;mul(976,90)},}[~>mul(718,701)select()who(46,555)where()^@]?mul(709,96)why()when()'!(where()[mul(918,71)select()?~,how()*{mul(791,355)(mul;,;[mul(909,333)^~mul(152,45)why(935,832)@$;&}mul(202,733)@mul(631,457)$^:+from()select()+'select()mul(35,298)%,~:; mul(459,590)[how()*!]/!select()don't()mul(127,226)when()[why()mul(921;!& what()+>@&what()where()mul(926,614)mul}{'(mul(74,647)&from()?+*~*;*mul(42,7)how();-mul(991,55)where()}-:who()]why()&mul(803,14)^'how(301,29)select()mul(904,721)how()+from(209,448)}-:& ,(mul(786,950)when()}from()how();@-how()mul(44,272):>mul(780,770)mul(983,607)}mul(537,296)why(){mul(183,498) $mul(447,332)mul(857,945)&mul(211,6)-]%&mul(217,55)]where()*select()how():#$mul(610,760)]when()!%[$'mul(812,579)#select()*+how() %mul(650,756)&!,don't()&mul(467,791)<$]?where()mul(708,303)@mul(664,527)[?'mul(459,591)*}%who())select()~:mul(237,606)how()>mul(133,311)mul(554,252)?when(493,438)'^{(do()<{ mul(286,334)(-;how()where()how();;mul(388,580)>select()from()mul(120,119)?*&select()who()mul(375,829)why()+%from()why(),*}+mul(378,224)#mul(330,898)mul(551,592)why()>don't()++'$}mul(660,503)+/ who()why():*mul(978,917)+;[select()-( }mul(848,970)mul(48,20)/$,mul(942,625)+mul(220,813)who()select()~&mul(916,14):!!from(),how()~where()what(647,454)mul(31,90)]/&)<}mul(689,827)@[mul(626,927)'&;))![where()mul(608,109)*mul(317,649)why()'mul(547,176)-who()]@#:mul(465,974)&;[mul(801,152)%[~$who()(mul(229,210)}({)who()how()^where(480,366)^/mul(218,42)&*select(905,451)when()]who()):from()how()do()&what()@from()@select()&