aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.rs60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..a41a05d
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,60 @@
+use std::fs;
+
+fn read_file(file : &str) -> String {
+ fs::read_to_string(file).unwrap()
+}
+
+fn required_fuel(mass : u32) -> u32 {
+ (mass / 3).saturating_sub(2)
+}
+
+fn required_fuel_with_fuel(mass : u32) -> u32 {
+ let mut total = 0;
+ let mut current = mass;
+ loop {
+ current = required_fuel(current);
+ total += current;
+ if current == 0 {
+ break;
+ }
+ }
+ total
+}
+
+fn day1() {
+ let input = read_file("input1");
+ let sum : u32 = input.split('\n')
+ .filter(|x| !x.is_empty())
+ .map(|x| x.parse::<u32>().unwrap())
+ .map(|x| required_fuel(x))
+ .sum();
+ println!("1a: {}", sum);
+
+ let sum2 : u32 = input.split('\n')
+ .filter(|x| !x.is_empty())
+ .map(|x| x.parse::<u32>().unwrap())
+ .map(|x| required_fuel_with_fuel(x))
+ .sum();
+ println!("1b: {}", sum2);
+}
+
+fn main() {
+ day1();
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_day1() {
+ assert_eq!(required_fuel(12), 2);
+ assert_eq!(required_fuel(14), 2);
+ assert_eq!(required_fuel(1969), 654);
+ assert_eq!(required_fuel(100756), 33583);
+
+ assert_eq!(required_fuel_with_fuel(14), 2);
+ assert_eq!(required_fuel_with_fuel(1969), 966);
+ assert_eq!(required_fuel_with_fuel(100756), 50346);
+ }
+}