<commit_before>//  
//  Crontibuidores
//   - <NAME>
//

use rand::prelude::*;

fn verifica_ordem(lista: Vec<u8>) -> bool {
    for indice in 0..lista.len() - 1 {
        if lista[indice] > lista[indice + 1] {
            return false;
        }
    }
    return true;
}

// Vec<u8> significa que o parâmetro "lista" é uma lista de 
// inteiros sem sinal de 8 bits. E o retorno u64 se refere
// ao total de ciclos necessários para realizar a ordenação
fn bogo_sort(mut lista: Vec<u8>) -> (Vec<u8>, u64) {
    let mut rng = thread_rng();
    // Foi escolhido um limite tão grande justamente pelo bogo sort 
    // poder ser tanto o algoritmo mais rápido quanto o mais lento, 
    // então para não crashar o programa é bom um range grande
    let mut ciclos: u64 = 0;
    loop {
        ciclos +=1;
        lista.shuffle(&mut rng);
        if verifica_ordem(lista.clone()) {
            return (lista, ciclos);
        } 
    }
}

// O valor de u8 para os itens da lista é apenas para 
// gerar números muito grandes e dificultar na visualização
fn gera_lista(len: u8) -> Vec<u8> {
    let mut rng = thread_rng();
    let mut lista = Vec::<u8>::new();
    for _ in 0..len - 1 {
        lista.push(rng.gen());
    }
    return lista;
}

fn main() {
    let lista_desordenada = gera_lista(6);
    print!("Lista desordenada: ");
    for i in lista_desordenada.iter() {
        print!("{i} ")
    }
    println!();

    let (lista, ciclos) = bogo_sort(lista_desordenada);
    println!("Foram necesarios um total de {ciclos} para ordenar");
    print!("Lista ordenada: ");
    for i in lista.iter() {
        print!("{i} ");
    }
    println!();
}

// Testes unitarios
#[cfg(test)]
mod test {
    use super::*;

    #[test]
    fn oredenacao() {
        let mut desordenada = gera_lista(6);
        let (ordenada, _) = bogo_sort(desordenada.clone());
        desordenada.sort();
        assert_eq!(ordenada, desordenada);

        let desordenada = vec![6, 5, 4, 3, 2, 1];
        let (ordenada, _) = bogo_sort(desordenada);
        assert_eq!(ordenada, vec![1, 2, 3, 4, 5, 6]);
    }
}<commit_msg>Arrumando comentarios em bogo_sort.rs<commit_after>/* 
    Contribuidores
        - <NAME>
  
    O Bogo Sort é um algoritmo feito apenas como uma piada, feito 
    o pior e mais demorado algoritmo de ordenação. Tudo que ele faz
    é pegar uma lista, randomizar os seus itens, e verificar se todos
    os itens estão ordenados. Logo se tor 100% aleatório, o que pode
    fazer com que demore mais de 1 milhão de tentativas ate ser ordenado,
    ou que simplesmente na primeira tentativa ele seja ordenado.

*/

// Para utilizar esta lib sera necessário iniciar um projeto com o cargo
// e adicionar Rand as dependências
use rand::prelude::*;

fn verifica_ordem(lista: Vec<u8>) -> bool {
    for indice in 0..lista.len() - 1 {
        if lista[indice] > lista[indice + 1] {
            return false;
        }
    }
    return true;
}

// Vec<u8> significa que o parâmetro "lista" é uma lista de 
// inteiros sem sinal de 8 bits. E o retorno u64 se refere
// ao total de ciclos necessários para realizar a ordenação
fn bogo_sort(mut lista: Vec<u8>) -> (Vec<u8>, u64) {
    let mut rng = thread_rng();
    // Foi escolhido um limite tão grande justamente pelo bogo sort 
    // poder ser tanto o algoritmo mais rápido quanto o mais lento, 
    // então para não crashar o programa é bom um range grande
    let mut ciclos: u64 = 0;
    loop {
        ciclos +=1;
        lista.shuffle(&mut rng);
        if verifica_ordem(lista.clone()) {
            return (lista, ciclos);
        } 
    }
}

// O valor de u8 para os itens da lista é apenas para 
// gerar números muito grandes e dificultar na visualização
fn gera_lista(len: u8) -> Vec<u8> {
    let mut rng = thread_rng();
    let mut lista = Vec::<u8>::new();
    for _ in 0..len - 1 {
        lista.push(rng.gen());
    }
    return lista;
}

fn main() {
    let lista_desordenada = gera_lista(6);
    print!("Lista desordenada: ");
    for i in lista_desordenada.iter() {
        print!("{i} ")
    }
    println!();

    let (lista, ciclos) = bogo_sort(lista_desordenada);
    println!("Foram necesarios um total de {ciclos} para ordenar");
    print!("Lista ordenada: ");
    for i in lista.iter() {
        print!("{i} ");
    }
    println!();
}

// Testes unitarios
#[cfg(test)]
mod test {
    use super::*;

    #[test]
    fn oredenacao() {
        let mut desordenada = gera_lista(6);
        let (ordenada, _) = bogo_sort(desordenada.clone());
        desordenada.sort();
        assert_eq!(ordenada, desordenada);

        let desordenada = vec![6, 5, 4, 3, 2, 1];
        let (ordenada, _) = bogo_sort(desordenada);
        assert_eq!(ordenada, vec![1, 2, 3, 4, 5, 6]);
    }
}
{'fraction_non_alphanumeric': 0.12452511608273534, 'fraction_numerical': 0.016040523427606587, 'mean_word_length': 2.4641812865497075, 'pattern_counts': {'":': 0, '<': 17, '<?xml version=': 0, '>': 25, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1740265', 'n_tokens_mistral': 1745, 'n_tokens_neox': 1746, 'n_words': 530}