Malerwerkst.at

Rust - Advent of Code 2016 - Tag 3 / Teil 1+2

Introduction

R.


Rust AoC-2016

Rust - Advent of Code 2016 - Tag 3 / Teil 1+2

Posted by R. on .
Featured

Rust AoC-2016

Rust - Advent of Code 2016 - Tag 3 / Teil 1+2

Posted by R. on .

Auf der Jagd nach den Sternen für Santa sind wir ein Stückchen weiter im Hauptquartier des Osterhasen vorgedrungen. Doch die nächste Aufgabe erwartet uns schon:

Aufgabenstellung

Now that you can think clearly, you move deeper into the labyrinth of hallways and office furniture that makes up this part of Easter Bunny HQ. This must be a graphic design department; the walls are covered in specifications for triangles.

Or are they?

The design document gives the side lengths of each triangle it describes, but... 5 10 25? Some of these aren't triangles. You can't help but mark the impossible ones.

In a valid triangle, the sum of any two sides must be larger than the remaining side. For example, the "triangle" given above is impossible, because 5 + 10 is not larger than 25.

In your puzzle input, how many of the listed triangles are possible?


--- Part Two ---

Now that you've helpfully marked up their design documents, it occurs to you that triangles are specified in groups of three vertically. Each set of three numbers in a column specifies a triangle. Rows are unrelated.

For example, given the following specification, numbers with the same hundreds digit would be part of the same triangle:

  • 101 301 501
  • 102 302 502
  • 103 303 503
  • 201 401 601
  • 202 402 602
  • 203 403 603

In your puzzle input, and instead reading by columns, how many of the listed triangles are possible?

Das Rätsel, insbesondere der erste Teil, ist eigentlich recht einfach zu lösen. Wahrscheinlich könnte man meinen Beispielcode auch kürzer gestalten, in dem man mehr Kombinationen von Iteratoren / Filtern / etc. einsetzt - und vielleicht werde ich das in einer Überarbeitung auch tun -, aber mit unter 50 Zeilen für beide Teile liege ich vielleicht gar nicht so schlecht, oder? (Wer anderer Meinung ist, ab damit in die Kommentare!)

Code

use std::fs::File;  
use std::io::Read;

fn get_data(fname: &str) -> String {  
    let mut file = match File::open(fname) {
        Err(e) => panic!("file error: {}", e),
        Ok(file) => file,
    };

    let mut data = String::new();

    match file.read_to_string(&mut data) {
        Err(e) => panic!("read error: {}", e),
        Ok(_) => {}
    }
    data
}

fn main() {  
    let mut valid_ones = Vec::<Vec<usize>>::new();
    let mut data = Vec::<Vec<usize>>::new();

    // --- Part 1
    for l in get_data("src/input.txt").lines() {
        let mut d: Vec<usize> = l.split_whitespace().map(|e| e.trim().parse().unwrap()).collect();
        data.push(d.clone());  // für Part 2
        d.sort();
        if d[0] + d[1] > d[2] {
            valid_ones.push(d);
        }
    }
    println!("Part 1: {}", valid_ones.len());
    // --- Part 2
    valid_ones.clear();
    let mut one_column = Vec::new();
    for i in 0..3 {
        for d in &data {
            one_column.push(d[i])
        }
    }
    for c in one_column.chunks(3) {
        let mut d = vec![c[0], c[1], c[2]];
        d.sort();
        if d[0] + d[1] > d[2] {
            valid_ones.push(d);
        }
    }
    println!("Part 2: {}", valid_ones.len());
}

Bis morgen! :-)

R.

View Comments...