Inscription / Connexion Nouveau Sujet
Niveau algorithmique
Partager :

Programme une suite logique sur ordinateur

Posté par
rdces
06-05-10 à 18:08

Bonjour à tous.
Je suppose que tout le monde a entendu parler de cette suite:
1
11
21
1221
112211
212221
12113211
111221131221
31222113112211
[etc..]
J'aimerais réussir à programmer cette suite sur l'ordinateur.
Je suis sur Maple, mais si vous m'explpiquez en francais comment faire, je devrais pouvoir y arriver quand meme.
Quelqu'un a-t-il une idée?
Pour info, j'ai déja fabriqué un programme qui a un nombre renvoie la liste de ses chiffres et l'inverse. Exemple:
chiffres(53264)=[5,3,2,6,4]
et nombre([5,3,2,6,4])=53264
Merci d'avance
Nicolas

Posté par
Nicolas_75 Correcteur
re : Programme une suite logique sur ordinateur 06-05-10 à 21:05

Bonjour,

Quelle est la difficulté que tu rencontres ?

Il me semble qu'il suffit de parcourir la liste de gauche à droite. Tant qu'on a le même chiffre, on alimenter un compteur. Si on a un nouveau chiffre, on imprime le chiffre précédent précédé de la valeur du compteur, et on remet le compteur à zéro.

Nicolas

Posté par
caylus
re : Programme une suite logique sur ordinateur 06-05-10 à 21:31

Bonsoir Nicolas,

Citation :
et on remet le compteur à
UN

Posté par
Nicolas_75 Correcteur
re : Programme une suite logique sur ordinateur 06-05-10 à 22:53

En effet, merci caylus.

rdces, es-tu sûr de ta 4ème ligne :
1
11
21
1221

Posté par
Nicolas_75 Correcteur
re : Programme une suite logique sur ordinateur 06-05-10 à 22:54

Ci-dessous un programme en Java non optimisé.

Il sort :

Citation :
1
11
21
1211
111221
312211
13112221
1113213211
31131211131221
13211311123113112211
11131221133112132113212221



Citation :

public class Ile_355939 {

public static void main(String[] args) {
String listeAsString = "1";
System.out.println(listeAsString);
for (int i = 1; i <= 10; i++) { // pour avoir les 10 premiers termes
// on transforme la chaîne de caractères en tableau d'entiers :
int[] liste = new int[listeAsString.length()];
for (int j = 0; j < liste.length; j++) {
liste[j] = Integer.parseInt(listeAsString.substring(j, j + 1));
}
String res = "";
int nbEnCours = -1;
int nbOccurrences = 0;
for (int j = 0; j < liste.length; j++) { // pour chaque entier de la liste...
if (liste[j] == nbEnCours) { // si c'est le même que le précédent
nbOccurrences++; // on incrémente le compteur
} else { // si ce n'est pas le même que le précédent
if (j > 0) { // on complète la chaîne de sortie :
res = res + nbOccurrences + nbEnCours;
}
nbEnCours = liste[j]; // on garde ce nouvel entier...
nbOccurrences = 1; // ... apparu une seule fois pour l'instant
}
}
res = res + nbOccurrences + nbEnCours;
System.out.println(res);
listeAsString = res;
}
}
}

Posté par
rdces
re : Programme une suite logique sur ordinateur 06-05-10 à 23:29

