This commit is contained in:
2016-12-20 08:05:02 +01:00
parent a34295286d
commit d08be91392
3 changed files with 92 additions and 0 deletions

82
2016/16/src/main.rs Normal file
View File

@@ -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"));
}
}