Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1221 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Loi de répartition de l'alcool à une soirée

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Loi de répartition de l'alcool à une soirée

n°2197191
mbl
Posté le 11-07-2013 à 16:31:49  profilanswer
 

Bonjour à tous,

 

Non ce n'est pas un devoir, non ce topic n'est pas à but lucratif.
On m'a fourni une formule censé régir l'apport de chacun en boisson à une soirée.

 

Cette formule est la suivante :

 
Code :
  1. [{(nb bieres apportées ) x % alcool de la marque} + {(nb bouteilles alcoolisées apportées* ) x % alcool de la marque} + {10 x nb Litres non alcoolisé apportés }] > poids de la personne
  2. Champagne = 2 bouteilles alcoolisées.
 


Vous me direz que au final nb bières x % alcool de la marque est identique à nb bouteilles alcoolisée x % d'alcool.
Mais non. Car les bières se vendent en pack ! Et que les bouteilles se vendent à l'unité (dans un monde plus ou moins normal en faisant des généralités).

 

Le code pour vérifier si l'on a pris suffisamment en fonction de son poids est assez facile. Toutefois le contraire est bien plus chiant à faire (avec mes modestes connaissances en programmation proche de pas grand chose).
Est ce que quelqu'un se sentirait d'attaque pour pisser une petite fonction en php(ou autre) qui balancerait un ordre de grandeur en prenant les hypothèses suivantes :

 