Merci a tous pour vos reponses
En effet, je me suis trompé à la 4eme ligne, mais je pense que vous avez compris le principe.
Merci aussi pour le programme en Java, cependant, je n'y comprends pas un mot (meme avec les commentaires).
J'ai moi meme fait un programme, qui ne fonctionne pas, en maple. J'aimerais savoir ou est le probleme: (pour linstant, il n'est censé donné que le nombre suivant (donc, jaimerais que nombreSuivant(112211)=212221.
nombreSuivant := proc (n)
local L, i, Reponse, compteur;
L := chiffres(n);
i := 0;
Reponse := [0];
while i < nops(L) do
i := i+1;
compteur := 1;
if i+1 <= nops(L) then if L[i] = L[i+1] then compteur := compteur+1; if i+2 <= nops(L) then if L[i] = L[i+2] then compteur := compteur+1 end if end if end if end if; Reponse := [op(Reponse), L[i]]
end do;
return nombre(Reponse)
end proc

Posté par
Nicolas_75 Correcteur
re : Programme une suite logique sur ordinateur 07-05-10 à 09:25

Tu dis que ton programme en Maple ne fonctionne pas. Que se passe-t-il exactement ? Quel est le message d'erreur ?

Ci-dessous un exemple en Scheme, et sa sortie.

Citation :
; cette fonction passe d'un terme de la suite au suivant
; par exemple (nextStep '(2 1)) --> (1 2 1 1)
(define (nextStep L)
; définition de la sous-routine :
(define (nextStepSub L nbEnCours nbOccurrences res)
(if (null? L) ; on a fini de lire la liste
(append res (list nbOccurrences nbEnCours))
(if (= nbEnCours (car L)) ; on a encore le même nombre qu'à l'étape précédente
(nextStepSub (cdr L) nbEnCours (+ nbOccurrences 1) res)
; on a n nouveau nombre :
(if (= nbEnCours -1)
(nextStepSub (cdr L) (car L) 1 res)
(nextStepSub (cdr L) (car L) 1 (append res (list nbOccurrences nbEnCours)))))))
; appel de la sous-routine :
(nextStepSub L -1 0 '()))

; cette fonction affiche les n premiers termes de la liste, dont le premier terme est L (typiquement : (1))
(define (premiersTermes n L)
(display L)
(newline)
(if (> n 0)
(premiersTermes (- n 1) (nextStep L))))

; exécution du programme :
(premiersTermes 10 '(1))


Citation :
(1)
(1 1)
(2 1)
(1 2 1 1)
(1 1 1 2 2 1)
(3 1 2 2 1 1)
(1 3 1 1 2 2 2 1)
(1 1 1 3 2 1 3 2 1 1)
(3 1 1 3 1 2 1 1 1 3 1 2 2 1)
(1 3 2 1 1 3 1 1 1 2 3 1 1 3 1 1 2 2 1 1)
(1 1 1 3 1 2 2 1 1 3 3 1 1 2 1 3 2 1 1 3 2 1 2 2 2 1)

Posté par
Nicolas_75 Correcteur
re : Programme une suite logique sur ordinateur 07-05-10 à 09:40

Je ne connais rien à Maple, mais en m'inspirant de ton bout de code, je te propose ce qui suit.

Il faut probablement remplacer [0] par la liste vide ( [] ?)
Je suis parti de l'hypothèse que le premier indice d'un tableau est 1 et non pas 0. Est-ce vrai ?
Comment fait-on un commentaire en Maple ?

Nicolas

Citation :
nombreSuivant := proc (n)
local L, i, Reponse, compteur, chiffreEnCours;
L := chiffres(n);
i := 0;
Reponse := [0];
compteur := 0;
chiffreEnCours := -1;
while i < nops(L) do
i := i+1;
if L[i] = chiffreEnCours then
compteur := compteur + 1;
else
if i > 1 then
Reponse := [op(Reponse), compteur, chiffreEnCours];
end if
chiffreEnCours = L[i];
compteur = 1;
end if
end do;
Reponse := [op(Reponse), compteur, chiffreEnCours];
return nombre(Reponse)
end proc

Posté par
rdces
re : Programme une suite logique sur ordinateur 07-05-10 à 17:50

Merci pour ton programme
Cependant, il ne fonctionne pas:
quand je tape nombreSuivant(211331), il me renvoie -10101010101
Merci quand meme
Je continue à chercher

Posté par
rdces
re : Programme une suite logique sur ordinateur 07-05-10 à 17:52

pour info, la liste vide se note NULL, mais cela ne marcherait pas a cause de op(liste) qu'il ne comprendrait pas. Je precise que op(liste) renvoie la liste sans les crochets.
Rajouter un 0 au debut ne change rien car le programme (si il marche) va renvoyer par exemple 02312311213, ce qui est evidemment egal à 2312311213.
Pour les commentaire, voila:
machin:=proc(n)
#j'initialise les variables
local variables;
#je finis le programme
end proc:

Posté par
Nicolas_75 Correcteur
re : Programme une suite logique sur ordinateur 07-05-10 à 17:56

Tu n'as pas répondu à ma question :

Citation :
Je suis parti de l'hypothèse que le premier indice d'un tableau est 1 et non pas 0. Est-ce vrai ?

Posté par
rdces
re : Programme une suite logique sur ordinateur 07-05-10 à 18:13

tu as en effet raison.

Posté par
Nicolas_75 Correcteur
re : Programme une suite logique sur ordinateur 07-05-10 à 18:22

Pour la troisième fois : à quel indice commence un tableau en Maple : 0 ou 1 ?

Posté par
rdces
re : Programme une suite logique sur ordinateur 07-05-10 à 18:47

Un tableau en Maple commence à l'indice 1. Je vais en profiter pour te donner les principales opérations sur les listes:
Ainsi, si liste=[1,2,3,4,5]
liste[i]=i pour tout i appartenant à {1,2,3,4,5}
op(liste)=1,2,3,4,5
[op(liste),6)]=[1,2,3,4,5,6]
nops(liste)=5 (le nombre de chiffres dans la liste)
nombre(liste)=12345

Ce sera tout je crois?

Posté par
Nicolas_75 Correcteur
re : Programme une suite logique sur ordinateur 07-05-10 à 18:53

Pourrais-tu compléter le code avec les 4 lignes suivantes, ou leur équivalent pour afficher ce qui est proposé ? Fais tourner le programme. Et poste sa sortie.

Citation :
nombreSuivant := proc (n)
local L, i, Reponse, compteur, chiffreEnCours;
L := chiffres(n);
i := 0;
Reponse := [0];
compteur := 0;
chiffreEnCours := -1;
while i < nops(L) do
i := i+1;
# print "i = "+ i;
if L[i] = chiffreEnCours then
compteur := compteur + 1;
else
if i > 1 then
Reponse := [op(Reponse), compteur, chiffreEnCours];
end if
chiffreEnCours = L[i];
compteur = 1;
end if
# print "chiffreEnCours = " + chiffreEnCours;
# print "compteur = " + compteur;
# print "Reponse = " + Reponse; # sous forme de liste

end do;
Reponse := [op(Reponse), compteur, chiffreEnCours];
return nombre(Reponse)
end proc

Posté par
rdces
re : Programme une suite logique sur ordinateur 07-05-10 à 18:56

qu'est-ce que tu veux dire par print [...]?

Posté par
Nicolas_75 Correcteur
re : Programme une suite logique sur ordinateur 07-05-10 à 18:58

affiche, display

Posté par
rdces
re : Programme une suite logique sur ordinateur 07-05-10 à 18:59

woaw!
ya pas ca sur maple (ou alors je sais pas faire :$)
Je pense qu'on ne peut faire que des calculs et renvoyer un nombre (ou une liste ou une matrice...) à la fin

Posté par
Nicolas_75 Correcteur
re : Programme une suite logique sur ordinateur 07-05-10 à 19:04

Mais si, mais si. Consulte le manuel ou l'aide de Maple.

Essaie :

Citation :
nombreSuivant := proc (n)
local L, i, Reponse, compteur, chiffreEnCours;
L := chiffres(n);
i := 0;
Reponse := [0];
compteur := 0;
chiffreEnCours := -1;
while i < nops(L) do
i := i+1;
lprint(`i = `, i);
if L[i] = chiffreEnCours then
compteur := compteur + 1;
else
if i > 1 then
Reponse := [op(Reponse), compteur, chiffreEnCours];
end if
chiffreEnCours = L[i];
compteur = 1;
end if
lprint(`chiffreEnCours = `, chiffreEnCours );
lprint(`compteur = `, compteur);
lprint(`Reponse = `, Reponse);
end do;
Reponse := [op(Reponse), compteur, chiffreEnCours];
return nombre(Reponse)
end proc

Posté par
rdces
re : Programme une suite logique sur ordinateur 07-05-10 à 19:07

En effet!
Voici le résultat en tapant nombreSuivant(312211);

`i = `, 1
`chiffreEnCours = `, -1
`compteur = `, 0
`Reponse = `, [0]
`i = `, 2
`chiffreEnCours = `, -1
`compteur = `, 0
`Reponse = `, [0, 0, -1]
`i = `, 3
`chiffreEnCours = `, -1
`compteur = `, 0
`Reponse = `, [0, 0, -1, 0, -1]
`i = `, 4
`chiffreEnCours = `, -1
`compteur = `, 0
`Reponse = `, [0, 0, -1, 0, -1, 0, -1]
`i = `, 5
`chiffreEnCours = `, -1
`compteur = `, 0
`Reponse = `, [0, 0, -1, 0, -1, 0, -1, 0, -1]
`i = `, 6
`chiffreEnCours = `, -1
`compteur = `, 0
`Reponse = `, [0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1]
                                -10101010101

Posté par
Nicolas_75 Correcteur
re : Programme une suite logique sur ordinateur 07-05-10 à 19:14

Modifie le programme en rajoutant les ":" aux deux endroits ci-dessous.

Citation :
nombreSuivant := proc (n)
local L, i, Reponse, compteur, chiffreEnCours;
L := chiffres(n);
i := 0;
Reponse := [0];
compteur := 0;
chiffreEnCours := -1;
while i < nops(L) do
i := i+1;
lprint(`i = `, i);
if L[i] = chiffreEnCours then
compteur := compteur + 1;
else
if i > 1 then
Reponse := [op(Reponse), compteur, chiffreEnCours];
end if
chiffreEnCours := L[i];
compteur := 1;
end if
lprint(`chiffreEnCours = `, chiffreEnCours );
lprint(`compteur = `, compteur);
lprint(`Reponse = `, Reponse);
end do;
Reponse := [op(Reponse), compteur, chiffreEnCours];
return nombre(Reponse)
end proc

Posté par
rdces
re : Programme une suite logique sur ordinateur 07-05-10 à 19:18

Magnifique!
Merci beaucoup de ton aide!
Maintenant que le programme fonctionne, je vais me pencher sur l'algorithme pour le comprendre!
Merci encore du fond du coeur!
Je te souhaite un très bonne fin de journée!
A bientot!

Posté par
Nicolas_75 Correcteur
re : Programme une suite logique sur ordinateur 07-05-10 à 21:53

Je t'en prie. Cela m'a donné une occasion de découvrir la programmation sous Maple.



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !