Battle Dev RegionsJob avec Codingame

Codingame, qu’est ce que c’est ?
Ceci est un site de concours de dev sponsorisé par des entreprises. Le but pour certain est de s’amuser, pour d’autre il est de trouver un emploi. Je vous invite a regarder ce site pour voir son fonctionnement et à vous entrainer sur les épreuves passées.

logo-codingame

 

RegionsJob, qu’est-ce que c’est ?
Ceci un site spécialisé dans la recherche d’emploi.
RegionsJob en partenariat avec Codingame ont proposé une épreuve « Battle Dev » qui a donc permis a des candidat de postuler a différentes entreprises en réalisant une épreuve de dev pour montrer leurs compétences.

 

 

Pour l’épreuve plusieurs langage sont proposés (~15). Pour ma part j’ai choisi le PERL.
L’énoncé indiquait les règles de grammaires à suivre et comment devait se dérouler le script.
Au final en entré on avait un dictionnaire puis à la fin une phrase mal orthographiée.

Il fallait faire un script intelligent, capable de corriger les fautes d’accord et de conjugaison dans la phrase.

Un programme intéressant qui ne faisait pas appel aux noeuds (comme les précédentes épreuves …). Le 100% était atteignable facilement cependant un correctif de dernière minutes qui m’a permis de valider les derniers test qu’il me manquait a cassé la validation de plusieurs test précédent … J’aurais dû tester l’ensemble des test avant de faire mon rendu. Bien dégouté de pas avoir testé car le 100% était atteignable avec 3 lignes de code supplémentaires … ducoup je doit me contenter d’un 52% …

Voici le code que j’ai rendu et qui ne fait donc que 52% de l’épreuve :

#!/usr/bin/perl

use Data::Dumper;
use Switch;

my %verbe;
my $tmp;
my %adj;
my %nom;
my $i; #compteur pour boucle
my $resultat = ''; # la phrase final
my $phrase;
my $sujet;
my @suite; # le reste de la phrase
my $accord;
my $tmpResultat1;
my $tmpResultat2;

# on récupère toute les valeurs

$tmp = <STDIN>;
($verbe->{'je'}, $verbe->{'tu'}, $verbe->{'il'}, $verbe->{'nous'}, $verbe->{'vous'}, $verbe->{'ils'} ) = split(/ /, $tmp);

my $nbAdj = <STDIN>; #nb adj

for ($i = 0; $i < $nbAdj; $i++)
{
    $tmp = <STDIN>;
    ($adj->{$i}->{'ms'}, $adj->{$i}->{'mp'}, $adj->{$i}->{'fs'}, $adj->{$i}->{'fp'} ) = split(/ /, $tmp);
    $adj->{$i}->{'xp'} = $adj->{$i}->{'mp'};
}

my $nbNom = <STDIN>; #nb nom

for ($i = 0; $i < $nbNom; $i++)
{
    $tmp = <STDIN>;
    ($nom->{$i}->{'genre'}, $nom->{$i}->{'s'}, $nom->{$i}->{'p'} ) = split(/ /, $tmp);
    $nom->{$i}->{'xp'} = $nom->{$i}->{'p'};

    if ($nom->{$i}->{'genre'} eq 'masculin')
    {
        $nom->{$i}->{'ms'} = $nom->{$i}->{'s'};
        $nom->{$i}->{'mp'} = $nom->{$i}->{'p'};
    }
    else
    {
        $nom->{$i}->{'fs'} = $nom->{$i}->{'s'};
        $nom->{$i}->{'fp'} = $nom->{$i}->{'p'};
    }
}

$phrase = <STDIN>; #la phrase initiale

# traitement

($sujet, @suite ) = split(/ /, $phrase);

switch($sujet)
{
    case 'je'       {$resultat = $sujet . ' ' . $verbe->{'je'};}
    case 'tu'       {$resultat = $sujet . ' ' . $verbe->{'tu'};}
    case 'il'       {$resultat = $sujet . ' ' . $verbe->{'il'};}
    case 'elle'     {$resultat = $sujet . ' ' . $verbe->{'il'};}
    case 'nous'     {$resultat = $sujet . ' ' . $verbe->{'nous'};}
    case 'vous'     {$resultat = $sujet . ' ' . $verbe->{'vous'};}
    case 'ils'      {$resultat = $sujet . ' ' . $verbe->{'ils'};}
    case 'elles'    {$resultat = $sujet . ' ' . $verbe->{'ils'};}
    else {

        switch($sujet)
        {
            case 'le'   {$accord = 'ms';}
            case 'la'   {$accord = 'fs';}
            case 'un'   {$accord = 'ms';}
            case 'une'  {$accord = 'fs';}
            case 'les'  {$accord = 'xp';}
            case 'des'  {$accord = 'xp';}
        }

        $resultat       = $sujet . ' ';
        $tmpResultat1   = $resultat;
        $tmpResultat2   = $resultat;

        foreach my $mot (@suite)
        {
            $mot = substr $mot, 0, 3;

            if( $verbe->{'je'} =~ m/^$mot/ )
            {
                goto PHRASE;
            }

            for ($i=0;$i<$nbNom;$i++)
            {
                if( $nom->{$i}->{$accord} =~ m/^$mot/ )
                {
                    if ($accord eq 'xp')
                    {
                        if ($nom->{$i}->{'genre'} eq 'masculin')
                        {
                            $accord = 'mp';
                            $tmpResultat1 = $tmpResultat1 . $nom->{$i}->{$accord} . ' ';
                        }
                        else
                        {
                            $accord = 'fp';
                            $tmpResultat1 = $tmpResultat2 . $nom->{$i}->{$accord} . ' ';
                        }
                    }
                    else
                    {
                        $tmpResultat1 = $tmpResultat1 . $nom->{$i}->{$accord} . ' ';
                    }
                }
            }

            for ($i=0;$i<$nbAdj;$i++)
            {
                if( $adj->{$i}->{$accord} =~ m/^$mot/ )
                {
                    if ($accord eq 'xp')
                    {
                        $tmpResultat1 = $tmpResultat1 . $adj->{$i}->{'mp'} . ' ';
                        $tmpResultat2 = $tmpResultat2 . $adj->{$i}->{'fp'} . ' ';
                    }
                    else
                    {
                        $tmpResultat1 = $tmpResultat1 . $adj->{$i}->{$accord} . ' ';
                    }
                }
            }
        }

        PHRASE : {
            switch($accord)
            {
                    case 'ms' {$resultat = $tmpResultat1 . $verbe->{'il'};}
                    case 'mp' {$resultat = $tmpResultat1 . $verbe->{'ils'};}
                    case 'fs' {$resultat = $tmpResultat1 . $verbe->{'il'};}
                    case 'fp' {$resultat = $tmpResultat1 . $verbe->{'ils'};}
            }
        }
    }
}

