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

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

Marsh Posté le 11-07-2013 à 16:31:49    

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
Reply

Marsh Posté le 11-07-2013 à 16:31:49   

Reply

Marsh Posté le 15-07-2013 à 11:38:32    

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]

Reply

Marsh Posté le 15-07-2013 à 11:41:53    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed