Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Chercher un algorithme | |
| | Auteur | Message |
---|
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Chercher un algorithme Jeu 4 Juil 2013 - 20:32 | |
| Comme j’aime joindre l’ inutile à l’agréable, je vous propose un programme inutile qui ne sert à rien, sauf ... Ah, non : tous mes programmes servent à quelque chose : même à RIEN !, si on peut qualifier « il ne sert à rien », le fait de trouver un algorithme élégant à un problème non moins élégant ! Pour les débutants en programmation (comme moi-même), mais aussi pour les programmeurs confirmés (comme vous l'êtes) : Comment trouver un algorithme pour résoudre le problème suivant ? Voici le problème : Il s'agit de remplir un tableau avec les entiers consécutifs, en partant de la case en haut à gauche occupée par 1, et en tournant dans le sens de l'horloge, tout en longeant les bords déjà occupés, et en finissant au centre du tableau (pas nécessairement le centre géométrique) sur la dernière case vide. Le problème peut être décrit autrement : Soit un tableau A de N lignes et P colonnes et X=1 placé dans la première case. On remplit alors, tant qu'elles sont vides, les cases de la première ligne (de gauche à droite), de la dernière colonne (de haut en bas), de la dernière ligne (de droite à gauche), et enfin de la première colonne (de bas en haut), avec X incrémenté à chaque fois. Puis on recommence avec le sous-tableau de N-2 lignes et P-2 colonnes encore libre et le X suivant la dernière valeur qui a été placée. Remarque :L'idée suivant laquelle on peut chercher une formulation du terme d'indice i et j dans A, constitue un autre algorithme qui, non seulement, risque d'être assez laborieux à analyser, mais encore n'apporterait pas d'amélioration au programme : il y aura toujours N*P "affectations". Il est beaucoup plus élégant de construire quatre tâches se succédant: Ligne_haute() ; Colonne_Gauche(); Ligne_Basse(); Colonne_Droite()Qui dit mieux ? - Spoiler:
- Code:
-
***************************************************************************** ' Escargot.bas par Papydall ' -------------------------- ' Il s'agit de remplir un tableau avec les entiers consécutifs, en partant de la ' case en haut à gauche occupée par 1, et en tournant dans le sens de l'horloge, ' tout en longeant les bords déjà occupés, et en finissant au centre du tableau ' sur la dernière case vide. ' QUESTION : Comment trouver un algorithme pour resoudre ce problème ? ' ------------------------------------------------------------------------------ ' Le problème peut être décrit autrement : ' Soit un tableau A de N lignes et P colonnes et X=1 placé dans la première case. ' On remplit alors, tant qu'elles sont vides, les cases de la première ligne (de gauche à droite), ' de la dernière colonne (de haut en bas), de la dernière ligne (de droite à gauche), et enfin de ' la première colonne (de bas en haut), avec X incrémenté à chaque fois. ' Puis on recommence avec le sous-tableau de N-2 lignes et P-2 colonnes encore ' libre et le X suivant la dernière valeur qui a été placée. ' ----------------------------------------------------------------------------- ' Remarque : l'idée suivant laquelle on peut chercher une formulation du terme ' d'indice i et j dans A, constitue un autre algorithme qui, non seulement, risque ' d'être assez laborieux à analyser, mais encore n'apporterait pas d'amélioration ' au programme : il y aura toujours N*P "affectations". ' Il est beaucoup plus élégant de construire quatre tâches se succédant: ' Ligne_haute() ; Colonne_Gauche(); Ligne_Basse(); Colonne_Droite()
' *****************************************************************************
dim n, p, x, C,L n = 24 : p = 16 : ' 24 lignes et 16 colonnes full_space 0 : font_bold 0 : font_size 0,12 escargot(n, p) : caption 0,"Terminé" end ' **************************************************************************** SUB Escargot(n, p) x = 0 : Ligne_Haute(1, n, 1, p) END_SUB ' *************************************************************************** SUB ecrire(L, C) x = x + 1 : print_locate 12*(5*C-4),20*L : print x END_SUB ' **************************************************************************** SUB Ligne_Haute(L0, L1, C0, C1) for C = C0 to C1 : ecrire(L0, C) : wait 50 : next C if L0 < L1 then Colonne_Droite(L0 + 1, L1, C0, C1) END_SUB ' **************************************************************************** SUB Colonne_Gauche(L0, L1, C0, C1) for L = L1 to L0 step -1 : ecrire(L, C0) : wait 50 : next L if C0 < C1 then Ligne_Haute(L0, L1, C0 + 1, C1) END_SUB ' **************************************************************************** SUB Ligne_Basse(L0, L1, C0, C1) for C = C1 to C0 step -1 : ecrire(L1, C) : wait 50 : next C if L0 < L1 then Colonne_Gauche(L0, L1 - 1, C0, C1)
END_SUB ' **************************************************************************** SUB Colonne_Droite(L0, L1, C0, C1) for L = L0 to L1 : ecrire(L, c1) : wait 200 : next L if C0 < C1 then Ligne_Basse(L0, L1, C0, C1 - 1) END_SUB ' ***************************************************************************
Dernière édition par papydall le Jeu 4 Juil 2013 - 23:56, édité 1 fois (Raison : Pour incorporer des WAIT 50 sur une idée de Mindstorm) | |
| | | mindstorm
Nombre de messages : 685 Age : 55 Localisation : charente Date d'inscription : 13/02/2013
| Sujet: Re: Chercher un algorithme Jeu 4 Juil 2013 - 21:04 | |
| bonsoir papydall peut on conciderer que les cases sont toute vides ou faut il sauter les cases pleines en attendant j'ai rajouté des pause 200 a chaque sub ça permet de visualiser l'escargot | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Chercher un algorithme Jeu 4 Juil 2013 - 23:57 | |
| @mindstorm
Au départ, toutes les case sont vides bien sûr ! Puis on ne revient plus sur les cases déjà traitées. L’idée d’incorporer des pauses dans l’affichage est une bonne idée, pour visualiser le déroulement de l’algorithme. J’ai modifié mon code, en conséquence. | |
| | | bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: Chercher un algorithme Ven 5 Juil 2013 - 16:08 | |
| Bonjour à tous, Bonjour Papydall Ton code est intéressant mais pourquoi commencer en haut à gauche et faire tout le tour? C'est l'algorithme de l'escargot. Moi je me suis dit qu'il est peut-être possible de commencer par le milieu ou plutôt la dernière case et de s'enrouler autour; on peut même construire un tableau. Seule contrainte, connaître la case de départ et avoir un tableau aux mêmes dimensions horizontales et verticales. Je ne sais pas si mes tests sont bons, j'ai fait le programme à la va vite! Je n'ai pas le temps, mais je pense que l'on peut l'améliorer sensiblement. Bon je retourne à mes recherches généalogiques. A plus tard et bon courage à tous! - Code:
-
dim C,L,q,i,j,k,el,ec C=14:L=14:q=(C-1)*(L-1) dim a(C,L) full_space 0:font_bold 0:font_size 0,12 for i=0 to C:for j=0 to L:a(i,j)=0:next j:next i i=7:j=7:a(i,j)=q:print_locate 200+(i*36),100+(j*20):print q for k=(q-1) to 1 step -1 if a(i-1,j)=0 then el=j:ec=i-1 if a(i-1,j)=0 and a(i+1,j)<>0 then el=j+1:ec=i if a(i+1,j)=0 and a(i,j-1)<>0 then el=j:ec=i+1 if a(i,j-1)=0 and a(i-1,j)<>0 then el=j-1:ec=i if a(i+1,j)<>0 and a(i,j+1)<>0 then el=j:ec=i-1 j=el:i=ec:a(i,j)=k print_locate 200+(i*36),100+(j*20):print k:pause 200 next k
| |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| | | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Chercher un algorithme Ven 5 Juil 2013 - 16:52 | |
| | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Chercher un algorithme Ven 5 Juil 2013 - 16:59 | |
| Je pense que ce sera une image qui ressortira de temps en temps celle là ... | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Chercher un algorithme Ven 5 Juil 2013 - 18:17 | |
| Merci à tous ceux qui ont pris la peine d’intervenir. Quand une grande idée germe dans la tête de deux plus grands Panoramiciens de tous les temps (Bignono et Papydall), un Ygeronimi se fera découvrir son don de caricaturiste, un Jean Claude résumera ses sentiments dans un LOL, et un Jicehel prédira l’avenir ! Maintenant, les choses sérieuses ! L’algorithme de l’escargot, je l’ai trouvé dans un cours de Turbo Pascal qui parle d’algorithmique. Moi je ne sais rien inventer, mais (faute de mieux) j’essaye d’adapter certaines idées et algorithmes en les codant en PANORAMIC pour prévenir que mes rouages ne deviennent rouillés ! | |
| | | bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: Chercher un algorithme Ven 5 Juil 2013 - 20:01 | |
| L'algorithme de l'escargot ça peut servir à plein de choses. Entre autre je pense à faire un plateau de jeu de société avec le départ et l'arrivée un peu comme le jeu de l'oie par exemple. D'autres applications sont certainement possible, il suffit d'un peu d'imagination. Moi je trouve super que Papydall tu aies ouvert le débat là dessus. Maintenant, yen a qui ... | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Ven 5 Juil 2013 - 21:17 | |
| | |
| | | Froggy One
Nombre de messages : 598 Date d'inscription : 06/01/2012
| Sujet: Re Ven 5 Juil 2013 - 22:38 | |
| En modifiant deux ou trois lignes au code de Papydall, j'ai obtenu quelque chose qui ressemble déjà un peu plus à un plateau de jeu... - Code:
-
dim n, p, x, C,L,b et - Code:
-
SUB ecrire(L, C) x = x + 1 : b=x:alpha b:left b,12*(5*C-4) width b,48:top b,24*L :caption b,string$(4-len(str$(x))," ")+str$(x)+" " color b,int(1+rnd(255)),int(1+rnd(255)),int(1+rnd(255)) END_SUB
Le tout fait : - Code:
-
' ***************************************************************************** ' Escargot.bas par Papydall ' -------------------------- ' Il s'agit de remplir un tableau avec les entiers consécutifs, en partant de la ' case en haut à gauche occupée par 1, et en tournant dans le sens de l'horloge, ' tout en longeant les bords déjà occupés, et en finissant au centre du tableau ' sur la dernière case vide. ' QUESTION : Comment trouver un algorithme pour resoudre ce problème ? ' ------------------------------------------------------------------------------ ' Le problème peut être décrit autrement : ' Soit un tableau A de N lignes et P colonnes et X=1 placé dans la première case. ' On remplit alors, tant qu'elles sont vides, les cases de la première ligne (de gauche à droite), ' de la dernière colonne (de haut en bas), de la dernière ligne (de droite à gauche), et enfin de ' la première colonne (de bas en haut), avec X incrémenté à chaque fois. ' Puis on recommence avec le sous-tableau de N-2 lignes et P-2 colonnes encore ' libre et le X suivant la dernière valeur qui a été placée. ' ----------------------------------------------------------------------------- ' Remarque : l'idée suivant laquelle on peut chercher une formulation du terme ' d'indice i et j dans A, constitue un autre algorithme qui, non seulement, risque ' d'être assez laborieux à analyser, mais encore n'apporterait pas d'amélioration ' au programme : il y aura toujours N*P "affectations". ' Il est beaucoup plus élégant de construire quatre tâches se succédant: ' Ligne_haute() ; Colonne_Gauche(); Ligne_Basse(); Colonne_Droite()
' *****************************************************************************
dim n, p, x, C,L,b n = 24 : p = 16 : ' 24 lignes et 16 colonnes full_space 0 : font_bold 0 : font_size 0,12 escargot(n, p) : caption 0,"Terminé" end ' **************************************************************************** SUB Escargot(n, p) x = 0 : Ligne_Haute(1, n, 1, p) END_SUB ' *************************************************************************** SUB ecrire(L, C) x = x + 1 : b=x:alpha b:left b,12*(5*C-4) width b,48:top b,24*L :caption b,string$(4-len(str$(x))," ")+str$(x)+" " color b,int(1+rnd(255)),int(1+rnd(255)),int(1+rnd(255)) END_SUB ' **************************************************************************** SUB Ligne_Haute(L0, L1, C0, C1) for C = C0 to C1 : ecrire(L0, C) : next C if L0 < L1 then Colonne_Droite(L0 + 1, L1, C0, C1) END_SUB ' **************************************************************************** SUB Colonne_Gauche(L0, L1, C0, C1) for L = L1 to L0 step -1 : ecrire(L, C0) : next L if C0 < C1 then Ligne_Haute(L0, L1, C0 + 1, C1) END_SUB ' **************************************************************************** SUB Ligne_Basse(L0, L1, C0, C1) for C = C1 to C0 step -1 : ecrire(L1, C) : next C if L0 < L1 then Colonne_Gauche(L0, L1 - 1, C0, C1)
END_SUB ' **************************************************************************** SUB Colonne_Droite(L0, L1, C0, C1) for L = L0 to L1 : ecrire(L, c1): next L if C0 < C1 then Ligne_Basse(L0, L1, C0, C1 - 1) END_SUB ' ***************************************************************************
Vanné, dodo ! | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Chercher un algorithme Sam 6 Juil 2013 - 9:39 | |
| | |
| | | mindstorm
Nombre de messages : 685 Age : 55 Localisation : charente Date d'inscription : 13/02/2013
| Sujet: Re: Chercher un algorithme Sam 6 Juil 2013 - 22:20 | |
| bonsoir a tous seul un panoramicien peut avoir l'idée de commancer un escargot par le centre | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Chercher un algorithme Dim 7 Juil 2013 - 11:11 | |
| Excellente constatation ! J’aime et je partage. | |
| | | mindstorm
Nombre de messages : 685 Age : 55 Localisation : charente Date d'inscription : 13/02/2013
| Sujet: Re: Chercher un algorithme Lun 8 Juil 2013 - 18:41 | |
| bonsoir a tous il me vient une idée PANORAMICIENNE si si j'ai des idees pourquoi ne pas faire un vrai (rond) escargot en partant du centre est qui s'arrete quand il detecte un bord si quelqu un est en vacance, pas les retraité ils n'ont jamais le temps bonne soirée Mindstorm | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 8 Juil 2013 - 19:00 | |
| Ca y est ! encore un de perverti !!! | |
| | | Froggy One
Nombre de messages : 598 Date d'inscription : 06/01/2012
| Sujet: Re Mar 9 Juil 2013 - 16:48 | |
| un truc comme ça ? - Code:
-
2d_target_is 0:color 0,60,144,151 dim n,pas,mgbas,mght,mgg,mgd : ' pas et marges dim x,y,xc,yc:xc=width(0)/2:yc=height(0)/2 dim fgstop x=xc:y=yc:n=1:pas=3 mgbas=100:mght=mgbas:mgg=mght:mgd=mgg 2d_point x,y : 2d_poly_from x,y repeat x=x+pas if x>width(0)-mgd then fgstop=1 2d_poly_to x,y y=y+pas if y>height(0)-mght then fgstop=1 2d_poly_to x,y pas=pas*(n+1) x=x-pas if x<mgg then fgstop=1 2d_poly_to x,y y=y-pas if y<mgbas then fgstop=1 pas=pas*(n+1) 2d_poly_to x,y until fgstop=1
| |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Chercher un algorithme Mar 9 Juil 2013 - 17:57 | |
| OK, mais tu n’as pas besoin de 2d_point x,y ligne 7 puisque juste après tu fais 2d_poly_from x,y. | |
| | | Froggy One
Nombre de messages : 598 Date d'inscription : 06/01/2012
| Sujet: Re Mar 9 Juil 2013 - 18:22 | |
| | |
| | | Contenu sponsorisé
| Sujet: Re: Chercher un algorithme | |
| |
| | | | Chercher un algorithme | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |