CoddityTeam / movaicode

Concours mensuel du Pire Développeur de France
123 stars 10 forks source link

« un langage fiable, concurrent, pratique » #238

Open AnicetNgrt opened 2 years ago

AnicetNgrt commented 2 years ago

image

extern crate alloc;
use std::{collections::HashMap, fmt::Debug};

const JAVASCRIPT: i32 = 666;

fn main() {
    let priorittaires = vec![
        "dwight@dunder-mifflin.com",
        "michael@dunder-mifflin.com",
        "phyllis@dunder-mifflin.com",
    ];
    let éxpéditeur = vec![
        "dwight@dunder-mifflin.com",
        "jul@totemproduction.fr",
        "michael@dunder-mifflin.com",
        "phyllis@dunder-mifflin.com",
        "matthieu@coddity.com",
    ];
    println!(
        "{}",
        compté_ellamment_qui_sont_les_mèmes::<&str, i32, i32>(priorittaires, éxpéditeur)
    );
}

fn compté_ellamment_qui_sont_les_mèmes<UnTypeDestinataireDunEmail, UnTypePourConpter, K>(
    prioritaire: Vec<UnTypeDestinataireDunEmail>,
    éxpéditeurs: Vec<UnTypeDestinataireDunEmail>,
) -> UnTypePourConpter
where
    UnTypeDestinataireDunEmail: std::cmp::PartialOrd,
    UnTypePourConpter: increment::Incrementable + std::convert::From<i32>,
    UnTypePourConpter: std::default::Default,
    UnTypePourConpter: std::ops::Add<Output = UnTypePourConpter>,
    UnTypePourConpter: std::ops::Sub<Output = UnTypePourConpter>,
    UnTypePourConpter: core::convert::TryFrom<K>,
    UnTypePourConpter: core::marker::Copy,
    K: core::convert::TryFrom<i32>,
    <UnTypePourConpter as TryFrom<i32>>::Error: Debug,
    <K as TryFrom<i32>>::Error: Debug,
    <UnTypePourConpter as TryFrom<K>>::Error: Debug,
    UnTypePourConpter: core::clone::Clone,
    UnTypePourConpter: alloc::borrow::ToOwned<Owned = UnTypePourConpter>,
    UnTypeDestinataireDunEmail: std::hash::Hash,
    UnTypeDestinataireDunEmail: core::marker::Copy,
    UnTypeDestinataireDunEmail: core::cmp::Eq,
{
    let mut deja_trouve = HashMap::<UnTypeDestinataireDunEmail, UnTypePourConpter>::new();

    prioritaire
        .iter()
        .fold(UnTypePourConpter::default(), |conteur, ellemmant| {
            let petite_lambda_car_vive_haskell =
                Box::new(|élamment: &UnTypePourConpter| élamment.clone().to_owned());
            let mut ajout_peutetre = UnTypePourConpter::default();
            let mut ajout_deja = UnTypePourConpter::default();

            conteur
                + éxpéditeurs.iter().fold(
                    UnTypePourConpter::default(),
                    |conmpteur_le_2e, éllément_le_2ème| match éllément_le_2ème
                        .partial_cmp(ellemmant)
                    {
                        Some(ordre) => match ordre {
                            std::cmp::Ordering::Less => {
                                petite_lambda_car_vive_haskell(&conmpteur_le_2e)
                            }
                            std::cmp::Ordering::Equal => match conmpteur_le_2e.increment() {
                                increment::IncResult::Ok(_resultat_balek) => {
                                    ajout_peutetre = match UnTypePourConpter::default().increment()
                                    {
                                        increment::IncResult::Ok(resultat) => resultat,
                                        increment::IncResult::OutOfBounds => {
                                            UnTypePourConpter::try_from(K::try_from(JAVASCRIPT).unwrap())
                                                .unwrap()
                                        }
                                        increment::IncResult::UnknownError(erreur) => {
                                            UnTypePourConpter::try_from(
                                                K::try_from(
                                                    erreur
                                                        .into_bytes()
                                                        .iter()
                                                        .count()
                                                        .try_into()
                                                        .unwrap(),
                                                )
                                                .unwrap(),
                                            )
                                            .unwrap()
                                        }
                                    };
                                    let mut ajout = ajout_peutetre - ajout_deja;
                                    ajout_deja = match UnTypePourConpter::default().increment() {
                                        increment::IncResult::Ok(resultat) => resultat,
                                        increment::IncResult::OutOfBounds => {
                                            UnTypePourConpter::try_from(K::try_from(JAVASCRIPT).unwrap())
                                                .unwrap()
                                        }
                                        increment::IncResult::UnknownError(erreur) => {
                                            UnTypePourConpter::try_from(
                                                K::try_from(
                                                    erreur
                                                        .into_bytes()
                                                        .iter()
                                                        .count()
                                                        .try_into()
                                                        .unwrap(),
                                                )
                                                .unwrap(),
                                            )
                                            .unwrap()
                                        }
                                    };
                                    if let Some(_trouve_deja_mais_balek) =
                                        deja_trouve.get(&éllément_le_2ème)
                                    {
                                        ajout = UnTypePourConpter::default()
                                    }
                                    deja_trouve.insert(*éllément_le_2ème, conmpteur_le_2e);

                                    conmpteur_le_2e + ajout
                                }
                                increment::IncResult::OutOfBounds => {
                                    UnTypePourConpter::try_from(K::try_from(JAVASCRIPT).unwrap()).unwrap()
                                }
                                increment::IncResult::UnknownError(erreur) => {
                                    UnTypePourConpter::try_from(
                                        K::try_from(
                                            erreur.into_bytes().iter().count().try_into().unwrap(),
                                        )
                                        .unwrap(),
                                    )
                                    .unwrap()
                                }
                            },
                            std::cmp::Ordering::Greater => {
                                petite_lambda_car_vive_haskell(&conmpteur_le_2e)
                            }
                        },
                        None => petite_lambda_car_vive_haskell(&conmpteur_le_2e),
                    },
                )
        })
}