20130517, rédaction en cours, le programme ci dessous permet de suivre l'effect d'une séquence, répétée jusqu'au retour à l'identique
le cube est placé face rouge en avant et bleu à droite, (vert à gauche, blanc dessus, jaune dessous et orange derrière)
un état est représenté (en couleur) par une suite de 48 lettres décrivant les 20 éléments mobiles soit:
- échange arrêtes de la face H: AAHGdAAgDHAA-PPHDgPPdGHPP-PPHDgPPdGHPP (cycle: 2, 4 arrêtes à tour 1)
la majuscule désigne un mouvement "horaire" ou "vissant" la minuscule le contraire (Xi dans la documentation Rubik's)
ou de lancer une boucle par *:séquence qui sera répétée jusqu'à retrouver la configuration initiale
le programme signale les point "pivots" comportant le minimum de changements pour cette séquence
souvent minicoins=0 et minifaces=0 se produisent plusieurs fois et une fois à la fin si tou est pareil
' suspect: vérifier l'effet des mouvemen,ts
' par antiguide@free.fr
' verrue pour créer liste réfetece en relaétif à partir de couleurs.
'a="RWB RBJ RJV RVW OJB OBW OWV OVJ RW RB RJ RV OJ OB OW OV JB JV VW BW"
'couleur2relatiffull
'set fs=createobject("Scripting.filesystemobject")
'set fi=fs.createtextfile("o.txt")
'fi.writeline a
'wscript.quit
if wscript.arguments.count=1 then cmd=Wscript.Arguments(0)
if cmd="" then cmd=inputbox("liste de mouvements ?")
' 1 2 3 4
' 123 456 789 012 345 678 901 234 56 78 90 12 34 56 78 90 12 34 56 78
'p="RWB RBJ RJV RVW OJB OBW OWV OVJ RW RB RJ RV OJ OB OW OV JB JV VW BW"
p="RWBRBJRJVRVWOJBOBWOWVOVJRWRBRJRVOJOBOWOVJBJVVWBW"
cmdori=cmd
' extraire compte
' sas doute compte permet interrompre répétition avant bouclage
compte=1
if instr(cmd,":") then
compte=mid(cmd,1,instr(cmd,":")-1)
if compte="*" then compte=9999999999
cmd=mid(cmd,instr(cmd,":")+1)
msgbox compte & " " & cmd
end if ' :
traduire=0 ' sera positif si demande en relatif
conserver=0
for i=1 to len(cmd)
if instr("ASDPGHRJBOVW", ucase(mid(cmd,i,1)) )=0 then
msgbox "commande invalide: "&mid(cmd,i,1)
wscript.quit
end if
if instr("ASDPGH", ucase(mid(cmd,i,1)) )>0 then traduire=traduire+1
if instr("RJBOVW", ucase(mid(cmd,i,1)) )>0 then conserver=conserver+1
next ' i
if traduire*conserver >0 then
msgbox "mélange couleur et positions impossible"
wscript.quit
end if
' la demande faite en relatif est traduite en couleurs
if traduire>0 then relatif2couleurfull
a=p
ori=p
minifaces=99
minicoins=99
miniarretes=99
totale="totale"
nn=0
ok=false
histofaces=""
histoarretes=""
histocoins=""
while not ok
nn=nn+1
faire cmd,cmdori
' histo=histo & vbcrlf & dire(a)
'
' si on est revenu à configuration initiale
if a=ori then ok=true
'si compte spécifié et atteint: terminer
if compte<>"*" then if nn+0=compte+0 then ok=true
' msgbox nn & " " & compte & " " & ok
' sipas terminé compter les différences.
if a<>ori then
faces=0
for i=1 to len(ori)
if mid(ori,i,1)<>mi(i,1) then faces=faces+1
next
if faces=minifaces then
' msgbox "minifaces=" & minifaces & " lebonfaces précédent=" & lebonfaces & "=== ajouter +" & nn
lebonfaces=lebonfaces & "," & nn
histofaces= histofaces & vbcrlf & nn &":" & dire(7,chgt(ori,a))
end if ' faces = minifaces
if faces < minifaces then
histofaces= "minifaces: " & vbcrlf & nn & ":" & dire(8,chgt(ori,a))
'msgbox "minifaces etziy " & minifaces & " faces= " & faces & " lebonfaces mis a " & nn
minifaces=faces
memofaces=a
lebonfaces=nn
end if 'faces <minifaces
' arretes et coins vont compter les éléments différents de original
arretes=0
coins=0
for i=0 to 7
if mid(ori,3*i+1,3)<>mid(a,3*i+1,3) then coins=coins+1
next
for i=0 to 11
if mid(ori,2*i+25,2)<>mid(a,2*i+25,2) then
arretes=arretes+1
' if nn=10 then msgbox i & " " & mid(ori,2*i+24,2) & "<>" & mid(a,2*i+24,2) & vbcrlf & ori & vbcrlf & dire (10,ori) & vbcrlf & a & vbcrlf & dire(11, a)
end if
next
' nbb de coins changés = la meilleure précedente
if coins = minicoins then
' msgbox "minicoins=" & minicoins & " leboncoins précédent=" & leboncoins & "=== ajouter +" & nn
leboncoins=leboncoins & "," & nn
histocoins= histocoins & vbcrlf & nn &":" & dire(7,chgt(ori,a))
end if '=minicoins
if coins < minicoins then
minicoins=coins
memocoins=a
leboncoins=nn
' msgbox "lebon coins init a " & nn
histocoins= "minicoins: " & vbcrlf & nn & ":" & dire(8,chgt(ori,a))
end if '<minicoins
if arretes = miniarretes then
' msgbox "miniarretes=" & miniarretes & " lebonarretes précédent=" & lebonarretes & "=== ajouter +" & nn
lebonarretes=lebonarretes & "," & nn
histoarretes= histoarretes & vbcrlf & nn &":" & dire(7,chgt(ori,a))
end if '=miniarretes
if arretes < miniarretes then
miniarretes=arretes
memoarretes=a
lebonarretes=nn
histoarretes= "miniarretes: " & vbcrlf & nn & ":" & dire(8,chgt(ori,a))
end if '<miniarretes
end if 'not ok ou a<>ori
wend
msgbox dire(96,ori) & vbcrlf &totale
' ' "act:" & vbcrlf & dire(3,a) & vbcrlf & _
msgbox cmdori & " après " & nn & " répétition(s), boucle=" & (ori=a) & " 1°=" & premiers(nn) & vbcrlf _
& "minifaces=" & minifaces & " a tour " & lebonfaces & vbcrlf & _
"minicoins=" & minicoins & " a tour " & leboncoins & vbcrlf & _
"miniarretes=" & miniarretes & " a tour " & lebonarretes& vbcrlf & _
"ori" & vbcrlf & dire(2,ori) & vbcrlf & _
histofaces & vbcrlf & _
histoarretes & vbcrlf & _
histocoins
function chgt (un,autre)
sous=""
for i=1 to len(un)
if mid(un,i,1)=mid(autre,i,1) then
sous=sous & chr(asc(mid(ori,i,1))+32)
else
sous=sous & mid(autre,i,1)
end if
next
chgt=sous
end function
' décomposer "porduit" en facteurs premiers
function premiers(produit)
rep=""
reste=produit
while reste >1
for div=2 to 100
while reste - div *(reste \ div) = 0
rep=rep & "*" & div
reste=reste\div
wend ' %=0
next
wend
' supprimer * initiales
premiers=mid(rep,2)
end function
' a virer!
sub moi
end sub
sub faire(quoi,quoiori)
for i4=1 to len(quoi)
un=mid(quoi,i4,1)
unori=mid(quoiori,i4,1)
' un mouvement "dévissant" (minuscule) converti en TROIS "vissant"
unmin=un
if instr("ASDPGH", unori) >0 then
unmin=mid("RJBOVW", instr("ASDPGH", unori),1)
else
if instr("asdpgh", unori) >0 then
unmin=mid("rjbovw", instr("asdpgh", unori),1)
end if
end if
'msgbox "faire " & unmin
if (un>="a") then
un=ucase(un)
nb2do=3
else
nb2do=1
end if
for anti=1 to nb2do
select case un
case "R" : r
case "V" : v
case "B" : b
case "O" : o
case "W" : w
case "J" : j
end select
for ipoo=1 to len(a)
if mid(a,ipoo,1)>="a" then
msgbox "faire erreur " & a
wscript.quit
end if
next 'ipoo
next 'anti
'totale=totale & vbcrlf & i4 & " fait: " & unmin & ": " & dire(99,a)
totale=totale & vbcrlf & i4 & " fait: " & unori & ": " & dire(99,a)
next 'i4
end sub
' changer b en a dans cmd
' changer commande en relatif à couleur
sub Relatif2Couleurfull
relatif2couleur("AR")
relatif2couleur("SJ")
relatif2couleur("DB")
relatif2couleur("PO")
relatif2couleur("GV")
relatif2couleur("HW")
end sub
sub Relatif2Couleur (ab)
cmdcouleur=""
old=mid(ab,1,1)
nw=mid(ab,2,1)
for ii=1 to len(cmd)
x1=mid(cmd,ii,1)
if x1=old then x1=nw
if asc(x1)-32= asc(old) then x1=chr(asc(nw)+32)
cmdcouleur=cmdcouleur & x1
next 'ii
'remplacer cmd origine
cmd=cmdcouleur
end sub '
sub couleur2relatiffull
couleur2relatif("AR")
couleur2relatif("SJ")
couleur2relatif("DB")
couleur2relatif("PO")
couleur2relatif("GV")
couleur2relatif("HW")
end sub '
' remplace l'état "a" en couleur par expression relatif
sub couleur2relatif (ab)
direlatif=""
old=mid(ab,2,1)
nw=mid(ab,1,1)
'msgbox "remplacer " & old & " par " & nw & " dans " & vbcrlf & a
for iii=1 to len(a)
x1=mid(a,iii,1)
if x1=old then x1=nw
if asc(x1)-32= asc(old) then x1=chr(asc(nw)+32)
direrelatif=direrelatif & x1
next 'ii
a=direrelatif
'msgbox "end " & a
end sub '
' dire l'état "pp" en couleur ou relatif selon cmd
function dire (appel,pp)
' conserver l'état actuel a
save=a
a=pp
if traduire>0 then couleur2relatifFull
p=a
dire= mid(p,1,3) & "-" & mid (p,4,3) & "-" & mid(p,7,3) & "-" & mid(p,10,3) & "-" & mid(p,13,3) & "-" & mid(p,16,3) & "-" & mid(p,19,3) & "-" & mid(p,22,3) & "-" & _
mid(p,25,2) & "-" & mid(p,27,2) & "-" & mid(p,29,2) & "-" & mid(p,31,2) & "-" & _
mid(p,33,2) & "-" & mid(p,35,2) & "-" & mid(p,37,2) & "-" & mid(p,39,2) & "-" &_
mid(p,41,2) & "-" & mid(p,43,2) & "-" & mid(p,45,2) & "-" & mid(p,47,2)
a=save
end function
' prendre une sous chaine de a (ancien état avant le mouvement)
function mi(ou,lon)
mi=mid(a,ou,lon)
end function
sub r
' 1 2 3 4
' 123 456 789 012 345 678 901 234 56 78 90 12 34 56 78 90 12 34 56 78
'p="RWB RBJ RJV RVW OJB OBW OWV OVJ RW RB RJ RV OJ OB OW OV JB JV VW BW"
n=nul("RWB>RVW") & mi(10,1) & mi(11,1) & mi(12,1) &_
nul("RBJ>RWB") & mi(1,1) & mi(2,1) & mi(3,1) & _
mi(4,1) & mi(5,1) & mi(6,1) & _
mi(7,1) & mi(8,1) & mi(9,1) & _
mi(13,12) & _
mi(31,2) & _
mi(25,2) & _
mi(27,2) & _
mi(29,2) & _
mi(33,18)
a=n
end sub
' pas d'idée, sans doute juste pour insérer un décor dans la construction du nouvel état
function nul(t)
nul=""
end function
sub b
' 1 2 3 4
' 123 456 789 012 345 678 901 234 56 78 90 12 34 56 78 90 12 34 56 78
'p="RWB RBJ RJV RVW OJB OBW OWV OVJ RW RB RJ RV OJ OB OW OV JB JV VW BW"
n=mi(6,1) & mi(4,1) & mi(5,1) &_
mi(14,1) & mi(15,1) & mi(13,1) & _
mi(7,3) & _
mi(10,3) & _
mi(18,1) & mi(16,1) & mi(17,1) &_
mi(2,1) & mi(3,1) & mi(1,1) & _
mi(19,6) & _
mi(25,2) & _
mi(41,2) & _
mi(29,2) & _
mi(31,2) & _
mi(33,2) & _
nul("OB") & mi(48,1) & mi(47,1) & _
nul("OW") & mi(37,2) & _
nul("OV") & mi(39,2) & _
nul("JB - > OB") & mi(35,2) & _
nul("JV") & mi(43,2) & _
nul("VW") & mi(45,2) & _
nul("BW") & mi(28,1)& mi(27,1)
a=n
end sub
sub v
' 1 2 3 4
' 123 456 789 012 345 678 901 234 56 78 90 12 34 56 78 90 12 34 56 78
'p="RWB RBJ RJV RVW OJB OBW OWV OVJ RW RB RJ RV OJ OB OW OV JB JV VW BW"
n=mi(1,3) &_
mi(4,3) & _
nul("RJV>WRV") & mi(12,1) & mi(10,1) & mi(11,1) & _
nul("RVW>WVO") & mi(20,1) & mi(21,1) & mi(19,1) &_
nul("OJB") & mi(13,3) & _
nul("OBW") & mi(16,3) & _
nul("OWV>JOV") & mi(24,1) & mi(22,1) & mi(23,1) &_
nul("OVJ>JVR") & mi(8,1) & mi(9,1) & mi(7,1) & _
nul("RW") & mi(25,2) &_
nul("RB") & mi(27,2) &_
nul("RJ") & mi(29,2) & _
nul("RV>WV") & mi(46,1) & mi(45,1) &_
nul("OJ") & mi(33,2) &_
nul("OB") & mi(35,2) &_
nul("OW") & mi(37,2) &_
nul("OV>JV") & mi(43,2) & _
nul("JB") & mi(41,2) & _
nul("JV>RV") & mi(31,2) & _
nul("VW>VO") & mi(40,1) & mi(39,1) & _
nul("BW") & mi(47,2)
a=n
end sub
sub o
' 1 2 3 4
' 123 456 789 012 345 678 901 234 56 78 90 12 34 56 78 90 12 34 56 78
'p="RWB RBJ RJV RVW OJB OBW OWV OVJ RW RB RJ RV OJ OB OW OV JB JV VW BW"
n=nul("RWB") & mi(1,3) &_
nul("RBJ") & mi(4,3) & _
nul("RJV") & mi(7,3) & _
nul("RVW") & mi(10,3) &_
nul("OJB>OVJ") & mi(22,1) & mi(23,1) & mi(24,1) & _
nul("OBW>OJB") & mi(13,3) & _
nul("OWV>OBW") & mi(16,3) &_
nul("OVJ>OWV") & mi(19,3) & _
nul("RW") & mi(25,2) &_
nul("RB") & mi(27,2) &_
nul("RJ") & mi(29,2) & _
nul("RV") & mi(31,2) &_
nul("OJ>OV") & mi(39,2) &_
nul("OB>OJ") & mi(33,2) &_
nul("OW>OB") & mi(35,2) &_
nul("OV>OW") & mi(37,2) & _
nul("JB") & mi(41,2) & _
nul("JV") & mi(43,2) & _
nul("VW") & mi(45,2) & _
nul("BW") & mi(47,2)
a=n
end sub
sub j
' 1 2 3 4
' 123 456 789 012 345 678 901 234 56 78 90 12 34 56 78 90 12 34 56 78
'p="RWB RBJ RJV RVW OJB OBW OWV OVJ RW RB RJ RV OJ OB OW OV JB JV VW BW"
n=nul("RWB") & mi(1,3) &_
nul("RBJ>VRJ") & mi(9,1) & mi(7,1) & mi(8,1) & _
nul("RJV>VJO") & mi(23,1) & mi(24,1) & mi(22,1) & _
nul("RVW") & mi(10,3) &_
nul("OJB>BJR)") & mi(5,1) & mi(6,1) & mi(4,1) & _
nul("OBW") & mi(16,3) & _
nul("OWV") & mi(19,3) &_
nul("OVJ>BOJ") & mi(15,1) & mi(13,1) & mi(14,1) & _
nul("RW") & mi(25,2) &_
nul("RB") & mi(27,2) &_
nul("RJ>VJ") & mi(44,1) & mi(43,1) & _
nul("RV") & mi(31,2) &_
nul("OJ>BJ") & mi(42,1) & mi(41,1) &_
nul("OB") & mi(35,2) &_
nul("OW") & mi(37,2) &_
nul("OV") & mi(39,2) & _
nul("JB>JR") & mi(30,1) & mi(29,1) & _
nul("JV>JO") & mi(34,1) & mi(33,1) & _
nul("VW") & mi(45,2) & _
nul("BW") & mi(47,2)
a=n
end sub
sub w
' 1 2 3 4
' 123 456 789 012 345 678 901 234 56 78 90 12 34 56 78 90 12 34 56 78
'p="RWB RBJ RJV RVW OJB OBW OWV OVJ RW RB RJ RV OJ OB OW OV JB JV VW BW"
n=nul("RWB>BWO") & mi(17,1) & mi(18,1) & mi(16,1) &_
nul("RBJ") & mi(4,3) & _
nul("RJV") & mi(7,3) & _
nul("RVW>BRW") & mi(3,1) & mi(1,1) & mi(2,1) &_
nul("OJB") & mi(13,3) & _
nul("OBW>VOW") & mi(21,1) & mi(19,1) & mi(20,1) & _
nul("OWV>VWR") & mi(11,1) & mi(12,1) & mi(10,1) &_
nul("OVJ") & mi(22,3) & _
nul("RW>BW") & mi(47,2) &_
nul("RB") & mi(27,2) &_
nul("RJ") & mi(29,2) & _
nul("RV") & mi(31,2) &_
nul("OJ") & mi(33,2) &_
nul("OB") & mi(35,2) &_
nul("OW>VW") & mi(45,2) &_
nul("OV") & mi(39,2) & _
nul("JB") & mi(41,2) & _
nul("JV") & mi(43,2) & _
nul("VW>RW") & mi(25,2) & _
nul("BW>OW") & mi(37,2)
a=n
end sub