{"cells": [{"cell_type": "markdown", "metadata": {}, "source": ["# 1A - Enonc\u00e9 15 novembre 2021 - rattrapage\n", "\n", "Correction de l'examen du 15 novembre 2021."]}, {"cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [{"data": {"text/html": ["
run previous cell, wait for 2 seconds
\n", ""], "text/plain": [""]}, "execution_count": 2, "metadata": {}, "output_type": "execute_result"}], "source": ["from jyquickhelper import add_notebook_menu\n", "add_notebook_menu()"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Exercice 1 : optimisation de volume\n", "\n", "On cherche \u00e0 expliquer la forme des briques de lait. On rappelle quelques formules :\n", "\n", "* aire d'une surface : S = longueur x largeur\n", "* volume d'une brique : V = longueur x largeur x hauteur"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Q1 : \u00e9crire une fonction qui calcule l'aire d'une surface"]}, {"cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [{"data": {"text/plain": ["12"]}, "execution_count": 3, "metadata": {}, "output_type": "execute_result"}], "source": ["def surface(longueur, largeur):\n", " return longueur * largeur\n", "\n", "surface(3, 4)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Q2 : \u00e9crire une fonction qui calcule le volume d'une brique"]}, {"cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [{"data": {"text/plain": ["(3, 4, 5)"]}, "execution_count": 4, "metadata": {}, "output_type": "execute_result"}], "source": ["def volume(longueur, largeur, hauteur):\n", " return longueur, largeur, hauteur\n", "\n", "volume(3, 4, 5)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["On veut conna\u00eetre les dimensions de la brique id\u00e9ale d'un litre : son volume est 1 et sa surface (la somme des surfaces de toutes les faces) est minimale. Ceci afin de minimiser l'utilisation de mati\u00e8res premi\u00e8res."]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Q3 : \u00e9crire une fonction qui retourne la somme des surfaces des faces d'une brique"]}, {"cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [{"data": {"text/plain": ["94"]}, "execution_count": 5, "metadata": {}, "output_type": "execute_result"}], "source": ["def surface_brique(longueur, largeur, hauteur):\n", " return (surface(longueur, largeur) + \n", " surface(largeur, hauteur) + \n", " surface(hauteur, longueur)) * 2\n", "\n", "surface_brique(3, 4, 5)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Q4 : la brique optimale\n", "\n", "On consid\u00e8re l'ensemble `[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1., 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.]`. On fait varier plusieurs dimensions dans cet ensemble, on ne garde que celle dont le volume est 1 et la surface minimale. Quelles sont les dimensions optimales ?"]}, {"cell_type": "code", "execution_count": 5, "metadata": {"scrolled": false}, "outputs": [{"data": {"text/plain": ["(6.0, (1.0, 1.0, 1.0))"]}, "execution_count": 6, "metadata": {}, "output_type": "execute_result"}], "source": ["import numpy\n", "\n", "def brique_optimale(ensemble):\n", " meilleur = None\n", " \n", " for longueur in ensemble:\n", " for largeur in ensemble:\n", " hauteur = 1 / (longueur * largeur)\n", " surf = surface_brique(longueur, largeur, hauteur)\n", " if meilleur is None or surf < meilleur:\n", " meilleur = surf\n", " solution = longueur, largeur, hauteur\n", " return meilleur, solution\n", "\n", "\n", "ensemble = (numpy.arange(20) + 1) / 10\n", "brique_optimale(ensemble)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Q5 : on inclut la surface n\u00e9cessaire pour coller les extremit\u00e9s\n", "\n", "Pour fermer une brique, il faut pouvoir coller les faces entre elles. La surface additionnelle est \u00e9gale \u00e0 une fois la plus petite des faces + la surface d'un carr\u00e9 de c\u00f4t\u00e9 la plus petite dimension. Modifier la fonction pr\u00e9c\u00e9dente pour en tenir compte."]}, {"cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [{"data": {"text/plain": ["(7.4471428571428575, (1.0, 0.7, 1.4285714285714286))"]}, "execution_count": 7, "metadata": {}, "output_type": "execute_result"}], "source": ["def brique_optimale_surplus(ensemble):\n", " meilleur = None\n", " \n", " for longueur in ensemble:\n", " for largeur in ensemble:\n", " hauteur = 1 / (longueur * largeur)\n", " surf = (surface_brique(longueur, largeur, hauteur) + \n", " surface(longueur, largeur) + largeur ** 2)\n", " if meilleur is None or surf < meilleur:\n", " meilleur = surf\n", " solution = longueur, largeur, hauteur\n", " return meilleur, solution\n", "\n", "\n", "ensemble = (numpy.arange(20) + 1) / 10\n", "brique_optimale_surplus(ensemble)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Dans cette \u00e9criture, le programme suppose implicitement que `largeur` est le plus petit c\u00f4t\u00e9. Ce n'est pas toujours le cas. Quand ce n'est pas le cas, on peut v\u00e9rifier en permutant `longueur` et `largeur`, la surface est plus grande. L'optimisation ne choisira pas cette solution. Si ce n'\u00e9tait pas le cas, il suffirait d'exclure tous les cas o\u00f9 `largeur > longueur`."]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Q6 : une bouteille de deux litres deux fois plus large\n", "\n", "Le producteur souhaite \u00e9couler la moiti\u00e9 de sa marchandise avec des bouteilles de lait de deux litres, aussi hautes et longues mais deux fois plus large pour pouvoir les stocker facilement. La surface de cette bouteille est celle-ci :\n", "\n", "`surface_brique2(longueur, largeur, hauteur) = surface_brique(longueur, largeur, hauteur) - 2 * surface(largeur, hauteur)`.\n", "\n", "Quelles sont les dimensions optimales ?"]}, {"cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [{"data": {"text/plain": ["(6.6938095238095245, (0.8, 0.7, 1.7857142857142858))"]}, "execution_count": 8, "metadata": {}, "output_type": "execute_result"}], "source": ["def brique_optimale_surplus_deux_litres(ensemble):\n", " meilleur = None\n", " \n", " for longueur in ensemble:\n", " for largeur in ensemble:\n", " if largeur > longueur:\n", " continue\n", " hauteur = 1 / (longueur * largeur)\n", " surf1 = (surface_brique(longueur, largeur, hauteur) + \n", " surface(longueur, largeur) + largeur ** 2)\n", " surf2 = surf1 - surface(largeur, hauteur) * 2\n", " surf = surf1 * 2 / 3 + surf2 / 3 # donc autant de litres de lait dans chacun des contenants\n", " if meilleur is None or surf < meilleur:\n", " meilleur = surf\n", " solution = longueur, largeur, hauteur\n", " return meilleur, solution\n", "\n", "\n", "ensemble = (numpy.arange(20) + 1) / 10\n", "brique_optimale_surplus_deux_litres(ensemble)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Q7 : petite brique en bleue, grosse brique en rouge\n", "\n", "Le producteur se sert d'une rang\u00e9e de longueur de 10 briques de 1 litre dans laquelle il ins\u00e8re des briques de deux litres pour envoyer des messages cod\u00e9s (en binaire).\n", "\n", "Example de message : `A A B B A B B A B B` A = une bouteille de 1 litre, B = moiti\u00e9 d'une bouteille de deux litres.\n", "\n", "Combien y a-t-il de possibilit\u00e9s dans une rang\u00e9e d'une longueur de 10 briques de 1 litre."]}, {"cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [{"data": {"text/plain": ["[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]"]}, "execution_count": 9, "metadata": {}, "output_type": "execute_result"}], "source": ["def messages(n):\n", " possibilites = [1 for i in range(n + 1)]\n", " for i in range(2, n + 1):\n", " possibilites[i] = possibilites[i-1] + possibilites[i-2]\n", " return possibilites\n", "\n", "messages(10)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["C'est un probl\u00e8me assez classique, le nombre de possibilit\u00e9s pour n=10 est \u00e9gale au nombre de possibilit\u00e9s pour n=8 et une bouteille de 2 litres + le nombre de possibilit\u00e9s pour n=9 et une bouteille de 1 litre."]}, {"cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": []}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.5"}}, "nbformat": 4, "nbformat_minor": 2}