commit a5055b533fe3dec2f6158922edd7657d97beea5c Author: talksik Date: Thu Jun 22 09:51:30 2023 -0700 adding in both solutions diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..e4f2646 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "day-6" +version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..dc6f29d --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "day-6" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/input.txt b/input.txt new file mode 100644 index 0000000..4d2ae34 --- /dev/null +++ b/input.txt @@ -0,0 +1 @@ +wzsspbssbhshchmmrmprmrfrsfrrjhjphjjtppbfflqfqppdhdbhdhbbjgghgzgsgfsfhfhvvwcwhwwnppsbsggqnnvvtffpssjfjnnltntdtdddptprppjmmqssrlrplllfrrzggbmmlmnmtnnzddfdgfdfsstbstbbzcbbcjcvvfwwwzlzssglsgllnbnmbnmbbgmmppmwwsrrzqqvgqgnqnmmswwrnnbsnnbdbwwqnwqnwwzzqwzqzjqqwbqbccjcwwjlwjwppqfqjffwddrzrjzrjzzzhchjjlqqrggzvvnlvnvjvhvnvjvbbvdvldldbbwddtsscbbhccmbmbppbmmgjggcjjlrrwjwtjwwmffgddwvdvbdbvvhchmhmdmwwbjbjcbbcmbmmslmlslsjjrnrjrjpjcjgcjcjbbwsbsbfssjzsjsggcmcsswgssbbqpbqqdsdqqztzmzpmpbmbvbjjtrjtthwhbhnbhnbnssvpvsppgrrcwrrmqqhpphrpphchvhphqhbqbtttllsrlsrshrrmhmvvrmrnngbgnbnpbprrrftfjtjwwmrmvmcmvmrmwmssrccfbbhppjbpbwbqwbqbzzfmzmtttjbbvcvppmwwrbbzsbzbfzfdzzhrhzhvvsqvsqsnslljwllqlwllvccnttzhtzzpspqspqsqgsssvnsvshvsvqvnvlldbbfdfmmpbpgphhpqhpppchhbfbrfrllntnznrrhdrdhhdhjjgwwqhhfssjbjwjqqbffvvcrchccwmcwcllljtjrrqgrrdcrddvfvwvzzjqqcffgjgzzdhdwdssffjjhccggmtmltlhtthzhvhlvlddsfsbbtjbjcbjcjzcjjpfjfzzpnnbtbqtbqtqptpnplllbzbllhbllnqnttpddqvdqvqmmjnjggnnnhqqfcqcffqppdgpddvqddmhmrhrtrmrzmzhzpzlzqlqpqhphrpppjqqppzbzmmjgggqtggtjthhlclnclcnccmcppdcpddqrrfgrgbbhwhdhrrqtqpqjpqjpqjqqmcqmccnngqqqmtqtssnvnzvvpcpwcwwqcqqqfcqffsvsmvmttttmrrzssghgssjmsmbmvvwggggzhhfvdpgjmmvzbfjghqhrfbpmbvjzwvfmcthrqwdhghpwsspmhpqnmwhjzpnlzfnvhdnnrqwnvctbmjqzhqrpjlwrssdlwqzmsfrfzmgjhnwwnwczswnhsdbvqbmdlvntsdrhrjjcjjhpbblgwhjwdcdjtpvtmslwvncwdjbwzvbpzbvddvssnrhtshrcvnhqnpmjzfswqbbrztnwjcpflfbhnphfwmjvnvtswgfttgjcqcngmmwjlfsprwfcfwcmgrgbnqmzbtzbtbztngvrzpsnrzvhbsdjnzpwwzllgnfdrlwpmnrznqsqcmvnfbnhqjddvcjmtgbpbmsgqdqzflmlmqncmhwltrmdmgnwpfwddrdpfhsgsnggchzjhgpwrsmdzgjtrgmnprhbwbcbpzbdvvstfqcnqzbdjqpmrdbtgcthtclftghhmnrzrjqqsbndhpvmdpfpwdlhvmczvdfgvpqclssvlhqnhlcfnfbvtspdzmgzdctvpdcwchtqhpsgmmblspjdlvgblbpgrfrgnqqsphcsrgfsdmpqscbjmnqrfbcwfthdtswbzthpnvsfbntnbmmgpfzlqwhppvvdrmwbqzbgppbgsqmjfqtmntgwpnccthftwdmvwmnchlbjhsnmbhndczbrhhjpbvnjdzrcndbbmfwfwsjwfgbqhwhrsvlngsbhhlrdjzzbmjpsqhlpzwcsntjhlmngblspmsjrjwsjsrqwnrcwsmcsbmpjwrthbqhrschrmrppnnbmjbvjzlmzsrfdwqlfnfjljftjvzsqdwlhbblqcdlqjbprpcllhlhmwrbrlgfrcqshrtjpnmhljttdvpfnhdjqvjhhfczwvbzqgnzgljcfrbpgwnfhfchwzqmqqzpbcdpqmnbrppzblnnzqrfnmgtljwnfgzwvnjppdbdhbznvpgwhbdjjvlspgwgjsmfsvllpgwlfnnptmwnfsshjjvqzjwrqpvmsphpmftqdllqqdzcjwfvpftgvspprdwvvcnglmbpntghntdwpjvvsppgjvnbjgvtzchtqtwbddncsbrfcvrnvlggvwgmmnfzrswnzjrwthzmdsmzqmzsnrqsnslnhmfqljnnnzshqfqshrhhjmnhdgphctswdbhnrcgnzmmzqpjqbtdfhhltsmvvtntbgsznshhsghblhlhqpmdcfhmnfzvhgnfsfflcfwbfqzmccrjdpfvphtqbrdnzjfmfhbzqcpdnjdcgwprvchlzrcvrghgjqncjvnndbcshntrfsbsnmjlhclnzpfdgztflcpwqpnvlscfndwqzfvcmpgfncszpmwcsrdbrrhdjvmthslfvmlgpqhlgwhqnjljcvhswbsbqfrfhvzwjvdmhzsgbmbmfnbpclqdwhvrlpppszptjvwtvdmfltfqqgjttdggcvllblnnhjqnjzhvpgpzzpzwbpjqbthnjjlmsjgjzqwnjlqrcdmmvsldtcrzqdrcmwqhnhfghdlmzwcspgmlpzhbdsmlwlqnhhvcvdfzmvfwpbfmjtdllprfqzzjpbrshdzgspsrlrwrhdpmznzzqngwrzqpmtwgbsswrnnnfctjhbcftnslsqwjvmfwfdvfqcnsvfsvgstgbzpmljjtlvtnfsdzpvcgbjqwgbgzqbjfgltqvnhffflsbjzfqfrfbssrvvwqvqptmhrbgllqjwptrzgvqgccsrvbgtvmzfzlmtqrgfwhzddsptclbhjlwqfntvjqdvcddnffmbtqrnsvtmlvljcqdsrpggcmqvmmlzwwbgznhblwzjdppvtqzjvcmtfzhdzjplrdbrfrgzpldvnsgqlbwbmfvrbgwzmjmmqdfgwtbgtzmdqnvqbwvcfjhddqvnjtjlhhjnltbtqqvblwlmglrqcrcfjvdntrnqzzbmrjqglmrdcjgnshcghtprjqqsdrmgdnzmzcfqqdtjtrqgtqtgrpmmgzjtcrznmqccjbdpbvrnnbmbzvgdcnrczbctbrsrrqrjnfcdpzlnngwvcdtbbgssvhpptntqdzhcqtlpvzjbfgzggrgrcgtdfjbwdcrpztnfcdbscnlmqmwcbmtnddgbmhwsgvcfdcmhlsvtnqtmrnsjzhppgwvzlmhwwmpfjzrfbhsgntzrdhwswrnfmmmczqrvdrqnhgrvqbdddhglwsftsljvgbnjqfwfzsspdqvgsnlgfsfpvdrjhzcldtrmjjrmdhvvfrjldhhtqnvsvlldjpjbpwstfsmrpmbqbnnpvqtbgjvblthbmwqtfcfgnjscvtbvlqcmlhffpzgjzfscsqwnhrjhvbrrzwqvbjwtwhtqsdbssfgncppnsfgfltdcbjqjzqqtprsbvjzhmchnltvmbsvpvhgzhfhbrnttsqbcmwpdnwqqgdrjrdwdhtzwsmcdffqgsddvbzfjhtfhtnfdbfrwmdtcqshfjrcpswzcptgwgmctpmzjdbqlmqwthmnfplmctpsslcsdtqpqhjtmjdnmnqnjgchwstsmtpvsmgpsbfgwqnzhrdgdvcdlcldfcmjvsdldgbmhltjhczffwmzqssnhfnwftfgpshntjbpjdffjpcmcpwhclrrwqcqzmntjglzgcfrplfpvprtpvpjdlcrfwrtrzdzmhsrsmdcpqqrqgvfpdbmzbzqdfhpplmgfrdghclbclgswvwhhdvcpmpzflpffmptcrwglftztccrpbrvmpnqmqdgjgrrlbtqtvgcjpljttwtdslqjqlsdpblgrqbrtbmtblfbqtbvsqhpqzpqfhjqpmjrmcvqmsbbpjpdncgnjftclbltwszrrfzqbjcdtphcvpmbhppvwjwlprgmghrjzzgnvzlvghnjbzqjpdgzfsnjchpbzqdzpsjmsrvvqwjcpwznlpbjldlrdfqtrzhqzcnpjqbbbf diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..b1d0a54 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,160 @@ +#[derive(Debug)] +struct Message(Vec); + +impl Message { + fn add_char(&mut self, c: char) { + self.0.push(c); + } + + fn add_chars(&mut self, chars: Vec) { + for c in chars { + self.add_char(c); + } + } + + fn get_chars(&self) -> Vec { + self.0.clone() + } + + fn get_count(&self) -> usize { + self.0.len() + } + + // check that each char is unique, and that there are 4 characters + fn is_winning(&self) -> bool { + let mut unique_chars: Vec = Vec::new(); + + for &c in self.0.iter() { + if !unique_chars.contains(&c) { + unique_chars.push(c); + } + } + + unique_chars.len() == 4 + } + + fn is_winning_two(&self) -> bool { + let mut unique_chars: Vec = Vec::new(); + + for &c in self.0.iter() { + if !unique_chars.contains(&c) { + unique_chars.push(c); + } + } + + unique_chars.len() == self.get_count() + } +} + +// part 2 +fn get_first_message_marker(sequence: &str) -> u32 { + for (i, c) in sequence.chars().enumerate() { + let mut message = Message(Vec::new()); + message.add_char(c); + + // get the next 3 characters + for j in i + 1..i + 14 { + // account for end of entire sequence + if j < sequence.len() { + message.add_char( + sequence + .chars() + .nth(j) + .expect("unable to get char at position"), + ); + } + } + + // check if we have a winning sequence and return the index after + if message.is_winning_two() { + return (i + 14) as u32; + } + } + + 0 +} + +// part 1 +// gets the index after the first marker sequence +fn get_first_marker_index(sequence: &str) -> u32 { + // go through and start a new sequence every character + // if we have a repeat for any of the sequences, delete that sequence + // return if we have a sequence with 4 unique characters and return the index after + + for (i, c) in sequence.chars().enumerate() { + let mut message = Message(Vec::new()); + message.add_char(c); + + // get the next 3 characters + for j in i + 1..i + 4 { + // account for end of entire sequence + if j < sequence.len() { + message.add_char( + sequence + .chars() + .nth(j) + .expect("unable to get char at position"), + ); + } + } + + // check if we have a winning sequence and return the index after + if message.is_winning() { + return (i + 4) as u32; + } + } + + 0 +} + +fn read_input() -> String { + include_str!("../input.txt").to_string() +} + +fn main() { + println!("Hello, world!"); + + let input = read_input(); + let answer = get_first_marker_index(&input); + + println!("part 1: {}", answer); + + let answer_two = get_first_message_marker(&input); + println!("part 2: {}", answer_two); +} + +#[cfg(test)] +mod tests { + use super::*; + + // part 1 + #[test] + fn test_simple_sequences_marker() { + let sequence_one = "mjqjpqmgbljsphdztnvjfqwrcgsmlb"; + let sequence_two = "bvwbjplbgvbhsrlpgdmjqwftvncz"; + let sequence_three = "nppdvjthqldpwncqszvftbrmjlhg"; + let sequence_four = "nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg"; + let sequence_five = "zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw"; + + assert_eq!(get_first_marker_index(sequence_one), 7); + assert_eq!(get_first_marker_index(sequence_two), 5); + assert_eq!(get_first_marker_index(sequence_three), 6); + assert_eq!(get_first_marker_index(sequence_four), 10); + assert_eq!(get_first_marker_index(sequence_five), 11); + } + + #[test] + fn test_part_two() { + let sequence_one = "mjqjpqmgbljsphdztnvjfqwrcgsmlb"; + let sequence_two = "bvwbjplbgvbhsrlpgdmjqwftvncz"; + let sequence_three = "nppdvjthqldpwncqszvftbrmjlhg"; + let sequence_four = "nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg"; + let sequence_five = "zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw"; + + assert_eq!(get_first_message_marker(sequence_one), 19); + assert_eq!(get_first_message_marker(sequence_two), 23); + assert_eq!(get_first_message_marker(sequence_three), 23); + assert_eq!(get_first_message_marker(sequence_four), 29); + assert_eq!(get_first_message_marker(sequence_five), 26); + } +}