From d08be913924050f4274c68edd44f29aaa0d17dae Mon Sep 17 00:00:00 2001 From: logaritmisk Date: Tue, 20 Dec 2016 08:05:02 +0100 Subject: [PATCH] 2016/16 --- 2016/16/Cargo.lock | 4 +++ 2016/16/Cargo.toml | 6 ++++ 2016/16/src/main.rs | 82 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 2016/16/Cargo.lock create mode 100644 2016/16/Cargo.toml create mode 100644 2016/16/src/main.rs diff --git a/2016/16/Cargo.lock b/2016/16/Cargo.lock new file mode 100644 index 0000000..44ecfe1 --- /dev/null +++ b/2016/16/Cargo.lock @@ -0,0 +1,4 @@ +[root] +name = "16" +version = "0.1.0" + diff --git a/2016/16/Cargo.toml b/2016/16/Cargo.toml new file mode 100644 index 0000000..a6c949e --- /dev/null +++ b/2016/16/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "16" +version = "0.1.0" +authors = ["logaritmisk "] + +[dependencies] diff --git a/2016/16/src/main.rs b/2016/16/src/main.rs new file mode 100644 index 0000000..c840342 --- /dev/null +++ b/2016/16/src/main.rs @@ -0,0 +1,82 @@ +pub fn generate_data(input: &str) -> String { + let mut data = input.to_owned(); + + data.push('0'); + + for c in input.chars().rev() { + data.push(if c == '0' { '1' } else { '0' }); + } + + data +} + +pub fn calculate_checksum(input: &str) -> String { + let mut data = String::new(); + + for pair in input.as_bytes().chunks(2) { + data.push(if pair[0] == pair[1] { '1' } else { '0' }) + } + + data +} + +pub fn fill_disk(state: &str, length: usize) -> (String, String) { + let mut state = state.to_owned(); + + while state.len() < length { + state = generate_data(&state); + } + + state.truncate(length); + + let mut checksum = calculate_checksum(&state); + + while checksum.len() % 2 == 0 { + checksum = calculate_checksum(&checksum); + } + + (state, checksum) +} + + +fn main() { + let data = fill_disk("01110110101001000", 272); + + println!("checksum_1={}", data.1); + + let data = fill_disk("01110110101001000", 35651584); + + println!("checksum_2={}", data.1); +} + + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn example_01() { + assert_eq!("100".to_owned(), generate_data("1")); + } + + #[test] + fn example_02() { + assert_eq!("001".to_owned(), generate_data("0")); + } + + #[test] + fn example_03() { + assert_eq!("11111000000".to_owned(), generate_data("11111")); + } + + #[test] + fn example_04() { + assert_eq!("1111000010100101011110000".to_owned(), generate_data("111100001010")); + } + + #[test] + fn example_05() { + assert_eq!("110101".to_owned(), calculate_checksum("110010110100")); + assert_eq!("100".to_owned(), calculate_checksum("110101")); + } +}