exercice Algo NSI en python : consigne pas claire.

exercice Algo NSI en python : consigne pas claire. - Python - Programmation

Marsh Posté le 23-04-2024 à 10:25:01    

Bonjour à tous,
 
mon fils a un exo à faire en python, il n' a pas de consigne claire (aucun doc n'a été fourni par le prof). Évidemment l'ent ne fonctionne plus (plus de messagerie suite aux evenements récents, donc impossible de demander quoi que ce soit au prof)
 
On part d'un tableau n x n rempli aléatoirement de nombres. (ça c'est programmé)
Ensuite on garde la case (0,0) et on prend une des cases adjacentes (au hasard ?)
Si cette case contient par exemple un 2, alors la case précédente passe à 2 et ces cases ne peuvent plus être choisies.
Ensuite on sélectionne (au hasard ?) une case adjacente à une de ces deux cases, puis on change les nombres pour la valeur contenue dans cette case.
Et ainsi de suite, jusqu'à ce que le tableau soit rempli avec les mêmes chiffres (soit disant jeu des couleurs)
 
Bref, voici un schéma sur un exemple.
 
Si j'ai bien compris ce qu'il faut faire : DEMERDEN SIE SICH, programmez ce truc en python !!!!
 
Voici l'exemple, puis ce que mon fils et sa binome ont commencé et les commentaires du prof.
Je suis moi même prof, et franchement ce type est un gros boulet : pas de cours, ou alors il pompe des cours de fac tout prêt mais pas adapté aux niveaux des élèves...
 
https://ibb.co/f42gJ4B
https://ibb.co/yhHhHVV
 
Merci pour votre aide.


Message édité par davidmarli le 23-04-2024 à 10:47:13

---------------
Matheux Fou - https://afficheur-tempo.fr - TEMPO BOX pour abonnés TEMPO EDF
Reply

Marsh Posté le 23-04-2024 à 10:25:01   

Reply

Marsh Posté le 23-04-2024 à 17:53:38    

Euh clairement pas niveau lycée ce truc...
On ne comprend pas grand chose sur la première photo mais la 2eme semble plus clair.
 
A priori je dirais que le choix de la case (nombre) suivant ne se fait pas au hasard mais en essayant de maximiser la nouvelle surface.
De 1 à 2 : pas le choix, obligé de prendre 2 (+2 cases)
De 2 à 3 : choix entre 1 (+ 4 cases) et 3 (1 seule)
De 3 à 4 : choix entre 2 ou 3 (+3 cases) et 4 (+4 cases)
De 4 à 5 : choix entre 2 (+4 cases) et 3 (+5 cases)
 
C'est systématiquement le plus gros choix qui est pris (mais j'imagine qu'en cas d'égalité on peut faire du random).
 
Après ce qui est dur (enfin je ne connais pas le niveau de ton fils mais ça me parait chaud pour un lycéen ayant eu peu de cours de code/algorithmie), c'est le path finding des cases non continu avec le bloc dont on part, quand on compte pour trouver le meilleur chemin il faut ajouter les cases de chiffre identique (les 1 en bas dans l'étape 2 à 3).
 
Je ne connais pas trop Python mais à la place de ton fils je me servirais d'un clone de tableau (pour marquer les cellules "traité" que ce soit déjà "colorié" avec le chiffre actuel + et celle déjà compté -) et je ferais une boucle de ce genre:

Code :
  1. chiffre actuel = 0
  2. tableau de chiffre candidat pour le prochain remplacement = []
  3. clonage du tableau "probleme à résoudre" et passage de la cellule (0,0) à +
  4. boucle tant qu'il reste des cellules du tableau clone différent de +
  5.   vidage du tableau de candidat
  6.   boucle de parcours des cellules +
  7.     vérification des cases adjacente
  8.       on ignore les cases + et -
  9.       on enumere les candidats en les indexant par chiffre et on regarde pour chaque si lui même à un voisin de même chiffre (si oui on le compte et on recommence)
  10.       a chaque fois qu'on compte une case on la flag avec un - pour ne pas la recompter plusieurs fois.
  11.   fin de boucle de parcours des cellules +
  12.   on choisit le chiffre permettant la plus grande extension
  13.   application de toute les cellules clone dont la valeur est + sur le tableau principal avec le chiffre choisi
  14.   passage de toute les cellules - à une autre valeur pour qu'elle puisse être de nouveau inspecter
  15. fin de la boucle principal


C'est loin d'être optimisé car le mieux serait de ne gérer que les cases de contour mais pour du niveau lycée, je crois qu'on vas se contenter de faire fonctionnel. :o  
 
Attention aussi à suivre tout les chemins et bifurcation possible, je ne crois pas avoir vu d'exemple piégeux sur ta 2eme photo mais si la liste est vraiment random il faudra être capable de compter correctement tout les 1 dans un cas comme celui la:

Code :
  1. *2345
  2. 16789
  3. 11234
  4. 16789


 
En espérant que ça puisse aider ! :hello:


---------------
D3
Reply

Marsh Posté le 23-04-2024 à 17:59:29    

En fait mon truc fait de la résolution automatique alors qu’apparemment (photo 1), il y'aurai un joueur donc je supposes qu'il s'agit plus de réagir à des inputs...
 
Du coup il s'agit plus d'attendre que l'utilisateur choisisse une case (clic ou input clavier ?), qu'on vérifie si le choix est possible et qu'on remplace les cases contigu par le chiffre choisi.
Une partie de mon pseudo code reste valide... :o


---------------
D3
Reply

Marsh Posté le 23-04-2024 à 18:34:48    

alors justement apparemment le prof leur a dit que e jeu se fait tout seul....
 
Seul le tableau de départ est généré aléatoirement...
 
Franchement je ne sais pas quoi en penser...
 
De toutes les façons, si les gamins posent des questions là seule réponse di prof :  "si tu comprends pas, c est que tu n'as rien à faire ds mon cours".
Donc plus personne ne pose de questions..  zt comme on ne peut plus envoyer de messages au prof....
 
Bref, étant moi même ds le métier, c est le genre de collègue à qui je casserai bien la gueule, mais la justice ne l accepte pas :o  
 
Bo. je vais regarder to  pseudo algo, mais pas sur dz tout bien comprendre, et surtout je ne maîtrise pas python, donc compliqué.  
 
PS : mon gami. n a toujours pas  ompris comment manipuler des cellules ds un tableau python, alors...


Message édité par davidmarli le 23-04-2024 à 19:15:29

---------------
Matheux Fou - https://afficheur-tempo.fr - TEMPO BOX pour abonnés TEMPO EDF
Reply

Marsh Posté le 24-04-2024 à 08:12:07    

Y'a enormement de ressource pour Python sur Internet, n'hésite pas à chercher dans Google, par exemple pour les tableaux : https://www.guru99.com/fr/python-2d-array.html
Si ton gamin préfère des vidéos, ça doit se trouver aussi.
 
Tu as aussi des "cours complet" genre https://openclassrooms.com/fr/cours [...] mme-python
 
Enfin n’hésite pas a utiliser un fiddle pour tester le code et le partager ici.
http://pythonfiddle.com/
https://python-fiddle.com/
https://www.mycompiler.io/
 
On devrait pouvoir vous aider, après la politique du forum c'est d'aider, pas de "faire à la place de", surtout des exercices "scolaire".
 
Bon courage à vous 2 !


---------------
D3
Reply

Marsh Posté le 24-04-2024 à 19:19:17    

Bonjour,
bon finalement, on peut "jouer" plutôt que de faire jouer l'ordinateur.
 
On a pondu ça : ça focntionne.
 
Il y a certainement moyen d'optimiser.
 

