CoddityTeam / movaicode

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

Ou il est Tom ? ( Scala 3 ) #235

Open wahtique opened 2 years ago

wahtique commented 2 years ago

Du typage pour rien, des noms nuls et des operations pas safe.

import scala.util.Random

// typer c'est le bien !
// meme sis ceux la servent a rien c'est toujours des String
type TomCruise = "Tom Cruise"
type Marche = "marche"
// pour pas s'arrêter en si bon chemin
type TomCruiseOuMarche = TomCruise | Marche
type DesMarchesEtTom = List[TomCruiseOuMarche]
type QueDesMarches = List[Marche]
type QueTom = List[TomCruise]

/**
 * La fonction principale ! 
 * Fait avancer Tom Cruise jusqu'au bout.
 * Il va peut etre faire des pas en avant ou en arriere. Depend des paparazzis :)
 * 
 * @param desMarchesEtTom sa position au debut
 * @return sa position a la fin ( toujours la meme d'ailleurs)
 * 
 */
def enAvantTom(desMarchesEtTom: DesMarchesEtTom) =  

    // interessant a remarquer : melanger avec un Random serait plus performant que laisser ça ici...
    // vu que la permutation qui nous intersse est toujours a la fin 
    val lesAllersEtRetoursDeTom = desMarchesEtTom.permutations.toSeq

    type PositionsDeTom = Seq[DesMarchesEtTom]

    // la recursivité c'est la vie !
    // fait faire de l'exercice au processeur 
    def iterSurSesAllersEtRetours(laOuEstTomMaintenant: DesMarchesEtTom, laOuTomPeutEtre: PositionsDeTom): DesMarchesEtTom =
        // a noter que ce le compilo fait tres justement remarquer que ce match n'est pas exhaustif
        // et peut fail mysterieusement si on arrive au bout de la liste des permutations de Tom et des marches
        // sans trouver cell ou il est a la fin
        // apres ça n'arrivera pas parceque on est pas aussi betes que lui
        (laOuEstTomMaintenant.reverse.head, laOuTomPeutEtre) match 
            case (_: TomCruise, _) => 
                println(s"Et enfin : ${laOuEstTomMaintenant.mkString(", ")}")
                laOuEstTomMaintenant
            case (_, suivant :: lesSuivants) =>
                println(s"Et ensuite : ${laOuEstTomMaintenant.mkString(", ")}")
                iterSurSesAllersEtRetours(suivant, lesSuivants)

    println(s"Au commencement il y avait : ${desMarchesEtTom.mkString(", ")}")
    println(s"Puis il y eu : ${lesAllersEtRetoursDeTom.head.mkString(", ")}")
    iterSurSesAllersEtRetours(lesAllersEtRetoursDeTom.head, lesAllersEtRetoursDeTom.tail)

val tomArrive: DesMarchesEtTom = List("Tom Cruise", "marche", "marche", "marche", "marche", "marche", "marche")

enAvantTom(tomArrive)
Matthieu-Coddity commented 2 years ago

hello @wahtique ! Merci pour ta participation à cette édition :)

Meme si le "typage pour rien" était parfaitement inutile, la communauté a jugé ton code bien trop bon pour remporter cette manche 😔 Donc félicitations! Tu es un bon développeur 😎

N'hésite pas à tenter ta chance pour la prochaine édition, spéciale hot summer 2022 !

++