par
7jaa » 07 nov. 2015, 01:24
Bonsoir,
j'ai pas mal avancé mais ça fait bien 4h que je suis bloqué sur un problème qui m'empêche d'avancer.
J'ai créé un fichier test.php à part juste pour coder la manipulation de mes array pour l'instant, voici mon code:
important il faut faire varier la condition d'arrêt de la boucle for ($i < 2 ici) entre 1 et environ 4 ou 5 pour voir l'évolution de l'array
Code : Tout sélectionner
<?php
$a = array("e" => 15,
"r" => 12,
"c" => 11,
"o" => 10,
"t" => 9,
"l" => 4,
"m" => 2,
"k" => 1);
for($i = 0; $i<2; $i++){
//ordonner l'array de l'occurence la plus basse à l'occurence la plus haute
asort($a);
//addition des deux occurences les plus basses
$somme = current($a) + next($a);
//compteur qui nous sera utile plus tard, qui contient l'indexe de l'array sur lequel est le pointeur
$compteur = 1;
//les clés sont mises ensemble dans la chaine $symb
$symb = array_search(current($a), $a).array_search(prev($a), $a);
//pointeur remis à sa place
next($a);
//calcul des occurences les plus basses,
//jusqu'à ce que la somme de celles-ci dépasse l'occurence suivante
//les clés correspondantes sont mises ensemble dans la chaine $symb
while($somme < next($a)){
$somme += current($a);
$symb .= array_search(current($a), $a);
$compteur++;
}
//incrémenter une fois le compteur car la condition du while "next($a)" a été lue une dernière fois sans pour autant
$compteur++;
//ne pas en tenir compte
//$symb = strrev($symb);
//supprimer de l'array les éléments déjà présents dans la chaine $symb
$a = array_slice($a, $compteur);
//remettre dans l'array la chaine $symb, avec sa nouvelle occurence
$a[$symb] = $somme;
}
print_r($a);
?>
Voici mon problème:
j'arrive donc avec un associative array $a. Tout d'abord je l'ordonne selon les valeurs (occurences), de la plus petite à la plus grande.
Ensuite, la démarche est la suivante: additionner les 2 plus petites valeurs et comparer la somme de l'addition avec la valeur suivante. Deux cas se présentent:
1) la somme est plus grande que la valeur suivante, dans ce cas on passe directement à la fin du code, c'est à dire qu'on met les 2 clés des 2 valeurs que l'on a sommées collées ensembles dans une string, qu'on va placer ensuite dans notre array (les 2 anciennes clés sont supprimées).
2) la somme est plus petite que la valeur suivante, dans ce cas on additionne la somme avec cette même valeur suivante, et on procède jusqu'à ce que la somme totale soit plus grande que la valeur suivante, dans quel cas on arrive au point 1) ci-dessus.
Je vais essayer de vous montrer par écrit ce que le résultat devrait être (avec le même array que j'utilise dans mon code):
à la première itération de la boucle for principale, le 'm' et le 'k' sont mis ensemble, mais comme la somme de leurs valeurs est < que la valeur suivante (c'est à dire 4, qui est la valeur de la clé 'l'), alors on continue de sommer. Ca se répète jusqu'au 't' => 9
Sous forme de calcul, ça donne ça:
'k' et 'm': 1+2=3, avec 3<4 donc on ajoute 'l'
'l' et 'mk': 4+3=7, avec 7<9 donc on ajoute 't'
't' et 'lmk': 9+7=16, avec 16>10 donc on s'arrête là.
Et à ce moment, la chaîne qu'on devrait avoir est tlmk (qui deviendra une nouvelle clé), avec comme valeur 16. Donc 'tlmk' => 16
Mon problème est là, je n'obtiens pas la chaîne 'tlmk' mais la chaine 'mklt'. Pas dans le bon ordre. J'ai essayé plein de truc différents mais pas moyen de l'avoir dans le bon ordre. Ou alors je réussissais à l'avoir dans le bon ordre, mais l'ordre de ce qui suit était perturbé à son tour par la suite. Bref un casse tête et après plusieurs heures à chercher un moyen j'ai décidé de demander de l'aide ici. Au pire des cas je continue mon code avec cette erreur et c'est pas si grave!
Pour ceux qui souhaiteraient voir le résultat après plusieurs itérations, voici ce que ça devrait donner:
array au début
k=>1
m=>2
l=>4
t=>9
o=>10
c=>11
r=>12
e=>15
array après 1 itération
o=>10
c=>11
r=>12
e=>15
tlmk=>16
array après 2 itérations
r=>12
e=>15
tlmk=>16
co=>21
array après 3 itérations
tlmk=>16
co=>21
er=>27
array après 4 itérations
er=>27
cotlmk=>37
array après 5 itérations
cotlmker=>64
Bon je me rends compte que c'est un peu beaucoup de choses que je balance ici, je n'en voudrai à personne si je n'ai pas de réponse

Bonsoir,
j'ai pas mal avancé mais ça fait bien 4h que je suis bloqué sur un problème qui m'empêche d'avancer.
J'ai créé un fichier test.php à part juste pour coder la manipulation de mes array pour l'instant, voici mon code:
[u][b]important[/b][/u] il faut faire varier la condition d'arrêt de la boucle for ($i < 2 ici) entre 1 et environ 4 ou 5 pour voir l'évolution de l'array
[code]<?php
$a = array("e" => 15,
"r" => 12,
"c" => 11,
"o" => 10,
"t" => 9,
"l" => 4,
"m" => 2,
"k" => 1);
for($i = 0; $i<2; $i++){
//ordonner l'array de l'occurence la plus basse à l'occurence la plus haute
asort($a);
//addition des deux occurences les plus basses
$somme = current($a) + next($a);
//compteur qui nous sera utile plus tard, qui contient l'indexe de l'array sur lequel est le pointeur
$compteur = 1;
//les clés sont mises ensemble dans la chaine $symb
$symb = array_search(current($a), $a).array_search(prev($a), $a);
//pointeur remis à sa place
next($a);
//calcul des occurences les plus basses,
//jusqu'à ce que la somme de celles-ci dépasse l'occurence suivante
//les clés correspondantes sont mises ensemble dans la chaine $symb
while($somme < next($a)){
$somme += current($a);
$symb .= array_search(current($a), $a);
$compteur++;
}
//incrémenter une fois le compteur car la condition du while "next($a)" a été lue une dernière fois sans pour autant
$compteur++;
//ne pas en tenir compte
//$symb = strrev($symb);
//supprimer de l'array les éléments déjà présents dans la chaine $symb
$a = array_slice($a, $compteur);
//remettre dans l'array la chaine $symb, avec sa nouvelle occurence
$a[$symb] = $somme;
}
print_r($a);
?>[/code]
Voici mon problème:
j'arrive donc avec un associative array $a. Tout d'abord je l'ordonne selon les valeurs (occurences), de la plus petite à la plus grande.
Ensuite, la démarche est la suivante: additionner les 2 plus petites valeurs et comparer la somme de l'addition avec la valeur suivante. Deux cas se présentent:
1) la somme est plus grande que la valeur suivante, dans ce cas on passe directement à la fin du code, c'est à dire qu'on met les 2 clés des 2 valeurs que l'on a sommées collées ensembles dans une string, qu'on va placer ensuite dans notre array (les 2 anciennes clés sont supprimées).
2) la somme est plus petite que la valeur suivante, dans ce cas on additionne la somme avec cette même valeur suivante, et on procède jusqu'à ce que la somme totale soit plus grande que la valeur suivante, dans quel cas on arrive au point 1) ci-dessus.
Je vais essayer de vous montrer par écrit ce que le résultat devrait être (avec le même array que j'utilise dans mon code):
à la première itération de la boucle for principale, le 'm' et le 'k' sont mis ensemble, mais comme la somme de leurs valeurs est < que la valeur suivante (c'est à dire 4, qui est la valeur de la clé 'l'), alors on continue de sommer. Ca se répète jusqu'au 't' => 9
Sous forme de calcul, ça donne ça:
'k' et 'm': 1+2=3, avec 3<4 donc on ajoute 'l'
'l' et 'mk': 4+3=7, avec 7<9 donc on ajoute 't'
't' et 'lmk': 9+7=16, avec 16>10 donc on s'arrête là.
Et à ce moment, la chaîne qu'on devrait avoir est tlmk (qui deviendra une nouvelle clé), avec comme valeur 16. Donc 'tlmk' => 16
Mon problème est là, je n'obtiens pas la chaîne 'tlmk' mais la chaine 'mklt'. Pas dans le bon ordre. J'ai essayé plein de truc différents mais pas moyen de l'avoir dans le bon ordre. Ou alors je réussissais à l'avoir dans le bon ordre, mais l'ordre de ce qui suit était perturbé à son tour par la suite. Bref un casse tête et après plusieurs heures à chercher un moyen j'ai décidé de demander de l'aide ici. Au pire des cas je continue mon code avec cette erreur et c'est pas si grave!
Pour ceux qui souhaiteraient voir le résultat après plusieurs itérations, voici ce que ça devrait donner:
[u][b]array au début[/b][/u]
k=>1
m=>2
l=>4
t=>9
o=>10
c=>11
r=>12
e=>15
[u][b]array après 1 itération[/b][/u]
o=>10
c=>11
r=>12
e=>15
tlmk=>16
[u][b]array après 2 itérations[/b][/u]
r=>12
e=>15
tlmk=>16
co=>21
[u][b]array après 3 itérations[/b][/u]
tlmk=>16
co=>21
er=>27
[u][b]array après 4 itérations[/b][/u]
er=>27
cotlmk=>37
[u][b]array après 5 itérations[/b][/u]
cotlmker=>64
Bon je me rends compte que c'est un peu beaucoup de choses que je balance ici, je n'en voudrai à personne si je n'ai pas de réponse :)