CoddityTeam / movaicode

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

[MOVAICODE 18] En bon débutant PHP je ne pouvais ignorer le message. J'ai appris pleins de choses en plus ! #287

Open loclamor opened 1 year ago

loclamor commented 1 year ago
<?php
define('TAB', "\t");
define('mois', array(
   1 => 'janvier',
    2=> 'février',
       3 =>'mars',
       4=>'avril',
       5 => 'mai',
        6=>'juin',
     7=>"juillet",
       8 =>"août",
 9 => 'septembre',
  10 => "octobre",
11  => 'novembre',
 12  =>'décembre'
));
function extraitNom($i, $t) {
    $j = $i + 1;
    $return = '';
    while($t[$j] != TAB) {
        $return .= $t[$j];
        $j += 1;
    }
    return $return;
}
// récup des signes
$c = file_get_contents("https://raw.githubusercontent.com/CoddityTeam/movaicode/master/README.md");
$c = str_split($c);
function extrait_Date($c, $i)
{
    $date = "";
    for( $k=($i + count(str_split(extraitNom($i, $c)))) + 2 ; $c[$k] != TAB ; $k++) {
        $date = $date.$c[$k];
    }
    return $date;
}
foreach ($c as $i => $v) {
    if ($v == '-' && $c[$i-1] == PHP_EOL) {
        $s[] = extraitNom($i, $c);
        // récup de la date
        $d = extrait_Date ($c, $i);
        $d_parts = explode ('-', $d);
        $dateDebut[] = [
            substr($d_parts[0], 0, 2),
            array_flip(mois)[substr($d_parts[0], 3, -1)],
        ];
        // @TODO : pareil pour la date de fin
    }
}
// récupérer les arguments
$date = $argv[1];
$signe_Astro = new AstroSigne($date);
$signe_Astro->setSignes($s);
$signe_Astro->setDatesDebDesSignesAstro($dateDebut);
$signe_Astro->setDateRecherchée($date);
// tout simplement appeler cette méthode pour connaitre le signe de la date passée en premier paramètre du script
echo $signe_Astro->monSigne();
class AstroSigne extends stdClass
{
    private $properties = [];

    public function __construct($date)
    {
    }

    public function __call($func, $args)
    {
        if (substr($func, 0, 3) == 'get') {
            $varToGet = substr($func, 3);
            $varToGet = strtolower(substr($varToGet, 0, 1)) . substr($varToGet, 1);
            return $this->properties[$varToGet];
        } elseif (substr($func, 0, 3) == 'set') {
            $varToSet = substr($func, 3);
            $varToSet = strtolower(substr($varToSet, 0, 1)) . substr($varToSet, 1);
            $this->properties[$varToSet] = $args[0];
        }
    }

    public function monSigne()
    {
        $jour = explode('/', $this->getDateRecherchée())[0];
        $mois = explode('/', $this->getDateRecherchée())[1];
        $moisNumero = intVal($mois);
        $mois = mois[$moisNumero];
        // on cherche le signe
        $signe = 'pas trouvé :o';
        foreach ($this->getSignes() as $i => $s) {
            $iPlusUn = $i + 1;
            if ($iPlusUn >= count($this->getDatesDebDesSignesAstro())) {
                $iPlusUn = 0;
            }
            $numeroJour = intval($moisNumero . $jour);
            if (
                $numeroJour >= intval(intval ($this->getDatesDebDesSignesAstro()[$i][1]) . intVal($this->getDatesDebDesSignesAstro()[$i][0]))
                && $numeroJour < intval(((int) $this->getDatesDebDesSignesAstro()[$iPlusUn][1]) . intval($this->getDatesDebDesSignesAstro()[$iPlusUn][0]))
            ) {
                $signe = trim($s);
                $signe = new $signe();
            }
        }
        if ($signe === 'pas trouvé :o') {
            // signe à cheval sur fin / début année du coup ça bug
            $signe = new Capricorne();
        }
        return $signe;
    }
}
abstract class SigneAstro extends stdClass {
    public function getText() {
        return 'Je suis un ' . get_class($this);
    }
}
abstract class Feu extends SigneAstro {
    protected $type = 'Feu';
    public function getText() {
        return parent::getText() . ', signe du ' . $this->type . ' ♈';
    }
}
abstract class Terre extends SigneAstro {
    protected $type = 'Terre';
    public function getText() {
        return parent::getText() . ', signe de la ' . $this->type . " ♉";
    }
}
abstract class Air extends SigneAstro {
    protected $type = 'Air';
    public function getText() {
        return parent::getText() . ', le signe de l\'' . $this->type . " ♊";
    }
}
abstract class Eau extends SigneAstro {
    protected $type = 'Eau';
    public function getText() {
        return parent::getText() . ', le signe de l\'' . $this->type . " ♋";
    }
}
class Bélier extends Feu {
    public function __toString() {
        return $this->getText();
    }
}
class Taureau extends Terre {
    public function __toString() {
        return $this->getText();
    }
}
class Gémeaux extends Air {
    public function __toString() {
        return $this->getText();
    }
}
class Cancer extends Eau {
    public function __toString() {
        return $this->getText();
    }
}
class Lion extends Feu {
    public function __toString() {
        return $this->getText();
    }
}
class Vierge extends Terre {
    public function __toString() {
        return $this->getText();
    }
}
class Balance extends Air {
    public function __toString() {
        return $this->getText();
    }
}
class Scorpion extends Eau {
    public function __toString() {
        return $this->getText();
    }
}
class Sagittaire extends Feu {
    public function __toString() {
        return $this->getText();
    }
}
class Capricorne extends Terre {
    public function __toString() {
        return $this->getText();
    }
}
class Verseau extends Air {
    public function __toString() {
        return $this->getText();
    }
}
class Poissons extends Eau {
    public function __toString() {
        return $this->getText();
    }
}

Le script récupère simplement la liste des signes depuis le readme avec les bonnes dates, puis on instancie notre super objet qui permet de retourner la bonne date en fonction du paramètre passé en paramètre.

par exemple : $ php monscript.php 12/04/2004 affiche Je suis un Bélier, signe du Feu ♈