adding in both solutions
This commit is contained in:
@@ -0,0 +1 @@
|
|||||||
|
/target
|
||||||
Generated
+7
@@ -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"
|
||||||
@@ -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]
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
wzsspbssbhshchmmrmprmrfrsfrrjhjphjjtppbfflqfqppdhdbhdhbbjgghgzgsgfsfhfhvvwcwhwwnppsbsggqnnvvtffpssjfjnnltntdtdddptprppjmmqssrlrplllfrrzggbmmlmnmtnnzddfdgfdfsstbstbbzcbbcjcvvfwwwzlzssglsgllnbnmbnmbbgmmppmwwsrrzqqvgqgnqnmmswwrnnbsnnbdbwwqnwqnwwzzqwzqzjqqwbqbccjcwwjlwjwppqfqjffwddrzrjzrjzzzhchjjlqqrggzvvnlvnvjvhvnvjvbbvdvldldbbwddtsscbbhccmbmbppbmmgjggcjjlrrwjwtjwwmffgddwvdvbdbvvhchmhmdmwwbjbjcbbcmbmmslmlslsjjrnrjrjpjcjgcjcjbbwsbsbfssjzsjsggcmcsswgssbbqpbqqdsdqqztzmzpmpbmbvbjjtrjtthwhbhnbhnbnssvpvsppgrrcwrrmqqhpphrpphchvhphqhbqbtttllsrlsrshrrmhmvvrmrnngbgnbnpbprrrftfjtjwwmrmvmcmvmrmwmssrccfbbhppjbpbwbqwbqbzzfmzmtttjbbvcvppmwwrbbzsbzbfzfdzzhrhzhvvsqvsqsnslljwllqlwllvccnttzhtzzpspqspqsqgsssvnsvshvsvqvnvlldbbfdfmmpbpgphhpqhpppchhbfbrfrllntnznrrhdrdhhdhjjgwwqhhfssjbjwjqqbffvvcrchccwmcwcllljtjrrqgrrdcrddvfvwvzzjqqcffgjgzzdhdwdssffjjhccggmtmltlhtthzhvhlvlddsfsbbtjbjcbjcjzcjjpfjfzzpnnbtbqtbqtqptpnplllbzbllhbllnqnttpddqvdqvqmmjnjggnnnhqqfcqcffqppdgpddvqddmhmrhrtrmrzmzhzpzlzqlqpqhphrpppjqqppzbzmmjgggqtggtjthhlclnclcnccmcppdcpddqrrfgrgbbhwhdhrrqtqpqjpqjpqjqqmcqmccnngqqqmtqtssnvnzvvpcpwcwwqcqqqfcqffsvsmvmttttmrrzssghgssjmsmbmvvwggggzhhfvdpgjmmvzbfjghqhrfbpmbvjzwvfmcthrqwdhghpwsspmhpqnmwhjzpnlzfnvhdnnrqwnvctbmjqzhqrpjlwrssdlwqzmsfrfzmgjhnwwnwczswnhsdbvqbmdlvntsdrhrjjcjjhpbblgwhjwdcdjtpvtmslwvncwdjbwzvbpzbvddvssnrhtshrcvnhqnpmjzfswqbbrztnwjcpflfbhnphfwmjvnvtswgfttgjcqcngmmwjlfsprwfcfwcmgrgbnqmzbtzbtbztngvrzpsnrzvhbsdjnzpwwzllgnfdrlwpmnrznqsqcmvnfbnhqjddvcjmtgbpbmsgqdqzflmlmqncmhwltrmdmgnwpfwddrdpfhsgsnggchzjhgpwrsmdzgjtrgmnprhbwbcbpzbdvvstfqcnqzbdjqpmrdbtgcthtclftghhmnrzrjqqsbndhpvmdpfpwdlhvmczvdfgvpqclssvlhqnhlcfnfbvtspdzmgzdctvpdcwchtqhpsgmmblspjdlvgblbpgrfrgnqqsphcsrgfsdmpqscbjmnqrfbcwfthdtswbzthpnvsfbntnbmmgpfzlqwhppvvdrmwbqzbgppbgsqmjfqtmntgwpnccthftwdmvwmnchlbjhsnmbhndczbrhhjpbvnjdzrcndbbmfwfwsjwfgbqhwhrsvlngsbhhlrdjzzbmjpsqhlpzwcsntjhlmngblspmsjrjwsjsrqwnrcwsmcsbmpjwrthbqhrschrmrppnnbmjbvjzlmzsrfdwqlfnfjljftjvzsqdwlhbblqcdlqjbprpcllhlhmwrbrlgfrcqshrtjpnmhljttdvpfnhdjqvjhhfczwvbzqgnzgljcfrbpgwnfhfchwzqmqqzpbcdpqmnbrppzblnnzqrfnmgtljwnfgzwvnjppdbdhbznvpgwhbdjjvlspgwgjsmfsvllpgwlfnnptmwnfsshjjvqzjwrqpvmsphpmftqdllqqdzcjwfvpftgvspprdwvvcnglmbpntghntdwpjvvsppgjvnbjgvtzchtqtwbddncsbrfcvrnvlggvwgmmnfzrswnzjrwthzmdsmzqmzsnrqsnslnhmfqljnnnzshqfqshrhhjmnhdgphctswdbhnrcgnzmmzqpjqbtdfhhltsmvvtntbgsznshhsghblhlhqpmdcfhmnfzvhgnfsfflcfwbfqzmccrjdpfvphtqbrdnzjfmfhbzqcpdnjdcgwprvchlzrcvrghgjqncjvnndbcshntrfsbsnmjlhclnzpfdgztflcpwqpnvlscfndwqzfvcmpgfncszpmwcsrdbrrhdjvmthslfvmlgpqhlgwhqnjljcvhswbsbqfrfhvzwjvdmhzsgbmbmfnbpclqdwhvrlpppszptjvwtvdmfltfqqgjttdggcvllblnnhjqnjzhvpgpzzpzwbpjqbthnjjlmsjgjzqwnjlqrcdmmvsldtcrzqdrcmwqhnhfghdlmzwcspgmlpzhbdsmlwlqnhhvcvdfzmvfwpbfmjtdllprfqzzjpbrshdzgspsrlrwrhdpmznzzqngwrzqpmtwgbsswrnnnfctjhbcftnslsqwjvmfwfdvfqcnsvfsvgstgbzpmljjtlvtnfsdzpvcgbjqwgbgzqbjfgltqvnhffflsbjzfqfrfbssrvvwqvqptmhrbgllqjwptrzgvqgccsrvbgtvmzfzlmtqrgfwhzddsptclbhjlwqfntvjqdvcddnffmbtqrnsvtmlvljcqdsrpggcmqvmmlzwwbgznhblwzjdppvtqzjvcmtfzhdzjplrdbrfrgzpldvnsgqlbwbmfvrbgwzmjmmqdfgwtbgtzmdqnvqbwvcfjhddqvnjtjlhhjnltbtqqvblwlmglrqcrcfjvdntrnqzzbmrjqglmrdcjgnshcghtprjqqsdrmgdnzmzcfqqdtjtrqgtqtgrpmmgzjtcrznmqccjbdpbvrnnbmbzvgdcnrczbctbrsrrqrjnfcdpzlnngwvcdtbbgssvhpptntqdzhcqtlpvzjbfgzggrgrcgtdfjbwdcrpztnfcdbscnlmqmwcbmtnddgbmhwsgvcfdcmhlsvtnqtmrnsjzhppgwvzlmhwwmpfjzrfbhsgntzrdhwswrnfmmmczqrvdrqnhgrvqbdddhglwsftsljvgbnjqfwfzsspdqvgsnlgfsfpvdrjhzcldtrmjjrmdhvvfrjldhhtqnvsvlldjpjbpwstfsmrpmbqbnnpvqtbgjvblthbmwqtfcfgnjscvtbvlqcmlhffpzgjzfscsqwnhrjhvbrrzwqvbjwtwhtqsdbssfgncppnsfgfltdcbjqjzqqtprsbvjzhmchnltvmbsvpvhgzhfhbrnttsqbcmwpdnwqqgdrjrdwdhtzwsmcdffqgsddvbzfjhtfhtnfdbfrwmdtcqshfjrcpswzcptgwgmctpmzjdbqlmqwthmnfplmctpsslcsdtqpqhjtmjdnmnqnjgchwstsmtpvsmgpsbfgwqnzhrdgdvcdlcldfcmjvsdldgbmhltjhczffwmzqssnhfnwftfgpshntjbpjdffjpcmcpwhclrrwqcqzmntjglzgcfrplfpvprtpvpjdlcrfwrtrzdzmhsrsmdcpqqrqgvfpdbmzbzqdfhpplmgfrdghclbclgswvwhhdvcpmpzflpffmptcrwglftztccrpbrvmpnqmqdgjgrrlbtqtvgcjpljttwtdslqjqlsdpblgrqbrtbmtblfbqtbvsqhpqzpqfhjqpmjrmcvqmsbbpjpdncgnjftclbltwszrrfzqbjcdtphcvpmbhppvwjwlprgmghrjzzgnvzlvghnjbzqjpdgzfsnjchpbzqdzpsjmsrvvqwjcpwznlpbjldlrdfqtrzhqzcnpjqbbbf
|
||||||
+160
@@ -0,0 +1,160 @@
|
|||||||
|
#[derive(Debug)]
|
||||||
|
struct Message(Vec<char>);
|
||||||
|
|
||||||
|
impl Message {
|
||||||
|
fn add_char(&mut self, c: char) {
|
||||||
|
self.0.push(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn add_chars(&mut self, chars: Vec<char>) {
|
||||||
|
for c in chars {
|
||||||
|
self.add_char(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_chars(&self) -> Vec<char> {
|
||||||
|
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<char> = 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<char> = 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user