my $verbeDone = 0;
foreach my $mot (@suite)
{
    $mot = substr $mot, 0, 3;

    if( $verbe->{'je'} =~ m/^$mot/ )
    {
        $verbeDone = 1;
        next;
    }

    if ($verbeDone eq 0)
    {
        next;
    }

    if ($verbeDone eq 1)
    {
        switch($mot)
        {
            case 'le'   {$accord = 'ms';$verbeDone=2;}
            case 'la'   {$accord = 'fs';$verbeDone=2;}
            case 'un'   {$accord = 'ms';$verbeDone=2;}
            case 'une'  {$accord = 'fs';$verbeDone=2;}
            case 'les'  {$accord = 'xp';$verbeDone=2;}
            case 'des'  {$accord = 'xp';$verbeDone=2;}
        }
        $resultat = $resultat . ' ' . $mot . ' ';
        $tmpResultat1   = $resultat;
        $tmpResultat2   = $resultat;
        next;
    }

    for ($i=0;$i<$nbNom;$i++)
    {
        if( $nom->{$i}->{$accord} =~ m/^$mot/ )
        {
            if ($accord eq 'xp')
            {
                if ($nom->{$i}->{'genre'} eq 'masculin')
                {
                    $accord = 'mp';
                    $tmpResultat1 = $tmpResultat1 . $nom->{$i}->{$accord} . ' ';
                }
                else
                {
                    $accord = 'fp';
                    $tmpResultat1 = $tmpResultat2 . $nom->{$i}->{$accord} . ' ';
                }
            }
            else
            {
                $tmpResultat1 = $tmpResultat1 . $nom->{$i}->{$accord} . ' ';
            }
        }
    }

    for ($i=0;$i<$nbAdj;$i++)
    {
        if( $adj->{$i}->{$accord} =~ m/^$mot/ )
        {
            if ($accord eq 'xp')
            {
                $tmpResultat1 = $tmpResultat1 . $adj->{$i}->{'mp'} . ' ';
                $tmpResultat2 = $tmpResultat2 . $adj->{$i}->{'fp'} . ' ';
            }
            else
            {
                $tmpResultat1 = $tmpResultat1 . $adj->{$i}->{$accord} . ' ';
            }
        }
    }
}
switch($accord)
{
    case 'ms' {$resultat = $tmpResultat1}
    case 'mp' {$resultat = $tmpResultat1}
    case 'fs' {$resultat = $tmpResultat1}
    case 'fp' {$resultat = $tmpResultat1}
}

$resultat =~ s/\n//g; # on supprime les retour a la ligne en trop
$resultat =~ s/ $//g; # on supprime l'espace a la fin si c'est le dernier mots

print $resultat;

Comment améliorer le code ?
1 – Ajouter des commentaires
2 – modifier le fin du code en :

if ($verbeDone eq 2)
{
    switch($accord)
    {
        case 'ms' {$resultat = $tmpResultat1}
        case 'mp' {$resultat = $tmpResultat1}
        case 'fs' {$resultat = $tmpResultat1}
        case 'fp' {$resultat = $tmpResultat1}
    }
}

$resultat =~ s/\n//g; # on supprime les retour a la ligne en trop
$resultat =~ s/ $//g; # on supprime l'espace a la fin si c'est le dernier mots

print $resultat;

une petite condition qui aurait permit le 100% … tempi ..

Allez vivement la prochaine épreuve Codingame !

3 commentaires

    Répondre92
  1. Photo d'avatar
    dolmen 27-01-2014 à 17:04

    Oublie "use Switch" et utilise plutôt given/when de Perl 5.10+

  2. Répondre86
  3. Photo d'avatar
    newrare 24-10-2013 à 08:47

    Lol... Looser :p

  4. Répondre84
  5. Photo d'avatar
    toto 02-10-2013 à 21:34

    Effectivement c'est dommage tu aurai pu finir 2ème en Perl, et très proche du 1er.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *