summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShivesh Mandalia <mail@shivesh.org>2022-12-21 21:20:05 +0000
committerShivesh Mandalia <mail@shivesh.org>2022-12-21 21:20:05 +0000
commit8f85eafcf28ecc77607ad2b54b4bde3bd07885bb (patch)
treeff0ae03dd95beb1bc8c6020c87190aae7fb171cb
parent666b11bc77f17d6d2b5a466c56ea7710bb9134fd (diff)
downloadadvent_of_code_2022-8f85eafcf28ecc77607ad2b54b4bde3bd07885bb.tar.gz
advent_of_code_2022-8f85eafcf28ecc77607ad2b54b4bde3bd07885bb.zip
complete day 6
-rw-r--r--Cargo.lock16
-rw-r--r--Cargo.toml4
-rw-r--r--day06a/Cargo.toml10
-rw-r--r--day06a/examples/input.txt1
-rw-r--r--day06a/examples/test0.txt1
-rw-r--r--day06a/examples/test1.txt1
-rw-r--r--day06a/examples/test2.txt1
-rw-r--r--day06a/examples/test3.txt1
-rw-r--r--day06a/examples/test4.txt1
-rw-r--r--day06a/src/main.rs85
-rw-r--r--day06b/Cargo.toml10
-rw-r--r--day06b/examples/input.txt1
-rw-r--r--day06b/examples/test0.txt1
-rw-r--r--day06b/examples/test1.txt1
-rw-r--r--day06b/examples/test2.txt1
-rw-r--r--day06b/examples/test3.txt1
-rw-r--r--day06b/examples/test4.txt1
-rw-r--r--day06b/src/main.rs51
18 files changed, 186 insertions, 2 deletions
diff --git a/Cargo.lock b/Cargo.lock
index c0862c3..bf29a61 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -147,6 +147,22 @@ dependencies = [
]
[[package]]
+name = "day06a"
+version = "0.1.0"
+dependencies = [
+ "clap",
+ "itertools",
+]
+
+[[package]]
+name = "day06b"
+version = "0.1.0"
+dependencies = [
+ "clap",
+ "itertools",
+]
+
+[[package]]
name = "either"
version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/Cargo.toml b/Cargo.toml
index 17d12d3..44b90b0 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -11,8 +11,8 @@ members = [
"day04b",
"day05a",
"day05b",
- # "day06a",
- # "day06b",
+ "day06a",
+ "day06b",
# "day07a",
# "day07b",
# "day08a",
diff --git a/day06a/Cargo.toml b/day06a/Cargo.toml
new file mode 100644
index 0000000..4a6665c
--- /dev/null
+++ b/day06a/Cargo.toml
@@ -0,0 +1,10 @@
+[package]
+name = "day06a"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+clap = { version = "3.2.20", features = ["derive"] }
+itertools = "0.10.5"
diff --git a/day06a/examples/input.txt b/day06a/examples/input.txt
new file mode 100644
index 0000000..636557c
--- /dev/null
+++ b/day06a/examples/input.txt
@@ -0,0 +1 @@
+gzbzwzjwwrfftfrrbvvcbcvcffpssvhhzfzbfzzrbrtrcttnthnhsnhsnnclcpctpprwwgppppchhvvctvtsvswwcdcrrdzdhzdzvddvfvfjjlldvvfllfhlfhlhghnhghrgrsggvbbhdhffzggmttjqtjjgljjwtjwjggldlzzrfrpppjsjggqrrdbbgwgtwwwtqwtqqvccjnnhrhqqsnssjbssmjjbzjjqnqnlnjncjjzzqddfqqqnqvnqncqqmsshqqccssvpvllbbfvfmmmgzgdggtjgjtjbttngtnnhhfrfddmtmtftcftthvttwzwrzrbrgrbrqbqccmmtvtqvtqqzmzwmzzzsvzvhhhqlhqlqplpggvmvwmmshhnshsjszzljlnlrnllgddqllpmllsgswwqnqlnlqqlmqqvrqvrqrppvrrqwqhqllgjgcggsllqgllghlghhbvhhcvvbddvcvwwwzdzzfjjvcczbbwccjvccmvmfvfgfmfttwrttpmtmsszccjggcssmqsmsgszzfpphghvgvvcddtltwlwnnrbbfdbbtssrvvmwwjfflmlblwlrlmlwwhrhnhqnnvdvllzblzzndzdlzzhpprbrprnrzrjjlnlnrrjddgrrwrttcstsgshszzvgvfvpfpqfpfbpbfbwbmmzvvnnqvvqppzspzpzplldqlqsqlldmlmgmcmwmsmfsfzfdzzbpzzbbcwbbtppphlhshchjjszztctpprqppszzchcqczczddscsrstsntstjsjqjjfggvccgbggqhghrhppdldnlndnpddllgplgppnlpnnmwwglghhftfrtrqtqsszrssfjjzhzfhfssflfslsmmgrrcdrdnrdnnqznndrrbtrrmhrhbhsbsgsnslsqlqnncpccplpldpldppshsdssqdsqdsqdsdsdfsddchczhczcszcscffzhfzffpbbgttdhthnhnjnwnnwrrmwmlljzlzlzdzrrcvcbbsfstfsfnfqftqffgjfjzfjfsjswswccsvcvlccshhjpjcccnfnqqmsqmmrwmwjwswgsgjsjttmjmjttpqtqwttgmgfmmnbnrnpnwppgspggwnwqnqpqmmbmmnwnllbwwdqqzsqqtgttnrtrllcwcchpchcbhbpbnpbpsptpvtvzvrzzslljddjzjjmqmmdpmddcdzzrdrqddtctppwzzwrzrvzrvrzzjtztqqsmmcncllhmlmpmhgsrtrzjhjbtfvhmzpssfbjwcdshthnmmqmfhlhwcbbllwzbwfgfvzjcqblchzqqqgcgmpnbnnblhbcpgmvsbvtcmhsghldlhqlghgtpdvjflmjsmppdsvrjlwvhmwsmfvvdnzpmtfqjqpjdctnnrlfjfvdtmvdmhsczlfsqwfrqtlqwnzdzrcdzmhvrgwnjjtqjrqljhgcffglvhnsdssqdpfrfhtjwlqzvfjmpjnqhsjvndtstqjsqgcmgqdjvfqnlmtjlvcblndprmffrgqdnnncnlfflclgqbjbmsdqsjrmzpwtbqqqqsqmgthhjfqwzvcbqwlvdbffhcvncpldmchnptbnlbhmzrrjhzvzdrvtlhsnfnfdnvhlrlrmdcpnmvdwswctcqldszlvftqtwldrhmfjmfvcgjcdjsbjqjwdtslblwhqfvgrfcpnhszqqsfwbwcmvfvccvztdmcjqfjvdvmbdtcjvtwqpwsqjtdvpvvvsdrrvngmjztgjtnpdbmtlrbrjlwsdnthgzgpssgbzzrqvgblqhrtfbflnphvhpzmdfrwqvjjvcpsmdrqwdbzlpnqpmglgqzfhctrzdpzdthqgjtvpwcrlsmqnjwgzlnqbthvfswhjtrrsrswhbmnddgzmznvppbnmtjpzpdpmpzpmsgfstzldgmrtgplwwsbztphtcvdfgsqzqwrmlqpnhvpcqpfjpbrthrtwgqlfnrqcrpvhssjmhfgpnzzvlrlcbnpmddhtdvvfrrvprqrwbhfgvvltgrhrpwsdgvrlgthbztcgcfggtcfzqtlcdhpmcvpgcszslhpfrttnrdrqpqlgdfwtccmbhfrnlbhhmrtrjmzstbqhmtphzcpcllzsnghfvlwvzzvlqrjmfsvhrnjnvldgnbqvpjsmmphhrmhqrtcncmjwbdlqtrvmhgjrjsrddcpqnjhfmczfgwzspnrjfwvfdpdlcfpvctfrlspdwwlnpbvbglzsmgfsmrshsqgcvlfrvjssrglbwvvvgpvtqshbtqmzbnglflhhldtfzqssptrbnnzdqwqtstpftdqgmmhfjdlfwtmcmtmcgcvtfhzvsbllgbchvlhrgnvvbsnrwqrlvdqlcwwlgbjrvrzgcvljqzvdngtbhpnppjrzpmbwztzvnvrbfccfgvnqvrcmpdblngcvlwjwzpbbwmnslsdjmbrwbvnjsgcmsfvzvnwbzrrlzvgdnzcqqgggvmcwczjqnrddnzhlndgzjbvtbtjqdnlvlflqnfvjdmfstpdfqsgjdslgtpgdnvvpmfwvlqbmbgdrqjhdfhlmsdtfwpscsvdzmswszjfwqtsjqpfnjjlnsspvlgzwwtvwgdzfjjljfwbvfbvpglcqcdbdpshwcqzswbwhftbfqblzpqfmqpvzdjsrcqtvjntnhmlhmzllffcjsdnwpfzdglvlrhrljbrhjhgdnfcqcrccwrbbhrvqwrzlwjrrwzsfcwsvbqsjgtgpzqwlczljrtdhtzcgsfgqssdbjjmttdtzhrqtbqjtqfwmcpdftrfjmznpscsqmtfcdpcdjwcqjvmhngcqnmtmwfttcvpwgcnhhgnnbgjdvztzhczvqljjqwcmwcbvmqqjsfnmhtbtsvsnsfwfzgdvlctrgdvbjqpgfrrlsnppmvhfbbclprlvcssnvtsgftmlpqrpjzrrphrzltbtgfwjqqvbgqjdpdgqvzppfzcbhdbbjttcdzclsphtlzfvnfqgpmqvpzrqgpdnbmsrqgsnfdwpvndzmsllgmnrlhnnzldwshtrrsrsmdncwrcjnmcjlwbbfpzcwzvldtgvbcvhnbhgjgwjcvslrfcwbqlrqldvpcgnbwbzzncncftrgbrwchfrrtnpqsjbcpzvplnbqdgtvnnrcwwfvbdzdrsfspvtbhflhsbqmlsjvfmpvjbfvcrdmgrfqsmqgfrntfqnlqbvmsqtpncjrstspbqvfmddmhwsssdcddshmwdlscttmdzljtpwhzhzhwsdnmgjstfmlnqqvzzdqpqsjdsllswmqcjtnthwqnhbscrjdstljqgncjvjvlpfrtscrzrqghrdvdnbtnpshpldcchljzrzqjlwwscnphvrwlvzttcdjdrddgmvqpvdmttdqhwpfmslzvnrwlrrdttbhctgpgzjrmdwjbcmsprwggvmdmmltldgpbfnppnrpwcnpgtblccdvbsnfvgzmjppftvndmdslfshjvndfvvzjjlzhgfmhcggttrcrbrlwrqgjpchvhnjwqnbsnmftwszhzftglrfdvvnbcbzsslgmdchtrrrqqzhllrfhwfwbbdgfpdfwssmzcfcnzmrhfdddtdhfqmctsglqbwhwpnbdzbsfbbvvthrrgjvztjjwgjcgjntrddmmdldtmvjnwjbcqwfwvfhsrpchznhlqpcttqjffbrpbftftdjzlrqchmzrfgjrqlndfwfrghtsfsblcvtjmjrbfrwdgsgzmmjpdlbwzfscfsfcdqwdwnjwjbvvbptmfrqltmnlpbtrqspwdfmhnncqgtrtmbzhfmwrbcqhmmpmvprvwrjplspcmmspldmbgpbtmqjtrfcpfhcnpjbnlhjpzflstjqfqvzcnfgvrmtplndchffzrtfrqdpdnzrspddwmpzlfchrzzfcfvmbvfnlfwtfbvnffdqhljbvwwdtmszgrjtzwqdbgvvfphcnsdgvlmslqngfmsbrztrnpjprghmjffscbnfqwrvjjjtfzrmjtzbwdsmzgmbtjzvddhngmzvflwftblbzfd
diff --git a/day06a/examples/test0.txt b/day06a/examples/test0.txt
new file mode 100644
index 0000000..7980a82
--- /dev/null
+++ b/day06a/examples/test0.txt
@@ -0,0 +1 @@
+mjqjpqmgbljsphdztnvjfqwrcgsmlb
diff --git a/day06a/examples/test1.txt b/day06a/examples/test1.txt
new file mode 100644
index 0000000..19fe247
--- /dev/null
+++ b/day06a/examples/test1.txt
@@ -0,0 +1 @@
+bvwbjplbgvbhsrlpgdmjqwftvncz
diff --git a/day06a/examples/test2.txt b/day06a/examples/test2.txt
new file mode 100644
index 0000000..0f12ee2
--- /dev/null
+++ b/day06a/examples/test2.txt
@@ -0,0 +1 @@
+nppdvjthqldpwncqszvftbrmjlhg
diff --git a/day06a/examples/test3.txt b/day06a/examples/test3.txt
new file mode 100644
index 0000000..38510e7
--- /dev/null
+++ b/day06a/examples/test3.txt
@@ -0,0 +1 @@
+nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg
diff --git a/day06a/examples/test4.txt b/day06a/examples/test4.txt
new file mode 100644
index 0000000..e1d0a43
--- /dev/null
+++ b/day06a/examples/test4.txt
@@ -0,0 +1 @@
+zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw
diff --git a/day06a/src/main.rs b/day06a/src/main.rs
new file mode 100644
index 0000000..dc15d67
--- /dev/null
+++ b/day06a/src/main.rs
@@ -0,0 +1,85 @@
+/// --- Day 6: Tuning Trouble ---
+///
+/// The preparations are finally complete; you and the Elves leave camp on foot and begin to make
+/// your way toward the star fruit grove.
+///
+/// As you move through the dense undergrowth, one of the Elves gives you a handheld device. He
+/// says that it has many fancy features, but the most important one to set up right now is the
+/// communication system.
+///
+/// However, because he's heard you have significant experience dealing with signal-based systems,
+/// he convinced the other Elves that it would be okay to give you their one malfunctioning device
+/// - surely you'll have no problem fixing it.
+///
+/// As if inspired by comedic timing, the device emits a few colorful sparks.
+///
+/// To be able to communicate with the Elves, the device needs to lock on to their signal. The
+/// signal is a series of seemingly-random characters that the device receives one at a time.
+///
+/// To fix the communication system, you need to add a subroutine to the device that detects a
+/// start-of-packet marker in the datastream. In the protocol being used by the Elves, the start
+/// of a packet is indicated by a sequence of four characters that are all different.
+///
+/// The device will send your subroutine a datastream buffer (your puzzle input); your subroutine
+/// needs to identify the first position where the four most recently received characters were all
+/// different. Specifically, it needs to report the number of characters from the beginning of the
+/// buffer to the end of the first such four-character marker.
+///
+/// For example, suppose you receive the following datastream buffer:
+///
+/// ```
+/// mjqjpqmgbljsphdztnvjfqwrcgsmlb
+/// ```
+///
+/// After the first three characters (mjq) have been received, there haven't been enough characters
+/// received yet to find the marker. The first time a marker could occur is after the fourth
+/// character is received, making the most recent four characters mjqj. Because j is repeated, this
+/// isn't a marker.
+///
+/// The first time a marker appears is after the seventh character arrives. Once it does, the last
+/// four characters received are jpqm, which are all different. In this case, your subroutine
+/// should report the value 7, because the first start-of-packet marker is complete after 7
+/// characters have been processed.
+///
+/// Here are a few more examples:
+///
+/// bvwbjplbgvbhsrlpgdmjqwftvncz: first marker after character 5
+/// nppdvjthqldpwncqszvftbrmjlhg: first marker after character 6
+/// nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg: first marker after character 10
+/// zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw: first marker after character 11
+///
+/// How many characters need to be processed before the first start-of-packet marker is detected?
+use clap::Parser;
+use itertools::Itertools;
+
+use std::fs::File;
+use std::io::prelude::*;
+use std::io::BufReader;
+use std::iter::*;
+use std::path::PathBuf;
+
+const FILEPATH: &'static str = "examples/input.txt";
+const CONS_CHARS: usize = 4;
+
+#[derive(Parser, Debug)]
+#[clap(author, version, about, long_about = None)]
+struct Cli {
+ #[clap(short, long, default_value = FILEPATH)]
+ file: PathBuf,
+}
+
+fn main() {
+ let args = Cli::parse();
+
+ let file = File::open(&args.file).unwrap();
+ let reader = BufReader::new(file);
+ let line = reader.lines().next().unwrap().unwrap();
+ let res = line
+ .into_bytes()
+ .windows(CONS_CHARS)
+ .position(|b| b.iter().all_unique())
+ .unwrap()
+ + CONS_CHARS;
+
+ println!("{:?}", res);
+}
diff --git a/day06b/Cargo.toml b/day06b/Cargo.toml
new file mode 100644
index 0000000..61dface
--- /dev/null
+++ b/day06b/Cargo.toml
@@ -0,0 +1,10 @@
+[package]
+name = "day06b"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+clap = { version = "3.2.20", features = ["derive"] }
+itertools = "0.10.5"
diff --git a/day06b/examples/input.txt b/day06b/examples/input.txt
new file mode 100644
index 0000000..636557c
--- /dev/null
+++ b/day06b/examples/input.txt
@@ -0,0 +1 @@
+gzbzwzjwwrfftfrrbvvcbcvcffpssvhhzfzbfzzrbrtrcttnthnhsnhsnnclcpctpprwwgppppchhvvctvtsvswwcdcrrdzdhzdzvddvfvfjjlldvvfllfhlfhlhghnhghrgrsggvbbhdhffzggmttjqtjjgljjwtjwjggldlzzrfrpppjsjggqrrdbbgwgtwwwtqwtqqvccjnnhrhqqsnssjbssmjjbzjjqnqnlnjncjjzzqddfqqqnqvnqncqqmsshqqccssvpvllbbfvfmmmgzgdggtjgjtjbttngtnnhhfrfddmtmtftcftthvttwzwrzrbrgrbrqbqccmmtvtqvtqqzmzwmzzzsvzvhhhqlhqlqplpggvmvwmmshhnshsjszzljlnlrnllgddqllpmllsgswwqnqlnlqqlmqqvrqvrqrppvrrqwqhqllgjgcggsllqgllghlghhbvhhcvvbddvcvwwwzdzzfjjvcczbbwccjvccmvmfvfgfmfttwrttpmtmsszccjggcssmqsmsgszzfpphghvgvvcddtltwlwnnrbbfdbbtssrvvmwwjfflmlblwlrlmlwwhrhnhqnnvdvllzblzzndzdlzzhpprbrprnrzrjjlnlnrrjddgrrwrttcstsgshszzvgvfvpfpqfpfbpbfbwbmmzvvnnqvvqppzspzpzplldqlqsqlldmlmgmcmwmsmfsfzfdzzbpzzbbcwbbtppphlhshchjjszztctpprqppszzchcqczczddscsrstsntstjsjqjjfggvccgbggqhghrhppdldnlndnpddllgplgppnlpnnmwwglghhftfrtrqtqsszrssfjjzhzfhfssflfslsmmgrrcdrdnrdnnqznndrrbtrrmhrhbhsbsgsnslsqlqnncpccplpldpldppshsdssqdsqdsqdsdsdfsddchczhczcszcscffzhfzffpbbgttdhthnhnjnwnnwrrmwmlljzlzlzdzrrcvcbbsfstfsfnfqftqffgjfjzfjfsjswswccsvcvlccshhjpjcccnfnqqmsqmmrwmwjwswgsgjsjttmjmjttpqtqwttgmgfmmnbnrnpnwppgspggwnwqnqpqmmbmmnwnllbwwdqqzsqqtgttnrtrllcwcchpchcbhbpbnpbpsptpvtvzvrzzslljddjzjjmqmmdpmddcdzzrdrqddtctppwzzwrzrvzrvrzzjtztqqsmmcncllhmlmpmhgsrtrzjhjbtfvhmzpssfbjwcdshthnmmqmfhlhwcbbllwzbwfgfvzjcqblchzqqqgcgmpnbnnblhbcpgmvsbvtcmhsghldlhqlghgtpdvjflmjsmppdsvrjlwvhmwsmfvvdnzpmtfqjqpjdctnnrlfjfvdtmvdmhsczlfsqwfrqtlqwnzdzrcdzmhvrgwnjjtqjrqljhgcffglvhnsdssqdpfrfhtjwlqzvfjmpjnqhsjvndtstqjsqgcmgqdjvfqnlmtjlvcblndprmffrgqdnnncnlfflclgqbjbmsdqsjrmzpwtbqqqqsqmgthhjfqwzvcbqwlvdbffhcvncpldmchnptbnlbhmzrrjhzvzdrvtlhsnfnfdnvhlrlrmdcpnmvdwswctcqldszlvftqtwldrhmfjmfvcgjcdjsbjqjwdtslblwhqfvgrfcpnhszqqsfwbwcmvfvccvztdmcjqfjvdvmbdtcjvtwqpwsqjtdvpvvvsdrrvngmjztgjtnpdbmtlrbrjlwsdnthgzgpssgbzzrqvgblqhrtfbflnphvhpzmdfrwqvjjvcpsmdrqwdbzlpnqpmglgqzfhctrzdpzdthqgjtvpwcrlsmqnjwgzlnqbthvfswhjtrrsrswhbmnddgzmznvppbnmtjpzpdpmpzpmsgfstzldgmrtgplwwsbztphtcvdfgsqzqwrmlqpnhvpcqpfjpbrthrtwgqlfnrqcrpvhssjmhfgpnzzvlrlcbnpmddhtdvvfrrvprqrwbhfgvvltgrhrpwsdgvrlgthbztcgcfggtcfzqtlcdhpmcvpgcszslhpfrttnrdrqpqlgdfwtccmbhfrnlbhhmrtrjmzstbqhmtphzcpcllzsnghfvlwvzzvlqrjmfsvhrnjnvldgnbqvpjsmmphhrmhqrtcncmjwbdlqtrvmhgjrjsrddcpqnjhfmczfgwzspnrjfwvfdpdlcfpvctfrlspdwwlnpbvbglzsmgfsmrshsqgcvlfrvjssrglbwvvvgpvtqshbtqmzbnglflhhldtfzqssptrbnnzdqwqtstpftdqgmmhfjdlfwtmcmtmcgcvtfhzvsbllgbchvlhrgnvvbsnrwqrlvdqlcwwlgbjrvrzgcvljqzvdngtbhpnppjrzpmbwztzvnvrbfccfgvnqvrcmpdblngcvlwjwzpbbwmnslsdjmbrwbvnjsgcmsfvzvnwbzrrlzvgdnzcqqgggvmcwczjqnrddnzhlndgzjbvtbtjqdnlvlflqnfvjdmfstpdfqsgjdslgtpgdnvvpmfwvlqbmbgdrqjhdfhlmsdtfwpscsvdzmswszjfwqtsjqpfnjjlnsspvlgzwwtvwgdzfjjljfwbvfbvpglcqcdbdpshwcqzswbwhftbfqblzpqfmqpvzdjsrcqtvjntnhmlhmzllffcjsdnwpfzdglvlrhrljbrhjhgdnfcqcrccwrbbhrvqwrzlwjrrwzsfcwsvbqsjgtgpzqwlczljrtdhtzcgsfgqssdbjjmttdtzhrqtbqjtqfwmcpdftrfjmznpscsqmtfcdpcdjwcqjvmhngcqnmtmwfttcvpwgcnhhgnnbgjdvztzhczvqljjqwcmwcbvmqqjsfnmhtbtsvsnsfwfzgdvlctrgdvbjqpgfrrlsnppmvhfbbclprlvcssnvtsgftmlpqrpjzrrphrzltbtgfwjqqvbgqjdpdgqvzppfzcbhdbbjttcdzclsphtlzfvnfqgpmqvpzrqgpdnbmsrqgsnfdwpvndzmsllgmnrlhnnzldwshtrrsrsmdncwrcjnmcjlwbbfpzcwzvldtgvbcvhnbhgjgwjcvslrfcwbqlrqldvpcgnbwbzzncncftrgbrwchfrrtnpqsjbcpzvplnbqdgtvnnrcwwfvbdzdrsfspvtbhflhsbqmlsjvfmpvjbfvcrdmgrfqsmqgfrntfqnlqbvmsqtpncjrstspbqvfmddmhwsssdcddshmwdlscttmdzljtpwhzhzhwsdnmgjstfmlnqqvzzdqpqsjdsllswmqcjtnthwqnhbscrjdstljqgncjvjvlpfrtscrzrqghrdvdnbtnpshpldcchljzrzqjlwwscnphvrwlvzttcdjdrddgmvqpvdmttdqhwpfmslzvnrwlrrdttbhctgpgzjrmdwjbcmsprwggvmdmmltldgpbfnppnrpwcnpgtblccdvbsnfvgzmjppftvndmdslfshjvndfvvzjjlzhgfmhcggttrcrbrlwrqgjpchvhnjwqnbsnmftwszhzftglrfdvvnbcbzsslgmdchtrrrqqzhllrfhwfwbbdgfpdfwssmzcfcnzmrhfdddtdhfqmctsglqbwhwpnbdzbsfbbvvthrrgjvztjjwgjcgjntrddmmdldtmvjnwjbcqwfwvfhsrpchznhlqpcttqjffbrpbftftdjzlrqchmzrfgjrqlndfwfrghtsfsblcvtjmjrbfrwdgsgzmmjpdlbwzfscfsfcdqwdwnjwjbvvbptmfrqltmnlpbtrqspwdfmhnncqgtrtmbzhfmwrbcqhmmpmvprvwrjplspcmmspldmbgpbtmqjtrfcpfhcnpjbnlhjpzflstjqfqvzcnfgvrmtplndchffzrtfrqdpdnzrspddwmpzlfchrzzfcfvmbvfnlfwtfbvnffdqhljbvwwdtmszgrjtzwqdbgvvfphcnsdgvlmslqngfmsbrztrnpjprghmjffscbnfqwrvjjjtfzrmjtzbwdsmzgmbtjzvddhngmzvflwftblbzfd
diff --git a/day06b/examples/test0.txt b/day06b/examples/test0.txt
new file mode 100644
index 0000000..7980a82
--- /dev/null
+++ b/day06b/examples/test0.txt
@@ -0,0 +1 @@
+mjqjpqmgbljsphdztnvjfqwrcgsmlb
diff --git a/day06b/examples/test1.txt b/day06b/examples/test1.txt
new file mode 100644
index 0000000..19fe247
--- /dev/null
+++ b/day06b/examples/test1.txt
@@ -0,0 +1 @@
+bvwbjplbgvbhsrlpgdmjqwftvncz
diff --git a/day06b/examples/test2.txt b/day06b/examples/test2.txt
new file mode 100644
index 0000000..0f12ee2
--- /dev/null
+++ b/day06b/examples/test2.txt
@@ -0,0 +1 @@
+nppdvjthqldpwncqszvftbrmjlhg
diff --git a/day06b/examples/test3.txt b/day06b/examples/test3.txt
new file mode 100644
index 0000000..38510e7
--- /dev/null
+++ b/day06b/examples/test3.txt
@@ -0,0 +1 @@
+nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg
diff --git a/day06b/examples/test4.txt b/day06b/examples/test4.txt
new file mode 100644
index 0000000..e1d0a43
--- /dev/null
+++ b/day06b/examples/test4.txt
@@ -0,0 +1 @@
+zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw
diff --git a/day06b/src/main.rs b/day06b/src/main.rs
new file mode 100644
index 0000000..7e98082
--- /dev/null
+++ b/day06b/src/main.rs
@@ -0,0 +1,51 @@
+/// --- Part Two ---
+///
+/// Your device's communication system is correctly detecting packets, but still isn't working. It
+/// looks like it also needs to look for messages.
+///
+/// A start-of-message marker is just like a start-of-packet marker, except it consists of 14
+/// distinct characters rather than 4.
+///
+/// Here are the first positions of start-of-message markers for all of the above examples:
+///
+/// mjqjpqmgbljsphdztnvjfqwrcgsmlb: first marker after character 19
+/// bvwbjplbgvbhsrlpgdmjqwftvncz: first marker after character 23
+/// nppdvjthqldpwncqszvftbrmjlhg: first marker after character 23
+/// nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg: first marker after character 29
+/// zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw: first marker after character 26
+///
+/// How many characters need to be processed before the first start-of-message marker is detected?
+use clap::Parser;
+use itertools::Itertools;
+
+use std::fs::File;
+use std::io::prelude::*;
+use std::io::BufReader;
+use std::iter::*;
+use std::path::PathBuf;
+
+const FILEPATH: &'static str = "examples/input.txt";
+const CONS_CHARS: usize = 14;
+
+#[derive(Parser, Debug)]
+#[clap(author, version, about, long_about = None)]
+struct Cli {
+ #[clap(short, long, default_value = FILEPATH)]
+ file: PathBuf,
+}
+
+fn main() {
+ let args = Cli::parse();
+
+ let file = File::open(&args.file).unwrap();
+ let reader = BufReader::new(file);
+ let line = reader.lines().next().unwrap().unwrap();
+ let res = line
+ .into_bytes()
+ .windows(CONS_CHARS)
+ .position(|b| b.iter().all_unique())
+ .unwrap()
+ + CONS_CHARS;
+
+ println!("{:?}", res);
+}