OVH Cloud OVH Cloud

decaler les valeurs d'un tableau

8 réponses
Avatar
fs
Bonjour,

J'ai un tableau defini comme suit:
my @tableau = (1,2,3,4,5,6,7,8,9);

Je voudrais, a l'aide d'une boucle, decaler chaque element vers la
droite.
Par exemple:

decalage de 3 sur la droite:
1,2,3,4,5,6,7,8,9 --> 7,8,9,1,2,3,4,5,6

Les elements qui sortent sur la droite reviennent au debut.

Merci pour toute information,

fs

--
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net

8 réponses

Avatar
Jérémy JUST
On Wed, 19 Jan 2005 22:01:21 +0100
fs wrote:

Je voudrais, a l'aide d'une boucle, decaler chaque element
^^^^^^^^^^^^^^^^^^^^^

Tu confonds le but et le moyen d'y arriver.

Tu devrais formuler:
<<<<<
Je voudrais décaler les éléments d'un tableau vers la droite. Pour y
arriver, j'ai pensé à une boucle.








Personnellement, je ne pense pas à une boucle, mais à:

my @a = ( 1, 2, 3, 4, 5, 6, 7, 8, 9 ) ;
unshift @a, pop @a ;
print join ",", @a ;


Et pour $n éléments:

my $n = 3 ;
my @a = ( 1, 2, 3, 4, 5, 6, 7, 8, 9 ) ;
unshift @a, @a[$#a-$n+1..$#a];
$#a -= $n ;
print join ",", @a ;


--
Jérémy JUST





Avatar
fs
Merci bien pour les infos,

La premiere methode marche tres bien
Ca marche pour 1 decalage, mais avec une boucle (j'y tiens :o) je pense
qu'on peut decaler plusieurs fois.

Par contre la deuxieme methode m'affiche des nombres un peu
aleatoires...

Je vais donc me rabattre sur la premiere methode qui est parfaite pour
ce que je veux faire.

Merci encore,

fs

--
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net
Avatar
fs
Bon, je rencontre beaucoup de problemes...

J'ai en fait une sorte de rubiks cube:

DEF
123
234
345
A 123 456 789
B 234 567 891
C 345 678 912
789
891
912

ABC se bougent de la gauche vers la droite uniquement et DEF de haut en
bas
Un mouvement de la ligne A de 5 est represente par A5

Je veux trouver tous les mouvements possibles qui menent a:

DEF
212
423
534
A 649 125 277
B 917 546 888
C 123 863 999
983
134
751

On ne peut bouger chaque ligne et colonnes que seulement 2 fois (avec
autant de decalages que l'on veut pour chaque mouvement)
On ne peut bouger la meme ligne une seconde fois que si les autres
lignes on deja ete deplacees.

Je cherche donc toutes les combinaisons possibles qui menent au
deuxieme diagramme.
(2 fois 6 lignes a bouger)
Chaque solution peut etre de la forme:
A5B3C6D1E9F2F5E4D7C2B4A1

Si quelqu'un pouvait me donner un exemple de code pour resoudre cette
enigme ou me mettre sur le bon chemin par rapport a la maniere de
coder...

Pour ceux qui se poseraient la question, non ce n'est pas un exercice
ou un exam, je ne suis pas etudiant et je ne travaille pas dans le
domaine de l'informatique. C'est seulement une enigme trouvee dans un
journal... (et aucune recompense a la cle pour celui qui trouve...)

Merci d'avance pour toute info,

fs

--
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net
Avatar
Yves Martin
fs writes:

J'ai en fait une sorte de rubiks cube:

DEF
123
234
345
A 123 456 789
B 234 567 891
C 345 678 912
789
891
912

ABC se bougent de la gauche vers la droite uniquement et DEF de haut en bas
Un mouvement de la ligne A de 5 est represente par A5


Tu devrais préciser que les déplacements sont cycliques.

Je veux trouver tous les mouvements possibles qui menent a:

DEF
212
423
534
A 649 125 277
B 917 546 888
C 123 863 999
983
134
751

On ne peut bouger chaque ligne et colonnes que seulement 2 fois (avec autant
de decalages que l'on veut pour chaque mouvement) On ne peut bouger la meme
ligne une seconde fois que si les autres lignes on deja ete deplacees.


"les autres lignes" signifie-t-ils "toutes les autres lignes" ou "au moins une
autre ligne".
Je suppose que tu as assimilé les colonnes aux lignes dans cette description
et que les conditions sur ces colonnes sont les mêmes.

Je cherche donc toutes les combinaisons possibles qui menent au deuxieme
diagramme.
(2 fois 6 lignes a bouger)
Chaque solution peut etre de la forme:
A5B3C6D1E9F2F5E4D7C2B4A1


Est-ce que l'ordre des déplacements est fixé ? A-B-C-D-E-F-F-E-D-C-B-A-

ou peut-on intervertir les déplacements à condition de respecter la condition
précédente sur tout nouveau déplacement d'une ligne déjà utilisée ?

Si quelqu'un pouvait me donner un exemple de code pour resoudre cette enigme
ou me mettre sur le bon chemin par rapport a la maniere de coder...


Dans l'ordre:

- il te faut une représentation mémoire de la "chose", ta représentation
applannie semble une bonne piste: un tableau de 9 colonnes (dont 3 mobiles
circulaires) et 9 lignes (dont 3 mobiles circulaires)

- les fonctions de déplacement atomiques sur cette représentation
rotateLine("A",3) et rotateColumn("E",2) par exemple.

- une fonction de vérification du résultat

- un algorithme "force-brute" de recherche des combinaisons possibles et de
vérification

La littérature te permettrait aussi d'aborder des algorithmes plus subtiles
comme un arbre de solutions avec une fonction de distance entre une situation
donnée et la solution - mais ce genre d'algo est plus de la catégorie
"heuristique" (méthode approchée pour obtenir le plus court chemin ou la
meilleure situation - utilisé aux échecs par exemple) que des méthodes pour
obtenir toutes les combinaisons possibles.

Donc la force brute reste la plus rapide à implémenter - et la plus fiable
pour obtenir le résultat que tu cherches, c'est-à-dire "toutes les
combinaisons".

Bien que Perl permette de tout faire (merci Turing), j'ai une autre
proposition (exotique): décrire le problème en 'Prolog' et laisser faire le
moteur de résolution. Je dis cela à tout hasard mais le 'Prolog' est vraiment
peu connu - et j'en ai tout oublié de mes quelques mois d'expérience en école
d'ingénieurs... dommage d'ailleurs.

Bonne chance
--
Yves Martin

Avatar
fs
Je veux trouver tous les mouvements possibles qui menent a:

DEF
212
423
534
A 649 125 277
B 917 546 888
C 123 863 999
983
134
751

On ne peut bouger chaque ligne et colonnes que seulement 2 fois (avec autant
de decalages que l'on veut pour chaque mouvement) On ne peut bouger la meme
ligne une seconde fois que si les autres lignes on deja ete deplacees.


"les autres lignes" signifie-t-ils "toutes les autres lignes" ou "au moins
une autre ligne".
Je suppose que tu as assimilé les colonnes aux lignes dans cette description
et que les conditions sur ces colonnes sont les mêmes.



Oui, toutes les autres lignes doivent etre deplacees. Si je commence
par bouger A,
BCDEF doivent etre bouges avant de pouvoir decaler A a nouveau.

Je cherche donc toutes les combinaisons possibles qui menent au deuxieme
diagramme.
(2 fois 6 lignes a bouger)
Chaque solution peut etre de la forme:
A5B3C6D1E9F2F5E4D7C2B4A1


Est-ce que l'ordre des déplacements est fixé ? A-B-C-D-E-F-F-E-D-C-B-A-



L'ordre n'est a priori pas fixe et on peut bouger n'importe quelle
ligne/colonne tant que l'on respecte les regles:
-Chaque ligne/colonne est deplacee 2 fois en tout
-On ne peut bouger la meme ligne/colonne une seconde fois que si toutes
les autres lignes on deja ete deplacees

Mon idee est d'imbriquer 6 boucles for sur le schema suivant:

for i=0 to 8
shift @A
for i=0 to 8
shift @B
for i=0 to 8
shift @C
......etc jusqu'a @F
ici, faire la comparaison avec les tableaux @a,b,c,d,e,f
et continuer...

Ce qui, je pense brute forcerait toutes solutions possibles :o?
Mon probleme est tout d'abord au niveau de la maniere de "shifter" les
"cases" des tableaux une par une.
Ensuite, mon second probleme c'est les relations qu'il y a entre par
exemple @A et @D qui ont une case en commun.

J'ai commencer a faire ceci:

#tables a deplacer
my @A = (1,2,3,4,5,6,7,8,9);
my @B = (2,3,4,5,6,7,8,9,1);
my @C = (3,4,5,6,7,8,9,1,2);
my @D = (1,2,3,4,5,6,7,8,9);
my @E = (2,3,4,5,6,7,8,9,1);
my @F = (3,4,5,6,7,8,9,1,2);

#tables a obtenir
my @a = (6,4,9,1,2,5,2,7,7);
my @b = (9,1,7,5,4,6,8,8,8);
my @c = (1,2,3,8,6,3,9,9,9);
my @d = (2,4,5,1,5,8,9,1,7);
my @e = (1,2,3,2,4,6,8,3,5);
my @f = (2,3,4,5,6,3,3,4,1);

for (my $i=0;$i<8;$i++) {

#deplacement horizontal
unshift @A,pop @A;
unshift @B,pop @B;
unshift @c,pop @C;

#chaque ligne/colonne ont des cases en commun
$D[3]=$A[3];
$D[4]=$B[3];
$D[5]=$C[3];
$E[3]=$A[4];
$E[4]=$B[4];
$E[5]=$C[4];
$F[3]=$A[5];
$F[4]=$B[5];
$F[5]=$C[5];

deplacement vertical
unshift @D,pop @D;
unshift @E,pop @E;
unshift @F,pop @F;
$A[3]=$D[3];
$A[4]=$E[3];
$A[5]=$F[3];
$B[3]=$D[4];
$B[4]=$E[4];
$B[5]=$F[4];
$C[3]=$D[5];

et je n'ai pas continue puisque mon systeme de "shift" ne marche pas...

Bien que Perl permette de tout faire (merci Turing), j'ai une autre
proposition (exotique): décrire le problème en 'Prolog' et laisser faire le
moteur de résolution. Je dis cela à tout hasard mais le 'Prolog' est
vraiment peu connu - et j'en ai tout oublié de mes quelques mois
d'expérience en école d'ingénieurs... dommage d'ailleurs.

Bonne chance



merci, je vais regarder ce dont est capable prolog

--
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net


Avatar
Lionel
Je veux trouver tous les mouvements possibles qui menent a:

DEF
212
423
534
A 649 125 277
B 917 546 888
C 123 863 999
983
134
751

On ne peut bouger chaque ligne et colonnes que seulement 2 fois (avec
autant
de decalages que l'on veut pour chaque mouvement) On ne peut bouger
la meme
ligne une seconde fois que si les autres lignes on deja ete deplacees.



"les autres lignes" signifie-t-ils "toutes les autres lignes" ou "au
moins une autre ligne".
Je suppose que tu as assimilé les colonnes aux lignes dans cette
description
et que les conditions sur ces colonnes sont les mêmes.



Oui, toutes les autres lignes doivent etre deplacees. Si je commence par
bouger A,
BCDEF doivent etre bouges avant de pouvoir decaler A a nouveau.

Je cherche donc toutes les combinaisons possibles qui menent au deuxieme
diagramme.
(2 fois 6 lignes a bouger)
Chaque solution peut etre de la forme:
A5B3C6D1E9F2F5E4D7C2B4A1



Est-ce que l'ordre des déplacements est fixé ? A-B-C-D-E-F-F-E-D-C-B-A-



L'ordre n'est a priori pas fixe et on peut bouger n'importe quelle
ligne/colonne tant que l'on respecte les regles:
-Chaque ligne/colonne est deplacee 2 fois en tout
-On ne peut bouger la meme ligne/colonne une seconde fois que si toutes
les autres lignes on deja ete deplacees

Mon idee est d'imbriquer 6 boucles for sur le schema suivant:

for i=0 to 8
shift @A
for i=0 to 8
shift @B
for i=0 to 8
shift @C
......etc jusqu'a @F
ici, faire la comparaison avec les tableaux @a,b,c,d,e,f
et continuer...

Ce qui, je pense brute forcerait toutes solutions possibles :o?
Mon probleme est tout d'abord au niveau de la maniere de "shifter" les
"cases" des tableaux une par une.
Ensuite, mon second probleme c'est les relations qu'il y a entre par
exemple @A et @D qui ont une case en commun.

J'ai commencer a faire ceci:

#tables a deplacer
my @A = (1,2,3,4,5,6,7,8,9);
my @B = (2,3,4,5,6,7,8,9,1);
my @C = (3,4,5,6,7,8,9,1,2);
my @D = (1,2,3,4,5,6,7,8,9);
my @E = (2,3,4,5,6,7,8,9,1);
my @F = (3,4,5,6,7,8,9,1,2);

#tables a obtenir
my @a = (6,4,9,1,2,5,2,7,7);
my @b = (9,1,7,5,4,6,8,8,8);
my @c = (1,2,3,8,6,3,9,9,9);
my @d = (2,4,5,1,5,8,9,1,7);
my @e = (1,2,3,2,4,6,8,3,5);
my @f = (2,3,4,5,6,3,3,4,1);

for (my $i=0;$i<8;$i++) {

#deplacement horizontal
unshift @A,pop @A;
unshift @B,pop @B;
unshift @c,pop @C;

#chaque ligne/colonne ont des cases en commun
$D[3]=$A[3];
$D[4]=$B[3];
$D[5]=$C[3];
$E[3]=$A[4];
$E[4]=$B[4];
$E[5]=$C[4];
$F[3]=$A[5];
$F[4]=$B[5];
$F[5]=$C[5];

deplacement vertical
unshift @D,pop @D;
unshift @E,pop @E;
unshift @F,pop @F;
$A[3]=$D[3];
$A[4]=$E[3];
$A[5]=$F[3];
$B[3]=$D[4];
$B[4]=$E[4];
$B[5]=$F[4];
$C[3]=$D[5];

et je n'ai pas continue puisque mon systeme de "shift" ne marche pas...

Bien que Perl permette de tout faire (merci Turing), j'ai une autre
proposition (exotique): décrire le problème en 'Prolog' et laisser
faire le
moteur de résolution. Je dis cela à tout hasard mais le 'Prolog' est
vraiment peu connu - et j'en ai tout oublié de mes quelques mois
d'expérience en école d'ingénieurs... dommage d'ailleurs.

Bonne chance




merci, je vais regarder ce dont est capable prolog

Yep prolog est ton ami pour ce genre de problème. Je me souviens avoir

fait un truc similaire (ça ressemble au rubik's cube ton truc au niveau
modélisation). Mais c'était il y a oulàààà... longtemps.
Tu peux te renseigner sur la "programmation par contrainte" qui m'avait
permis de coder assez facilement un algo de résolution de rubik's en un
minimum de coup.



Avatar
fs
merci, je vais regarder ce dont est capable prolog

Yep prolog est ton ami pour ce genre de problème. Je me souviens avoir fait

un truc similaire (ça ressemble au rubik's cube ton truc au niveau
modélisation). Mais c'était il y a oulàààà... longtemps.
Tu peux te renseigner sur la "programmation par contrainte" qui m'avait
permis de coder assez facilement un algo de résolution de rubik's en un
minimum de coup.


Bon, je viens de lire quelques cours sur prolog et pour etre franc, je
n'apprendrai ce langage que si ma vie est en jeu...

--
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net


Avatar
Lionel

Bon, je viens de lire quelques cours sur prolog et pour etre franc, je
n'apprendrai ce langage que si ma vie est en jeu...

:-)

dommage, c'est un langage fait pour ça.

Mais bon je te comprends:
- l'apprentissage en est difficile
- c'est un langage terriblement efficace sur un domaine restreint et
terriblement inutile sur tout le reste
- tu l'oublies tellement vite que tu n'as même pas le temps de t'en
apercevoir ;-)

bon courga!