Code :
  1. import random
  2. def init_tab(nbcase):
  3.     tab=[]
  4.     for i in range(nbcase):
  5.         tab.append([0] * nbcase)
  6.     for i in range(nbcase):
  7.         for j in range(nbcase):
  8.             tab[i][j]=random.randint(1,nbcase) 
  9.     return tab 
  10.  
  11. def init_tab_temp(nbcase):
  12.     tab=[]
  13.     for i in range(nbcase):
  14.         tab.append([0] * nbcase)
  15.     tab[0][0]=-1
  16.     return tab 
  17.    
  18. def affiche_tab(tab,t_temp,nbcase):
  19.     for i in range(nbcase):
  20.         for j in range(nbcase):
  21.             if t_temp[i][j]==-1:print('\033[1;34m',tab[i][j], end='')
  22.             else:print('\033[1;30m',tab[i][j], end='')
  23.         print('')   
  24. def nb_possible(t1,t_temp,nb_next,nbcase):
  25.     rep=False
  26.     for i in range(nbcase):
  27.         for j in range(nbcase):
  28.  
  29.             if t_temp[i][j]==-1:
  30.                 if i>0:
  31.                     if t1[i-1][j]==nb_next:rep=True
  32.                 if i<nbcase-1:
  33.                     if t1[i+1][j]==nb_next:rep=True
  34.                 if j>0:
  35.                     if t1[i][j-1]==nb_next:rep=True
  36.                 if j<nbcase-1:
  37.                     if t1[i][j+1]==nb_next:rep=True   
  38.     return rep   
  39. #on parcourt le tableau : pour chaque case -1 on regarde celle à côté et on regarde si elle contient un nb_next ou un -1
  40. # si c'esdt le cas on la marque sinon on passe à la suivante.
  41. def change_case_adj(t1,t_temp,nb_next,nbcase):
  42.     t2=t_temp
  43.     for i in range(nbcase):
  44.      
  45.         for j in range(nbcase):
  46.          
  47.             if t_temp[i][j]==-1:
  48.                 if i>0:
  49.                     if t1[i-1][j]==nb_next: t2[i-1][j]=-1 #case au dessus
  50.                    
  51.                 if i<nbcase-1:
  52.                     if t1[i+1][j]==nb_next: t2[i+1][j]=-1 #case en dessous
  53.                      
  54.                 if j>0:
  55.                     if t1[i][j-1]==nb_next: t2[i][j-1]=-1 #case à gauche
  56.                    
  57.                 if j<nbcase-1:
  58.                     if t1[i][j+1]==nb_next: t2[i][j+1]=-1 #case à droite
  59.             t_temp=t2
  60.      
  61.     for i in range(nbcase):
  62.         for j in range(nbcase):
  63.             if t2[i][j]==-1:t1[i][j]=nb_next
  64.     return (t1,t_temp)   
  65. def verif_fini(t1,nb_next):
  66.     rep=True
  67.     for i in range(len(t1)):
  68.         for j in range(len(t1)):
  69.             if t1[i][j]!=nb_next:rep=False
  70.     return rep
  71. ''' Prog Principal '''
  72. #on demande à l utilisateur la taille du tableau
  73. print("\033[1;30m" )
  74. n=int(input('Quelle taille pour le tableau ?'))
  75. #on initialise le tableau
  76. # random sur les cellules
  77. t1=init_tab(n)
  78. print('')
  79. t_temp=init_tab_temp(n)
  80. affiche_tab(t1,t_temp,n)
  81. #tableau temporaire pour marquer les cases figées
  82. # on joue tant que le tableau n'a pas toutes les cases identiques
  83. fini=False
  84. compteur=1
  85. while fini==False:
  86.     print('')
  87.     print('Essai n° : ',str(compteur))
  88.     print('')
  89.    
  90.     #on demande à l'utilisateur que lnombre il choisit
  91.     nb_next=int(input('Quel nombre choisissez-vous ?'))
  92.     print('')
  93.    
  94.     #on regarde si ce nombre est possible
  95.     if nb_possible(t1,t_temp,nb_next,n)==True:
  96.         change_case_adj(t1,t_temp,nb_next,n)
  97.         print('')
  98.         affiche_tab(t1,t_temp,n)
  99.         fini=verif_fini(t1,nb_next)
  100.     else:
  101.         print('Ce choix n est pas possible !')
  102.     compteur=compteur+1
  103. # le jeu est fini
  104. if fini==True:
  105.     print('')
  106.     print('Bravo')
  107.     print('Vous avez réussi en ',str(compteur),' essais')
  108.     affiche_tab(t1,t_temp,n)


---------------
Matheux Fou - https://afficheur-tempo.fr - TEMPO BOX pour abonnés TEMPO EDF
Reply

Sujets relatifs:

Leave a Replay

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