From 97ba6f98aee67b82b06dcc44efb1c48c93875064 Mon Sep 17 00:00:00 2001 From: Spectre Date: Sat, 29 Aug 2026 16:45:39 +0200 Subject: [PATCH] first fun version --- compressed.bin | Bin 0 -> 64125 bytes src/main.rs | 97 +++++++++++++++++++++++++++++++++++++++++++++++-- src/test.rs | 30 +++++++++++++-- 3 files changed, 119 insertions(+), 8 deletions(-) create mode 100644 compressed.bin diff --git a/compressed.bin b/compressed.bin new file mode 100644 index 0000000000000000000000000000000000000000..1daf88cdac537b618377b6391a2ffaf91d5b168e GIT binary patch literal 64125 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 lpwP~c%8%6#Z`te>MTkp;0<%a=YEn$4y = env::args().collect(); + let file_name = Path::new(&args[1]); + + let content = read_file(file_name); + let stats = get_stats(&content); + let tree = create_tree(stats); + + let result = compress(content, tree); + + std::io::stdout() + .write_all(&result) + .expect("Couldn't write the result"); } -fn get_stats(text: String) -> HashMap { - todo!() +fn read_file(path: &Path) -> String { + let mut file = File::open(path).expect("Can't open file"); + + let mut contents = String::new(); + file.read_to_string(&mut contents) + .expect("Couldn't read the file"); + + contents +} + +fn get_stats(text: &String) -> HashMap { + let mut letters = HashMap::new(); + + for letter in text.chars() { + *letters.entry(letter.to_string()).or_insert(0) += 1; + } + + letters +} + +fn create_tree(letters: HashMap) -> HashMap { + let mut tree = HashMap::new(); + let mut sorted: Vec = letters.keys().cloned().collect(); + + sorted.sort_by_key(|key| std::cmp::Reverse(letters[key])); + + let mut a: u32 = 0; + + for letter in sorted { + let mut zeroes = "".to_string(); + + for _ in 0..a { + zeroes.push('0'); + } + + tree.insert(letter, format!("{zeroes}1")); + a += 1; + } + + tree +} + +fn compress(text: String, tree: HashMap) -> Vec { + let mut compressed = Vec::new(); + + let mut current_byte: u8 = 0; + let mut bit_count: u8 = 0; + + for letter in text.chars() { + let code = tree.get(&letter.to_string()).unwrap(); + + for bit in code.chars() { + current_byte <<= 1; + + if bit == '1' { + current_byte |= 1; + } + + bit_count += 1; + + if bit_count == 8 { + compressed.push(current_byte); + + current_byte = 0; + bit_count = 0; + } + } + } + + if bit_count > 0 { + current_byte <<= 8 - bit_count; + compressed.push(current_byte); + } + + compressed } diff --git a/src/test.rs b/src/test.rs index f0877ba..f010bcb 100644 --- a/src/test.rs +++ b/src/test.rs @@ -1,11 +1,33 @@ #[cfg(test)] mod tests { + + use std::collections::HashMap; + + use crate::{create_tree, get_stats}; + use super::*; - use main; #[test] - fn it_works() { - let result = add(2, 2); - assert_eq!(result, 4); + fn check_basic_functions() { + let test = get_stats("ZEHTZJATJAEJEF".to_string()); + let case = HashMap::from([ + ("Z".to_string(), 2), + ("E".to_string(), 3), + ("H".to_string(), 1), + ("T".to_string(), 2), + ("J".to_string(), 3), + ("A".to_string(), 2), + ("F".to_string(), 1), + ]); + + println!("{:?} \n {:?}", test, case); + assert!(test == case); + } + #[test] + fn test2() { + let small_string : String = "aaaaaaaaaaaaaaaaaaa a a a a a a a bazbazoreb kjzbej kjqbzetjbqzefe jabzezf jbzaefe jbzae ljzbef ljsndsf lj".to_string(); + + let stats = get_stats(small_string); + create_tree(stats); } }