CoddityTeam / movaicode

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

Vers une Lune de crêpes, et au-delà (c++) #273

Open arnaudvericel opened 1 year ago

arnaudvericel commented 1 year ago
/*
Une solution propre à pousser en production dès que possible
Une API aussi naturelle qu'élégante
Je suis quasiment sûr qu'on utilise des pointeurs à certains endroits
Bien cordialement
*/

#include <iostream>

float SURFACE_CREPE_CM2 = 13.5 * 13.5 * 3.14159;
float SURFACE_CREPE_M2 = SURFACE_CREPE_CM2 / 1e4;
float SURFACE_CREPE_KM2 = SURFACE_CREPE_CM2 / 1e10;
float SURFACE_CREPE_LUNE = 4 * 3.14159 * 1737.4 * 1737.4 * 1e10 ; // cm2

float UNE_CREPE[5] = {0.25, 20., 3.5, 4, 0.25};
float MA_CREPE[5] = {0, 0, 0, 0, 0};

enum Unite
{
    cm2 = 1,
    m2,
    km2,
    lune,
};

/* à ne pas confondre avec Ingredients */
template <class T>
class Ingredient
{
private:
    T val;
public:
    Ingredient(): val(0) {}
    Ingredient(const T& _val): val(_val) {}
    void TODO(T _val) { val = _val; } // std::cout << "flag 1";
    T MateMoiCetteValeur() const { return val; }
};
typedef Ingredient<float> INGREDIENTS;

/* attention à ne pas confondre avec INGREDIENTS ou encore Ingredient */
struct Ingredients 
{
    INGREDIENTS oeuf;
    INGREDIENTS farine;
    INGREDIENTS beurre;
    INGREDIENTS lait;
    INGREDIENTS sucre;

    Ingredients(float dur, float ble, float doux, float vache, float canne): oeuf(INGREDIENTS(dur)), farine(INGREDIENTS(ble)), beurre(INGREDIENTS(doux)), lait(INGREDIENTS(vache)), sucre(INGREDIENTS(canne)) {}
};

/* Comme son nom l'indique, la méthode fait un calcul sur une face de la crêpe */
void calculSurfaceCrepe(Ingredients* poing_heure, const Unite& unite=Unite::cm2)
{
    float* laCrepeOriginelle = UNE_CREPE;
    float* maCrepeActuelle = MA_CREPE;
    int delta = 0;  

    // TODO : trouver un moyen de ne boucler que sur le strict nécessaire
    for (int q=0; q<54; ++q)
    {
        if (q >= 0 && q < 5)
        {
            INGREDIENTS vz = INGREDIENTS();
            if (q == 0) vz.TODO((*poing_heure).oeuf.MateMoiCetteValeur() / (*(laCrepeOriginelle + q)));
            else if (q == 4) vz.TODO((*poing_heure).sucre.MateMoiCetteValeur() / (*(laCrepeOriginelle + q)));
            else if (q == 3) vz.TODO((*poing_heure).lait.MateMoiCetteValeur() / (*(laCrepeOriginelle + q)));
            else if (q == 1) vz.TODO((*poing_heure).farine.MateMoiCetteValeur() / (*(laCrepeOriginelle + q)));
            else if (q == 2) vz.TODO((*poing_heure).beurre.MateMoiCetteValeur() / (*(laCrepeOriginelle + q)));
            *(maCrepeActuelle + q + delta) = vz.MateMoiCetteValeur();
        }
        else
        {
            continue;
        }
    }

    // TODO : trouver un moyen de ne boucler que sur le strict nécessaire
    INGREDIENTS cr = INGREDIENTS();
    for (int q=0; q<54; ++q)
    {
        if (q >= 0 && q < 5)
        {
            if (*(maCrepeActuelle + q + delta) < cr.MateMoiCetteValeur() || q == 0 || delta > 2)
            {
                cr.TODO(*(maCrepeActuelle + q + delta));
            }
        }
        else
        {
            continue;
        }
    }
    std::cout << "Surface de crêpe : ";
    switch (unite)
    {
         case Unite::cm2:
        std::cout << cr.MateMoiCetteValeur() * SURFACE_CREPE_M2 * 10000 << " cm² - soit " << cr.MateMoiCetteValeur() << " crêpe(s)" << std::endl;
        break;
         case Unite::m2:
        std::cout << cr.MateMoiCetteValeur() * SURFACE_CREPE_M2 << " m² - soit " << cr.MateMoiCetteValeur() << " crêpe(s)" << std::endl;
        break;
         case Unite::km2:
        std::cout << cr.MateMoiCetteValeur() * SURFACE_CREPE_CM2 / 10e10  << " km² - soit " << cr.MateMoiCetteValeur() << " crêpe(s)" << std::endl;
        break;
    case Unite::lune:
        std::cout << cr.MateMoiCetteValeur() * SURFACE_CREPE_CM2 / SURFACE_CREPE_LUNE << " lune - soit " << cr.MateMoiCetteValeur() << " crêpe(s)" << std::endl;
        break;
      }

}

int main()
{
    // 1/2 oeuf, 50g farine, 7g beurre, 8cl lait, 1/2 morceau de sucre => assez pour deux crêpes
    Ingredients* ingredients = new Ingredients(0.5, 50., 7, 8, 0.5);
    // 1.67e15 oeufs, 1.34e16g farine, 2.5e15g beurre, 2.66e15cl lait, 1.66e14 morceaux de sucre => assez pour recouvrir la lune
    Ingredients* ingredients_lune = new Ingredients(1.67e15, 1.34e16, 2.5e15, 2.66e15, 1.66e14);

    std::cout << "Classique :" << std::endl;
    calculSurfaceCrepe(ingredients, Unite::cm2);
    calculSurfaceCrepe(ingredients, Unite::m2);
    std::cout << "---" << std::endl;
    std::cout << "Pour recouvrir la lune :" << std::endl;
    calculSurfaceCrepe(ingredients_lune, Unite::km2);
    calculSurfaceCrepe(ingredients_lune, Unite::lune);

    delete ingredients;
    delete ingredients_lune;
    return 0;
}

Résultat produit :

Classique :
Surface de crêpe : 1145.11 cm² - soit 2 crêpe(s)
Surface de crêpe : 0.114511 m² - soit 2 crêpe(s)
---
Pour recouvrir la lune :
Surface de crêpe : 3.80176e+06 km² - soit 6.64e+14 crêpe(s)
Surface de crêpe : 1.00225 lune - soit 6.64e+14 crêpe(s)