pub mod simple8b_rle {
    /// Simple8b with RLE Encoder
    pub struct Encoder;

    /// Simple8b with RLE Decoder
    pub struct Decoder;

    // Constants for selectors, bits per value, and number of values
    const SELECTORS: [(u8, usize); 16] = [
        // (bits_per_value, num_values)
        (0, 240),  // Selector 0: 240 zeros
        (1, 60),   // Selector 1
        (2, 30),   // Selector 2
        (3, 20),   // Selector 3
        (4, 15),   // Selector 4
        (5, 12),   // Selector 5
        (6, 10),   // Selector 6
        (7, 8),    // Selector 7
        (8, 7),    // Selector 8
        (10, 6),   // Selector 9
        (12, 5),   // Selector 10
        (15, 4),   // Selector 11
        (20, 3),   // Selector 12
        (30, 2),   // Selector 13
        (60, 1),   // Selector 14
        (255, 0),  // Selector 15: RLE
    ];

    impl Encoder {
        /// Creates a new encoder.
        pub fn new() -> Self {
            Encoder
        }

        /// Encodes a slice of unsigned 64-bit integers.
        pub fn encode(&self, data: &[u64]) -> Vec<u64> {
            let mut encoded = Vec::new();
            let mut i = 0;
            let n = data.len();

            while i < n {
                // Detect runs of identical values
                let mut run_length = 1;
                while i + run_length < n && data[i] == data[i + run_length] {
                    run_length += 1;
                }

                // Decide whether to use RLE
                if run_length >= 3 {
                    // Use RLE encoding
                    let value = data[i];
                    let mut remaining = run_length;

                    while remaining > 0 {
                        let rle_run_length = remaining.min(1_048_575); // Max run length in 20 bits
                        let word = self.encode_rle_word(value, rle_run_length as u32);
                        encoded.push(word);
                        remaining -= rle_run_length;
                    }
                    i += run_length;
                } else {
                    // Use Simple8b encoding
                    let mut values = Vec::new();
                    while i < n && values.len() < 240 {
                        // Start of a new run
                        if i + 2 < n && data[i] == data[i + 1] && data[i] == data[i + 2] {
                            break;
                        }
                        values.push(data[i]);
                        i += 1;
                    }
                    let encoded_words = self.encode_simple8b_values(&values);
                    encoded.extend(encoded_words);
                }
            }
            encoded
        }

        fn encode_rle_word(&self, value: u64, run_length: u32) -> u64 {
            // Selector 15 for RLE
            let mut word = 15u64 << 60;
            // Encode run_length (20 bits)
            word |= ((run_length as u64) & 0xFFFFF) << 40;
            // Encode value (40 bits)
            word |= value & 0xFFFFFFFFFF;
            word
        }

        fn encode_simple8b_values(&self, values: &[u64]) -> Vec<u64> {
            let mut result = Vec::new();
            let mut index = 0;

            while index < values.len() {
                let mut best_selector = None;

                // Try all selectors from most to least efficient
                for selector in (1..15).rev() {
                    let (bits_per_value, num_values) = SELECTORS[selector];
                    let max_value = if bits_per_value == 0 { 0 } else { (1u64 << bits_per_value) - 1 };
                    let end = (index + num_values).min(values.len());
                    let can_pack = values[index..end].iter().all(|&v| v <= max_value);

                    if can_pack {
                        let mut word = (selector as u64) << 60;
                        let mut shift = 60 - bits_per_value;
                        for &v in &values[index..end] {
                            word |= (v & max_value) << shift;
                            if shift >= bits_per_value {
                                shift -= bits_per_value;
                            } else {
                                break;
                            }
                        }
                        result.push(word);
                        index += end - index;
                        best_selector = Some(selector);
                        break;
                    }
                }

                // If no suitable selector found, use selector 14 (60 bits per value)
                if best_selector.is_none() {
                    let selector = 14;
                    let bits_per_value = SELECTORS[selector].0;
                    let v = values[index];
                    let word = ((selector as u64) << 60) | (v & ((1u64 << bits_per_value) - 1));
                    result.push(word);
                    index += 1;
                }
            }
            result
        }
    }

