Quel colis pour quelle destination ?

Photo by Mediamodifier / Unsplash

Cette semaine, c'est Maxime qui vous propose un #KataOfTheWeek : Séparateur de colis

Briefing du Kata : L'idée ici est d'aider au dispatch des colis qui arrivent sur un tapis roulant afin de les séparer en plusieurs piles. On symbolisera le tapis roulant par un tableau de chaîne de caractère contenant les numéros de suivi des colis scannés par le système. Attention, il peut arriver que le système ne puisse pas lire le numéro de suivi, il renverra alors la chaîne "ERREUR".

On aura donc un tableau d'entrée sous le forme
["FR123456789A", "GB987654321X", "ERREUR", "FR112233445F", "DE7788995U"]

On suppose pour simplifier que si le système ne renvoie pas "ERREUR" lors de la lecture, le numéro de suivi renvoyé est au bon format, à savoir 2 lettres, 9 chiffres, 1 lettre.

A partir de cette entrée le système doit dispatcher les colis en plusieurs tas en fonction du pays de destination que l'on peut déterminer à partir des deux premières lettres du numéro de suivi. Les colis en erreur seront ajoutés à un tas "ERR" qui demandera une vérification manuelle. On symbolisera cela par un regroupement de couple clé-valeurs où la clé sera le code pays et la valeur un tableau de chaîne de caractères regroupant les colis par destination. Pour la ligne ERR, on incrémentera juste un entier.

Par exemple, avec l'entrée précédente, la sortie sera :

{
    "FR": ["FR123456789A", "FR112233445F"],
    "GB": ["GB987654321X"],
    "DE": ["DE7788995U"],
    "ERR": 1
}

Saurez-vous résoudre le problème ?

Bon courage !


Et sinon, voici une solution proposée par l'auteur en Typescript :

function splitPackages(packages: string[]) {
    // retrouver toutes les destinations possible
    const destinations: string[] = [];
    const result: any = {};
    let nbErr: number = 0;
    packages.forEach((pkg: string) => {
        if (pkg !== "ERREUR") {
            destinations.push(pkg.substring(0,2))
        } else {
            nbErr++;
        }
    });

    // suppression doublons
    const destUnique: string[] = [...new Set(destinations)];

    // remplir chaque destination avec les numéros de suivi
    destUnique.forEach( (dest: string) => {
        const pkgs: string[] = packages.filter((pack: string) => pack.substring(0,2) === dest);
        result[dest] = pkgs;
    });

    // ajout du nombre d'erreur
    result.err = nbErr;

    return result;
}
// Output : 
// {
//      DE: ["DE7788995U"],
//      err: 1,
//      FR: ["FR123456789A", "FR112233445F"],
//      GB: ["GB987654321X"]
// }
console.log(splitPackages(["FR123456789A", "GB987654321X", "ERREUR", "FR112233445F", "DE7788995U"]));

Votre équipe TakiVeille

TakiVeille

TakiVeille