Hallo Leute, ich hoffe ihr könnt mir weiterhelfen.
Ich will einen Algo in Ruby schreiben, der mir die beste Zugfolge für ein Spiel ausgibt.
Das Prob ist dabei, dass die wichtigen Variablen, wenn sie in einem Rekursionspfad geändert werden, dass in ALLEn Rekursionspfaden passiert.....?
der soll sich im Prinzip durchschachteln und stelle für stelle probieren ob die entsprechende Zahl funktioniert und dann wenn keine Zahl mehr gewählt werden kann, die Summe ausrechnen und gucken ob das besser ist, als die bisherigen Ergebnisse.
(Das Spiel funzt so: man hat eine Zahlenfolge von 1-N. Man kann pro zug 1 Zahl auswählen. Diese Zahl muss aber min. 1 Teiler haben. Wenn man eine Zahl gewählt hat, wird diese aus der Liste gestrichen, sowie deren Teiler. Kann keine Zahl mehr gewählt werden, ist das Spiel vorbei. Bei einer Folge von [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] wäre also [2, 6, 8, 10] möglich. Aber auch [10, 9, 8]. Je höher die Summe, desto besser^^)
Alles anzeigen
Ich will einen Algo in Ruby schreiben, der mir die beste Zugfolge für ein Spiel ausgibt.
Das Prob ist dabei, dass die wichtigen Variablen, wenn sie in einem Rekursionspfad geändert werden, dass in ALLEn Rekursionspfaden passiert.....?
der soll sich im Prinzip durchschachteln und stelle für stelle probieren ob die entsprechende Zahl funktioniert und dann wenn keine Zahl mehr gewählt werden kann, die Summe ausrechnen und gucken ob das besser ist, als die bisherigen Ergebnisse.
(Das Spiel funzt so: man hat eine Zahlenfolge von 1-N. Man kann pro zug 1 Zahl auswählen. Diese Zahl muss aber min. 1 Teiler haben. Wenn man eine Zahl gewählt hat, wird diese aus der Liste gestrichen, sowie deren Teiler. Kann keine Zahl mehr gewählt werden, ist das Spiel vorbei. Bei einer Folge von [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] wäre also [2, 6, 8, 10] möglich. Aber auch [10, 9, 8]. Je höher die Summe, desto besser^^)
Quellcode
- def x_in_a(a, x)
- ap = a.index(x)
- if ap == nil
- return false
- else
- return true
- end
- end
- def teiler_check(a, zahl)
- teiler = []
- pos= a.index(zahl)
- if pos == nil
- pos = a.length-1
- end
- ii = 0
- for i in 0..pos
- if (zahl%a[i])==0
- if not a[i]==zahl
- teiler[ii]=a[i]
- ii += 1
- end
- end
- end
- return teiler
- end
- def move(a, u, t, z, x, teiler)
- a.delete(x)
- for i in 0..(teiler.length-1)
- a.delete(teiler[i])
- end
- up=u.length
- u[up]=x
- t = t + teiler
- end
- def ausgeben(u, t)
- score = 0
- for i in 0..(u.length-1)
- if not u[i]==nil
- score = score + u[i]
- end
- end
- if @score<score
- @score = score
- @way = u
- p "********"
- print "score: "
- p score
- print "way: "
- p @way
- p "********"
- end
- end
- def possible(a)
- is = 0
- i = 0
- state = false
- until is == 1 or i>=(a.length) do
- teiler = teiler_check(a, a[i])
- if teiler.length>0
- is = 1
- state = true
- else
- i+=1
- end
- end
- return state
- end
- def taxman(a, t, u, z, stacklvl)
- if possible(a)==true
- for i in 1..(a.length)
- print "stack: "
- p stacklvl
- x = i
- print "x: "
- p x
- if x_in_a(a, x)==true
- teiler=teiler_check(a, x)
- print "teiler: "
- p teiler
- if teiler.length>0
- move(a, u, t, z, x, teiler)
- print "u: "
- p u
- p "*****"
- taxman(a, t, u, z, stacklvl+1)
- end
- end
- p "********"
- end
- end
- ausgeben(u, t)
- end
- def setup(l)
- a = []
- z = []
- u = []
- t = []
- for i in 0..(l-1)
- a[i] = (i+1)
- z[i] = (i+1)
- end
- @score = 10
- @way = []
- taxman(a, t, u, z, 1)
- end
- setup(10)