    impl Decoder {
        /// Creates a new decoder.
        pub fn new() -> Self {
            Decoder
        }

        /// Decodes a slice of encoded unsigned 64-bit integers.
        pub fn decode(&self, data: &[u64]) -> Vec<u64> {
            let mut decoded = Vec::new();

            for &word in data {
                let selector = (word >> 60) as u8;

                match selector {
                    0 => {
                        // Zeros (240 zeros)
                        let zero_count = 240;
                        decoded.extend(std::iter::repeat(0u64).take(zero_count));
                    }
                    1..=14 => {
                        let (bits_per_value, num_values) = SELECTORS[selector as usize];
                        let mut values = Vec::with_capacity(num_values);
                        let mut shift = 60 - bits_per_value;
                        for _ in 0..num_values {
                            let mask = (1u64 << bits_per_value) - 1;
                            let value = (word >> shift) & mask;
                            values.push(value);
                            if shift >= bits_per_value {
                                shift -= bits_per_value;
                            } else {
                                break;
                            }
                        }
                        decoded.extend(values);
                    }
                    15 => {
                        // RLE
                        let run_length = ((word >> 40) & 0xFFFFF) as usize; // 20 bits
                        let value = word & 0xFFFFFFFFFF;                    // 40 bits
                        decoded.extend(std::iter::repeat(value).take(run_length));
                    }
                    _ => panic!("Invalid selector: {}", selector),
                }
            }
            decoded
        }
    }
}



fn main() {
    use simple8b_rle::{Decoder, Encoder};

    let data = vec![
        5, 5, 5, 5, 5, // Run of fives
        1, 2, 3,       // Non-repeating values
        0, 0, 0, 0,    // Run of zeros
        100, 100, 100, // Run of hundreds
    ];

    let encoder = Encoder::new();
    let encoded = encoder.encode(&data);

    let decoder = Decoder::new();
    let decoded = decoder.decode(&encoded);

    assert_eq!(data, decoded);
    println!("Original data: {:?}", data);
    println!("Encoded data: {:?}", encoded);
    println!("Decoded data: {:?}", decoded);
}
 

Rust online compiler

Write, Run & Share Rust code online using OneCompiler’s Rust online compiler for free. It’s a fast, interactive, and powerful environment to learn and experiment with the Rust programming language. OneCompiler runs the latest stable version of Rust.

About Rust

Rust is a systems programming language developed by Mozilla that focuses on performance, memory safety, and concurrency. It guarantees memory safety without a garbage collector and is widely used for system-level programming, web assembly, and command-line tools. Rust's compiler enforces strict compile-time checks, making code safer and more predictable.

Sample Code

The following is a simple Rust program that prints a greeting:

fn main() {
    println!("Hello, OneCompiler!");
}

Taking inputs (stdin)

OneCompiler’s Rust editor supports stdin. Here’s a sample program that reads a line of input and prints it:

use std::io;

fn main() {
    let mut input = String::new();
    io::stdin()
        .read_line(&mut input)
        .expect("Failed to read line");
    println!("Hello, {}", input.trim());
}

Syntax Basics

Variables

let name = "OneCompiler";        // Immutable
let mut age = 25;                // Mutable

Data Types

TypeDescription
i32, i64Signed integers
f32, f64Floating-point numbers
booltrue or false
charSingle character
StringGrowable string

Conditionals

let score = 85;
if score >= 50 {
    println!("Pass");
} else {
    println!("Fail");
}

Loops

For loop

for i in 1..=5 {
    println!("{}", i);
}

While loop

let mut i = 1;
while i <= 5 {
    println!("{}", i);
    i += 1;
}

Loop (infinite with break)

let mut count = 0;
loop {
    if count == 3 {
        break;
    }
    println!("{}", count);
    count += 1;
}

Functions

fn add(a: i32, b: i32) -> i32 {
    a + b
}

fn greet(name: &str) {
    println!("Hello, {}!", name);
}

This guide provides a quick reference to Rust programming syntax and features. Start coding in Rust using OneCompiler’s Rust online compiler today!