Files
bwinf40-runde2/Aufgabe3-HexMax/src/main.rs
2022-02-27 20:17:54 +01:00

68 lines
1.9 KiB
Rust

use clap::Parser;
use hexmax;
#[derive(Parser)]
struct Args {
/// Dateipfad der Eingabedatei
filepath: String,
/// Ausgabe der Umlegungen
#[clap(short, long)]
swap_print: bool,
}
fn main() {
let args = Args::parse();
let (digits, number_of_swaps) = hexmax::largest_hex(&args.filepath);
println!("{}", hexmax::to_hex_str(&digits));
if args.swap_print {
let (moves_put, moves_taken) = hexmax::gen_swaps(&digits, number_of_swaps as usize);
let mut digits_hex: Vec<u8> = digits.iter()
.map(|digit| hexmax::HEX[digit.original_digit as usize]).collect();
println!("Umlegungen:");
swap_print(&digits_hex);
println!();
let mut not_first = false;
for (move_put, move_taken) in moves_put.iter().zip(&moves_taken) {
if not_first {println!();}
for hexmax::PutTaken {digit_i, stick_map} in [move_put, move_taken] {
digits_hex[*digit_i] ^= stick_map;
}
swap_print(&digits_hex);
not_first = true;
}
}
}
fn swap_print(digits_hex: &[u8]) {
print_vertical(digits_hex, 6);
print_horizontal(digits_hex, 5);
print_vertical(digits_hex, 3);
print_horizontal(digits_hex, 2);
print_vertical(digits_hex, 0);
}
fn print_helper<F: Fn(u8)>(digits_hex: &[u8], run: F) {
let mut not_first = false;
for digit in digits_hex {
if not_first {print!(" ")}
run(*digit);
not_first = true;
}
println!();
}
fn print_stick(digit: u8, i: u8, stick_char: char) -> char {
if digit >> i & 1 == 1 {stick_char} else {' '}
}
fn print_horizontal(digits_hex: &[u8], i: u8) {
print_helper(digits_hex, |digit|
print!("{} {}", print_stick(digit, i, '|'), print_stick(digit, i - 1, '|'))
);
}
fn print_vertical(digits_hex: &[u8], i: u8) {
print_helper(digits_hex, |digit| print!(" {} ", print_stick(digit, i, '_')));
}