68 lines
1.9 KiB
Rust
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, '_')));
|
|
}
|