Une fille fait entre 40 et 66kg (au dessus elle est grosse et sera considérée comme un homme :o ) et consomme des alcools "forts" à 20°.
Un homme fait au dessus de 66Kg (en dessous c'est pas vraiment un homme et il sera considéré comme un enfant :o ) et consomme des alcools forts à 40°.
Un pack de bière se vend par multiple de 6.
Personne ne boit de champagne. On est pas là pour fêter le nouvel an.

 

Par contre si vous avez des pistes à me donner sur comment créé mon algorithme au niveau de la correspondance des 3 variables je pense pouvoir réussir à me débrouiller par la suite mais là je sais pas mon cerveau ne veut pas tourner.

 

Si ce message est hors charte je le supprimerai pas de soucis. C'est juste pour aider l'humanité à la veille du 14 juillet.

 

Merci d'avance !

 

*Une carte sim bouygues périmée à gagner (hors frais d'envoi)

 



Message édité par mbl le 11-07-2013 à 16:51:39

---------------
-3dB
mood
Publicité
Posté le 11-07-2013 à 16:31:49  profilanswer
 

n°2197490
LeRiton
Posté le 15-07-2013 à 11:38:32  profilanswer
 

Ce topic  [:ddr555]  
C'est plus un problème d'algo que de PHP à mon sens.
 
Ce que tu souhaites, c'est une méthode pour, à partir du poid et du sexe d'une personne, déterminer ce qu'elle doit amener ?
Si oui, t'auras pas de résultats générique, étant donné que ton résultat est une quantité d'alcool (pour faire simple) et que tu peux pondérer cette quantité selon plusieurs facteurs différents.
 
La version simple, c'est faire 3 méthodes, qui retournent soit ce que tu dois amener en soft selon ton poids, soit en hard, soit en binches.
 
Sinon, tu met un ratio et des priorité, et tu retournes un assortiment :o
Genre tu détermines que le lot 'idéal' est constitué de 1.5 volume de bières (x), 1 volume de hard (y) et 0.5 volume de soft (z), avec cet ordre comme priorité. Tu retourne un objet qui te donne les quantités de ce qu'elle doit amener pour ces 3 catégories. Pour une nana de 50kg et de la bière à 5% en appliquant ces ratios, ça te donne un pack de 6, 1L de hard et 1L de soft.
 
Le tout étant de trouver la combinaison qui s'approche le plus de la valeur cible, lorsque les comptes ne tombent pas juste comme pour mon exemple.
Un algo qui te permet de répondre à ce cas est celui du sac à dos http://en.wikipedia.org/wiki/Knapsack_problem
 
Tu devrais réaliser les énoncés pour le bac [:dawa]

n°2197492
mbl
Posté le 15-07-2013 à 11:41:53  profilanswer
 

Merci bien pour toutes ces indications.  
 
Au final un pote javiateur m'a aidé et donc finalement on est passé par le java.  
ça marche pas trop mal même si je pense qu'il faudrait faire 2 - 3 retouches et qu'il lui arrive de planter de temps en temps...  
 
Si ça intéresse des gens :  
 

Code :
  1. import java.awt.BorderLayout;
  2. import java.awt.Color;
  3. import java.awt.Dimension;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. import java.util.ArrayList;
  7. import java.util.Arrays;
  8. import java.util.List;
  9. import javax.swing.JFrame;
  10. import javax.swing.JLabel;
  11. import javax.swing.JOptionPane;
  12. import javax.swing.JScrollPane;
  13. import javax.swing.JTable;
  14. import javax.swing.JTextField;
  15. import javax.swing.table.AbstractTableModel;
  16. public class BringItOn {
  17. private static final class M extends AbstractTableModel {
  18.  /**
  19.   *  
  20.   */
  21.  private static final long serialVersionUID = 1L;
  22.  private final int[] counts = new int[NAMES.size()];
  23.  private final float[] value = new float[NAMES.size()];
  24.  private final JLabel lbl;
  25.  private final int[] w;
  26.  {
  27.   value[NAMES.indexOf(SO)] = 0;
  28.   value[NAMES.indexOf(BI)] = 4;
  29.   value[NAMES.indexOf(BO)] = 20;
  30.   value[NAMES.indexOf(CHP)] = 12.5f;
  31.  }
  32.  public M(JLabel lbl, int[] w) {
  33.   this.lbl = lbl;
  34.   this.w = w;
  35.  }
  36.  @Override
  37.  public Class<?> getColumnClass(int columnIndex) {
  38.   return String.class;
  39.  }
  40.  @Override
  41.  public Object getValueAt(int rowIndex, int columnIndex) {
  42.   if (columnIndex == 0) {
  43.    return NAMES.get(rowIndex);
  44.   } else if (columnIndex == 1) {
  45.    return counts[rowIndex];
  46.   } else if (columnIndex == 2) {
  47.    return value[rowIndex];
  48.   }
  49.   return null;
  50.  }
  51.  @Override
  52.  public String getColumnName(int columnIndex) {
  53.   if (columnIndex == 0) {
  54.    return "Type";
  55.   } else if (columnIndex == 1) {
  56.    return "Nombre";
  57.   } else if (columnIndex == 2) {
  58.    return "%";
  59.   }
  60.   return "";
  61.  }
  62.  @Override
  63.  public int getRowCount() {
  64.   return NAMES.size();
  65.  }
  66.  @Override
  67.  public int getColumnCount() {
  68.   return 3;
  69.  }
  70.  @Override
  71.  public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
  72.   if (columnIndex == 1) {
  73.    counts[rowIndex] = Integer.parseInt(aValue.toString());
  74.    if (rowIndex == NAMES.indexOf(BI)) {
  75.     if (counts[rowIndex] % 6 != 0) {
  76.      JOptionPane.showMessageDialog(null, "Tocard, les " + BI
  77.        + " ca va toujours par 6 !" );
  78.      counts[rowIndex] = 0;
  79.     }
  80.    }
  81.   } else if (columnIndex == 2) {
  82.    value[rowIndex] = Float.parseFloat(aValue.toString());
  83.   }
  84.   updateResult();
  85.  }
  86.  public void updateResult() {
  87.   float computeValue = compute();
  88.   boolean isOK = isOk(computeValue);
  89.   if (isOK) {
  90.    lbl.setForeground(Color.GREEN);
  91.    lbl.setText("Suit up ! Tu pèses maintenant" + computeValue );
  92.   } else {
  93.    lbl.setForeground(Color.RED);
  94.    lbl.setText("Bring more (" + computeValue + " < " + w[0] + " )" );
  95.   }
  96.   System.err.println(computeValue);
  97.  }
  98.  public boolean isOk(float computeValue) {
  99.   boolean isOK = computeValue >= w[0];
  100.   return isOK;
  101.  }
  102.  public float compute() {
  103.   float bi = counts[NAMES.indexOf(BI)] * value[NAMES.indexOf(BI)];
  104.   float bo = counts[NAMES.indexOf(BO)] * value[NAMES.indexOf(BO)];
  105.   float chp = counts[NAMES.indexOf(CHP)] * value[NAMES.indexOf(CHP)]
  106.     * 2;
  107.   float so = counts[NAMES.indexOf(SO)] * 10;
  108.   float computeValue = bi + bo + chp + so;
  109.   return computeValue;
  110.  }
  111.  @Override
  112.  public boolean isCellEditable(int rowIndex, int columnIndex) {
  113.   if (columnIndex == 0)
  114.    return false;
  115.   else if (columnIndex == 1)
  116.    return true;
  117.   else if (columnIndex == 2
  118.     && (getValueAt(0, columnIndex).equals(SO)))
  119.    return false;
  120.   return true;
  121.  }
  122. }
  123. private static final String CHP = "Champagne";
  124. private static final String SO = "Soft Drink";
  125. private static final String BI = "Binouze";
  126. private static final String BO = "Alcool";
  127. private static final List<String> NAMES = new ArrayList<String>();
  128. static {
  129.  NAMES.addAll(Arrays.asList(CHP, BI, BO, SO));
  130. }
  131. public static void main(String[] args) {
  132.  final int[] w = new int[1];
  133.  final JFrame f = new JFrame();
  134.  final JLabel lbl = new JLabel();
  135.  final M m = new M(lbl, w);
  136.  final JTextField weight = new JTextField("0" );
  137.  weight.setHorizontalAlignment(JLabel.CENTER);
  138.  weight.addActionListener(new ActionListener() {
  139.   @Override
  140.   public void actionPerformed(ActionEvent e) {
  141.    try {
  142.     w[0] = Integer.parseInt(weight.getText());
  143.     for(int i =0; i < NAMES.size();i++){
  144.      m.setValueAt(0, i, 1);
  145.     }
  146.     if (w[0] <= 65) {
  147.      m.setValueAt(1, NAMES.indexOf(BO), 1);
  148.      m.setValueAt(20, NAMES.indexOf(BO), 2);
  149.     } else {
  150.      m.setValueAt(1, NAMES.indexOf(BO), 1);
  151.      m.setValueAt(40, NAMES.indexOf(BO), 2);
  152.     }
  153.     while (!m.isOk(m.compute())) {
  154.      float computeValue = m.compute();
  155.      if (w[0] - computeValue > 25) {
  156.       if (Math.random() < 0.12) {
  157.        m.setValueAt(1 + Integer.parseInt(m
  158.          .getValueAt(NAMES.indexOf(CHP), 1)
  159.          .toString()), NAMES.indexOf(CHP), 1);
  160.       } else if (Math.random() < 0.66) {
  161.        m.setValueAt(1 + Integer.parseInt(m
  162.          .getValueAt(NAMES.indexOf(BO), 1)
  163.          .toString()), NAMES.indexOf(BO), 1);
  164.        if (w[0] > 65) {
  165.         m.setValueAt(40, NAMES.indexOf(BO), 2);
  166.        } else
  167.         m.setValueAt(20, NAMES.indexOf(BO), 2);
  168.       } else {
  169.        m.setValueAt(6 + Integer.parseInt(m
  170.          .getValueAt(NAMES.indexOf(BI), 1)
  171.          .toString()), NAMES.indexOf(BI), 1);
  172.       }
  173.      } else {
  174.       m.setValueAt(1 + Integer.parseInt(m.getValueAt(
  175.         NAMES.indexOf(SO), 1).toString()),
  176.         NAMES.indexOf(SO), 1);
  177.      }
  178.     }
  179.     m.updateResult();
  180.    } catch (Exception ex) {
  181.     ex.printStackTrace();
  182.     JOptionPane.showMessageDialog(f,
  183.       "Tocard, c'est ton poid en kg qu'il faut rentrer" );
  184.     weight.setText("75" );
  185.    }
  186.    m.fireTableDataChanged();
  187.   }
  188.  });
  189.  weight.setText("0" );
  190.  f.add(weight, BorderLayout.NORTH);
  191.  f.add(lbl, BorderLayout.SOUTH);
  192.  lbl.setHorizontalAlignment(JLabel.CENTER);
  193.  JTable t = new JTable(m);
  194.  f.add(new JScrollPane(t), BorderLayout.CENTER);
  195.  t.setBackground(Color.WHITE);
  196.  m.updateResult();
  197.  f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  198.  f.setSize(new Dimension(500, 500));
  199.  f.setVisible(true);
  200. }
  201. }


---------------
-3dB

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Loi de répartition de l'alcool à une soirée

 

Sujets relatifs
User Group C++ Francophone - Soirée Qt Mobile - 5 Juin 2013Répartition de charge sur sql_serveur
Algorithme de repartition en pourcentageRépartition
Calcul de l'inverse d'une fonction de répartition[EXCEL] Calcul complexe : répartition via colonne
Répartition de thread sur une appli monothreadée ?Répartition aléatoire sur excel
Variable pour répartition dans un tableau (module streaming TV)Loi Normale et son inverse
Plus de sujets relatifs à : Loi de répartition de l'alcool à une soirée


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR