492 lines
14 KiB
Plaintext
492 lines
14 KiB
Plaintext
|
|
{
|
||
|
|
"cells": [
|
||
|
|
{
|
||
|
|
"cell_type": "markdown",
|
||
|
|
"id": "cell-0",
|
||
|
|
"metadata": {},
|
||
|
|
"source": [
|
||
|
|
"# TP Évaluation - Système d'inventaire Minecraft\n",
|
||
|
|
"\n",
|
||
|
|
"**Durée : 1h30**\n",
|
||
|
|
"\n",
|
||
|
|
"**Nom :** \n",
|
||
|
|
"\n",
|
||
|
|
"**Prénom :**\n",
|
||
|
|
"\n",
|
||
|
|
"---\n",
|
||
|
|
"\n",
|
||
|
|
"Dans ce TP, vous allez créer un système de gestion d'inventaire et de craft inspiré de Minecraft.\n",
|
||
|
|
"\n",
|
||
|
|
"**Compétences évaluées :**\n",
|
||
|
|
"- Manipulation de dictionnaires\n",
|
||
|
|
"- Parcours et modification de structures\n",
|
||
|
|
"- Algorithmes de vérification"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "markdown",
|
||
|
|
"id": "cell-1",
|
||
|
|
"metadata": {},
|
||
|
|
"source": [
|
||
|
|
"## Données initiales\n",
|
||
|
|
"\n",
|
||
|
|
"**Exécutez cette cellule avant de commencer.**"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": null,
|
||
|
|
"id": "cell-2",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"# Inventaire du joueur : {nom_item: quantite}\n",
|
||
|
|
"inventaire = {\n",
|
||
|
|
" \"bois\": 64,\n",
|
||
|
|
" \"pierre\": 128,\n",
|
||
|
|
" \"fer\": 32,\n",
|
||
|
|
" \"or\": 8,\n",
|
||
|
|
" \"diamant\": 3,\n",
|
||
|
|
" \"charbon\": 45,\n",
|
||
|
|
" \"cuir\": 12,\n",
|
||
|
|
" \"plume\": 24,\n",
|
||
|
|
" \"ficelle\": 16\n",
|
||
|
|
"}\n",
|
||
|
|
"\n",
|
||
|
|
"# Recettes de craft : {nom_resultat: {ingredient: quantite_necessaire}}\n",
|
||
|
|
"recettes = {\n",
|
||
|
|
" \"planche\": {\"bois\": 1},\n",
|
||
|
|
" \"baton\": {\"planche\": 2},\n",
|
||
|
|
" \"torche\": {\"baton\": 1, \"charbon\": 1},\n",
|
||
|
|
" \"pioche_bois\": {\"planche\": 3, \"baton\": 2},\n",
|
||
|
|
" \"pioche_pierre\": {\"pierre\": 3, \"baton\": 2},\n",
|
||
|
|
" \"pioche_fer\": {\"fer\": 3, \"baton\": 2},\n",
|
||
|
|
" \"pioche_diamant\": {\"diamant\": 3, \"baton\": 2},\n",
|
||
|
|
" \"epee_fer\": {\"fer\": 2, \"baton\": 1},\n",
|
||
|
|
" \"epee_diamant\": {\"diamant\": 2, \"baton\": 1},\n",
|
||
|
|
" \"coffre\": {\"planche\": 8},\n",
|
||
|
|
" \"four\": {\"pierre\": 8}\n",
|
||
|
|
"}\n",
|
||
|
|
"\n",
|
||
|
|
"# Quantites produites par craft (par defaut 1, sauf exceptions)\n",
|
||
|
|
"quantites_produites = {\n",
|
||
|
|
" \"planche\": 4,\n",
|
||
|
|
" \"baton\": 4,\n",
|
||
|
|
" \"torche\": 4\n",
|
||
|
|
"}\n",
|
||
|
|
"\n",
|
||
|
|
"# Valeurs des items en emeraudes\n",
|
||
|
|
"valeurs = {\n",
|
||
|
|
" \"bois\": 1, \"pierre\": 1, \"fer\": 5, \"or\": 10, \"diamant\": 50,\n",
|
||
|
|
" \"charbon\": 2, \"cuir\": 3, \"plume\": 1, \"ficelle\": 2,\n",
|
||
|
|
" \"planche\": 1, \"baton\": 1, \"torche\": 3\n",
|
||
|
|
"}"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "markdown",
|
||
|
|
"id": "cell-3",
|
||
|
|
"metadata": {},
|
||
|
|
"source": [
|
||
|
|
"---\n",
|
||
|
|
"\n",
|
||
|
|
"## Exercice 1 - Gestion de l'inventaire (25 min)\n",
|
||
|
|
"\n",
|
||
|
|
"### 1.1 Affichage de l'inventaire (4 pts)\n",
|
||
|
|
"\n",
|
||
|
|
"Écrivez une fonction `afficher_inventaire(inv)` qui affiche l'inventaire de manière formatée.\n",
|
||
|
|
"\n",
|
||
|
|
"Exemple de sortie :\n",
|
||
|
|
"```\n",
|
||
|
|
"=== INVENTAIRE ===\n",
|
||
|
|
"bois : 64\n",
|
||
|
|
"pierre : 128\n",
|
||
|
|
"fer : 32\n",
|
||
|
|
"...\n",
|
||
|
|
"==================\n",
|
||
|
|
"```"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": null,
|
||
|
|
"id": "cell-4",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"def afficher_inventaire(inv):\n",
|
||
|
|
" print(\"=== INVENTAIRE ===\")\n",
|
||
|
|
" \n",
|
||
|
|
" for item, quantite in inv.items():\n",
|
||
|
|
" # Votre code ici\n",
|
||
|
|
" pass\n",
|
||
|
|
" \n",
|
||
|
|
" print(\"==================\")\n",
|
||
|
|
"\n",
|
||
|
|
"# Test\n",
|
||
|
|
"afficher_inventaire(inventaire)"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "markdown",
|
||
|
|
"id": "cell-5",
|
||
|
|
"metadata": {},
|
||
|
|
"source": [
|
||
|
|
"### 1.2 Ajouter un item (4 pts)\n",
|
||
|
|
"\n",
|
||
|
|
"Écrivez une fonction `ajouter_item(inv, item, quantite)` qui ajoute la quantité à l'item.\n",
|
||
|
|
"\n",
|
||
|
|
"Si l'item n'existe pas dans l'inventaire, il doit être créé.\n",
|
||
|
|
"\n",
|
||
|
|
"*Aide : utilisez `inv.get(item, 0)` pour obtenir la quantité actuelle (0 si l'item n'existe pas)*"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": null,
|
||
|
|
"id": "cell-6",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"def ajouter_item(inv, item, quantite):\n",
|
||
|
|
" # Votre code ici\n",
|
||
|
|
" pass\n",
|
||
|
|
"\n",
|
||
|
|
"# Tests\n",
|
||
|
|
"test_inv = {\"bois\": 10}\n",
|
||
|
|
"ajouter_item(test_inv, \"bois\", 5)\n",
|
||
|
|
"print(\"Apres ajout de 5 bois :\", test_inv)\n",
|
||
|
|
"ajouter_item(test_inv, \"fer\", 3)\n",
|
||
|
|
"print(\"Apres ajout de 3 fer :\", test_inv)"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "markdown",
|
||
|
|
"id": "cell-7",
|
||
|
|
"metadata": {},
|
||
|
|
"source": [
|
||
|
|
"### 1.3 Retirer un item (4 pts)\n",
|
||
|
|
"\n",
|
||
|
|
"Écrivez une fonction `retirer_item(inv, item, quantite)` qui retire la quantité de l'item.\n",
|
||
|
|
"\n",
|
||
|
|
"- Renvoie `True` si le retrait a réussi\n",
|
||
|
|
"- Renvoie `False` si la quantité est insuffisante (et ne modifie pas l'inventaire)"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": null,
|
||
|
|
"id": "cell-8",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"def retirer_item(inv, item, quantite):\n",
|
||
|
|
" # Verifier si l'item existe et en quantite suffisante\n",
|
||
|
|
" quantite_actuelle = inv.get(item, 0)\n",
|
||
|
|
" \n",
|
||
|
|
" if quantite_actuelle < quantite:\n",
|
||
|
|
" return False\n",
|
||
|
|
" \n",
|
||
|
|
" # Retirer la quantite\n",
|
||
|
|
" # Votre code ici\n",
|
||
|
|
" pass\n",
|
||
|
|
"\n",
|
||
|
|
"# Tests\n",
|
||
|
|
"test_inv = {\"bois\": 10, \"pierre\": 5}\n",
|
||
|
|
"print(\"Retirer 5 bois :\", retirer_item(test_inv, \"bois\", 5))\n",
|
||
|
|
"print(\"Inventaire :\", test_inv)\n",
|
||
|
|
"print(\"Retirer 100 bois :\", retirer_item(test_inv, \"bois\", 100))\n",
|
||
|
|
"print(\"Inventaire :\", test_inv)"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "markdown",
|
||
|
|
"id": "cell-9",
|
||
|
|
"metadata": {},
|
||
|
|
"source": [
|
||
|
|
"### 1.4 Valeur de l'inventaire (4 pts)\n",
|
||
|
|
"\n",
|
||
|
|
"Écrivez une fonction `calculer_valeur(inv, valeurs)` qui renvoie la valeur totale de l'inventaire.\n",
|
||
|
|
"\n",
|
||
|
|
"*Note : si un item n'a pas de valeur définie, il vaut 0*"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": null,
|
||
|
|
"id": "cell-10",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"def calculer_valeur(inv, valeurs):\n",
|
||
|
|
" total = 0\n",
|
||
|
|
" \n",
|
||
|
|
" for item, quantite in inv.items():\n",
|
||
|
|
" # Recuperer la valeur de l'item (0 si pas definie)\n",
|
||
|
|
" valeur_unitaire = valeurs.get(item, 0)\n",
|
||
|
|
" # Votre code ici\n",
|
||
|
|
" pass\n",
|
||
|
|
" \n",
|
||
|
|
" return total\n",
|
||
|
|
"\n",
|
||
|
|
"# Test\n",
|
||
|
|
"print(\"Valeur totale :\", calculer_valeur(inventaire, valeurs), \"emeraudes\")"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "markdown",
|
||
|
|
"id": "cell-11",
|
||
|
|
"metadata": {},
|
||
|
|
"source": [
|
||
|
|
"---\n",
|
||
|
|
"\n",
|
||
|
|
"## Exercice 2 - Système de craft (35 min)\n",
|
||
|
|
"\n",
|
||
|
|
"### 2.1 Vérifier si un craft est possible (5 pts)\n",
|
||
|
|
"\n",
|
||
|
|
"Écrivez une fonction `peut_crafter(inv, recette)` qui renvoie `True` si l'inventaire contient tous les ingrédients nécessaires pour la recette, `False` sinon.\n",
|
||
|
|
"\n",
|
||
|
|
"*Note : `recette` est un dictionnaire `{ingredient: quantite_necessaire}`*"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": null,
|
||
|
|
"id": "cell-12",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"def peut_crafter(inv, recette):\n",
|
||
|
|
" for ingredient, quantite_necessaire in recette.items():\n",
|
||
|
|
" quantite_disponible = inv.get(ingredient, 0)\n",
|
||
|
|
" \n",
|
||
|
|
" # Verifier si on a assez\n",
|
||
|
|
" # Votre code ici\n",
|
||
|
|
" pass\n",
|
||
|
|
" \n",
|
||
|
|
" return True\n",
|
||
|
|
"\n",
|
||
|
|
"# Tests\n",
|
||
|
|
"print(\"Peut crafter planche ?\", peut_crafter(inventaire, recettes[\"planche\"]))\n",
|
||
|
|
"print(\"Peut crafter pioche_diamant ?\", peut_crafter(inventaire, recettes[\"pioche_diamant\"]))"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "markdown",
|
||
|
|
"id": "cell-13",
|
||
|
|
"metadata": {},
|
||
|
|
"source": [
|
||
|
|
"### 2.2 Effectuer un craft (6 pts)\n",
|
||
|
|
"\n",
|
||
|
|
"Écrivez une fonction `crafter(inv, nom_item, recettes, quantites_produites)` qui :\n",
|
||
|
|
"1. Vérifie si le craft est possible\n",
|
||
|
|
"2. Si oui, retire les ingrédients et ajoute le résultat\n",
|
||
|
|
"3. Renvoie `True` si le craft a réussi, `False` sinon\n",
|
||
|
|
"\n",
|
||
|
|
"*Note : utilisez `quantites_produites.get(nom_item, 1)` pour obtenir la quantité produite (1 par défaut)*"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": null,
|
||
|
|
"id": "cell-14",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"def crafter(inv, nom_item, recettes, quantites_produites):\n",
|
||
|
|
" # Verifier que la recette existe\n",
|
||
|
|
" if nom_item not in recettes:\n",
|
||
|
|
" print(\"Recette inconnue :\", nom_item)\n",
|
||
|
|
" return False\n",
|
||
|
|
" \n",
|
||
|
|
" recette = recettes[nom_item]\n",
|
||
|
|
" \n",
|
||
|
|
" # Verifier si le craft est possible\n",
|
||
|
|
" if not peut_crafter(inv, recette):\n",
|
||
|
|
" print(\"Ingredients insuffisants pour\", nom_item)\n",
|
||
|
|
" return False\n",
|
||
|
|
" \n",
|
||
|
|
" # Retirer les ingredients\n",
|
||
|
|
" for ingredient, quantite in recette.items():\n",
|
||
|
|
" retirer_item(inv, ingredient, quantite)\n",
|
||
|
|
" \n",
|
||
|
|
" # Ajouter le resultat\n",
|
||
|
|
" quantite_produite = quantites_produites.get(nom_item, 1)\n",
|
||
|
|
" # Votre code ici\n",
|
||
|
|
" pass\n",
|
||
|
|
"\n",
|
||
|
|
"# Test\n",
|
||
|
|
"test_inv = {\"bois\": 10, \"charbon\": 5}\n",
|
||
|
|
"print(\"Inventaire avant :\", test_inv)\n",
|
||
|
|
"\n",
|
||
|
|
"crafter(test_inv, \"planche\", recettes, quantites_produites)\n",
|
||
|
|
"print(\"Apres craft de planches :\", test_inv)\n",
|
||
|
|
"\n",
|
||
|
|
"crafter(test_inv, \"baton\", recettes, quantites_produites)\n",
|
||
|
|
"print(\"Apres craft de batons :\", test_inv)\n",
|
||
|
|
"\n",
|
||
|
|
"crafter(test_inv, \"torche\", recettes, quantites_produites)\n",
|
||
|
|
"print(\"Apres craft de torches :\", test_inv)"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "markdown",
|
||
|
|
"id": "cell-15",
|
||
|
|
"metadata": {},
|
||
|
|
"source": [
|
||
|
|
"### 2.3 Lister les crafts possibles (6 pts)\n",
|
||
|
|
"\n",
|
||
|
|
"Écrivez une fonction `lister_crafts_possibles(inv, recettes)` qui renvoie la **liste des noms** de tous les items qu'il est possible de crafter avec l'inventaire actuel."
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": null,
|
||
|
|
"id": "cell-16",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"def lister_crafts_possibles(inv, recettes):\n",
|
||
|
|
" possibles = []\n",
|
||
|
|
" \n",
|
||
|
|
" for nom_item, recette in recettes.items():\n",
|
||
|
|
" # Votre code ici\n",
|
||
|
|
" pass\n",
|
||
|
|
" \n",
|
||
|
|
" return possibles\n",
|
||
|
|
"\n",
|
||
|
|
"# Test\n",
|
||
|
|
"print(\"Crafts possibles :\")\n",
|
||
|
|
"print(lister_crafts_possibles(inventaire, recettes))"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "markdown",
|
||
|
|
"id": "cell-17",
|
||
|
|
"metadata": {},
|
||
|
|
"source": [
|
||
|
|
"---\n",
|
||
|
|
"\n",
|
||
|
|
"## Exercice 3 - Bonus (20 min)\n",
|
||
|
|
"\n",
|
||
|
|
"### 3.1 Nombre maximum de crafts (5 pts)\n",
|
||
|
|
"\n",
|
||
|
|
"Écrivez une fonction `nb_max_craft(inv, recette)` qui renvoie le nombre maximum de fois qu'on peut effectuer un craft avec l'inventaire actuel.\n",
|
||
|
|
"\n",
|
||
|
|
"*Aide : pour chaque ingrédient, calculez `quantite_disponible // quantite_necessaire`, puis prenez le minimum*"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": null,
|
||
|
|
"id": "cell-18",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"def nb_max_craft(inv, recette):\n",
|
||
|
|
" if not peut_crafter(inv, recette):\n",
|
||
|
|
" return 0\n",
|
||
|
|
" \n",
|
||
|
|
" ratios = []\n",
|
||
|
|
" \n",
|
||
|
|
" for ingredient, quantite_necessaire in recette.items():\n",
|
||
|
|
" quantite_disponible = inv.get(ingredient, 0)\n",
|
||
|
|
" # Calculer combien de crafts possibles avec cet ingredient\n",
|
||
|
|
" # Votre code ici\n",
|
||
|
|
" pass\n",
|
||
|
|
" \n",
|
||
|
|
" return min(ratios)\n",
|
||
|
|
"\n",
|
||
|
|
"# Tests\n",
|
||
|
|
"print(\"Nb max de planches :\", nb_max_craft(inventaire, recettes[\"planche\"]))\n",
|
||
|
|
"print(\"Nb max de torches :\", nb_max_craft(inventaire, recettes[\"torche\"]))\n",
|
||
|
|
"print(\"Nb max de pioche_diamant :\", nb_max_craft(inventaire, recettes[\"pioche_diamant\"]))"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "markdown",
|
||
|
|
"id": "cell-19",
|
||
|
|
"metadata": {},
|
||
|
|
"source": [
|
||
|
|
"### 3.2 Crafts avec compteur (5 pts)\n",
|
||
|
|
"\n",
|
||
|
|
"Écrivez une fonction `crafts_avec_compteur(inv, recettes)` qui renvoie un **dictionnaire** `{nom_item: nombre_max}` pour tous les items qu'on peut crafter au moins une fois."
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": null,
|
||
|
|
"id": "cell-20",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"def crafts_avec_compteur(inv, recettes):\n",
|
||
|
|
" resultat = {}\n",
|
||
|
|
" \n",
|
||
|
|
" for nom_item, recette in recettes.items():\n",
|
||
|
|
" nb = nb_max_craft(inv, recette)\n",
|
||
|
|
" # Ajouter au resultat si nb > 0\n",
|
||
|
|
" # Votre code ici\n",
|
||
|
|
" pass\n",
|
||
|
|
" \n",
|
||
|
|
" return resultat\n",
|
||
|
|
"\n",
|
||
|
|
"# Test\n",
|
||
|
|
"print(\"Crafts disponibles :\")\n",
|
||
|
|
"for item, nb in crafts_avec_compteur(inventaire, recettes).items():\n",
|
||
|
|
" print(\" \", item, \":\", nb, \"x\")"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "markdown",
|
||
|
|
"id": "cell-21",
|
||
|
|
"metadata": {},
|
||
|
|
"source": [
|
||
|
|
"### 3.3 Item le plus rentable (4 pts)\n",
|
||
|
|
"\n",
|
||
|
|
"Écrivez une fonction `item_plus_rentable(inv, recettes, valeurs)` qui renvoie le nom de l'item craftable qui a la meilleure valeur de revente parmi ceux qu'on peut crafter."
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": null,
|
||
|
|
"id": "cell-22",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"def item_plus_rentable(inv, recettes, valeurs):\n",
|
||
|
|
" possibles = lister_crafts_possibles(inv, recettes)\n",
|
||
|
|
" \n",
|
||
|
|
" if len(possibles) == 0:\n",
|
||
|
|
" return None\n",
|
||
|
|
" \n",
|
||
|
|
" meilleur = possibles[0]\n",
|
||
|
|
" meilleure_valeur = valeurs.get(meilleur, 0)\n",
|
||
|
|
" \n",
|
||
|
|
" for item in possibles:\n",
|
||
|
|
" valeur = valeurs.get(item, 0)\n",
|
||
|
|
" # Votre code ici\n",
|
||
|
|
" pass\n",
|
||
|
|
" \n",
|
||
|
|
" return meilleur\n",
|
||
|
|
"\n",
|
||
|
|
"# Test\n",
|
||
|
|
"print(\"Item le plus rentable a crafter :\", item_plus_rentable(inventaire, recettes, valeurs))"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"metadata": {
|
||
|
|
"kernelspec": {
|
||
|
|
"display_name": "Python 3",
|
||
|
|
"language": "python",
|
||
|
|
"name": "python3"
|
||
|
|
},
|
||
|
|
"language_info": {
|
||
|
|
"name": "python",
|
||
|
|
"version": "3.9.0"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"nbformat": 4,
|
||
|
|
"nbformat_minor": 5
|
||
|
|
}
|