Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Life
- def initialize (a, b, c)
- #Matrizengrösse x und y
- @a = a
- @b = b
- #Startkonfiguration
- @c = c
- #Die erste Ziffer ist bedeutungslos die zweite ist die Distanz x+1
- #die dritte die Distanz y+1
- @Umgebung = [[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,-1],[1,-1],[-1,1]]
- #Prüfregel
- @eT1 = 23; @eT2 = 32; @eT3 = 11
- @r1 = 33; @r2 = 12; @r3 = 21
- #@Feld = Array.new(@a) { Array.new(@b) { Array.new(4,0) } }
- #Um die späteren Ausgabewerte einzutragen
- @k = Array.new(@a) { Array.new(@b) {0}}
- #Feld erstellen
- field
- testmain
- end
- #erstelle Felder
- def field
- @Feld = Array.new(@a) do |x|
- Array.new(@b) do |y|
- r = [1, @c % 4, 0, 0 ]
- @c = (@c - @c%4)/4
- r
- end
- end
- end
- #def field
- #x = 0
- #y = 0
- #while (x < @a)
- #while (y < @b)
- #@Feld[x][y][1] = @c%4
- #@c= (@c - @c%4)/4
- #y= y+1
- #end
- #x= x+1
- #end
- # Sortiere nach Kategorien und führe den Test durch
- def testWechsel(n,m)
- x1=0 ;x2=0; x3=0 ;x0=0
- x01=0; x02=0; x03=0
- x12=0; x13=0; x23=0
- x012=0; x013=0; x023=0
- x123=0
- testwert= true
- #führt Zyklizität der Regel ein
- @e1=(@eT1+@Ersatz[n][m][1])%3
- @e2=(@eT2+@Ersatz[n][m][1])%3
- @e3=(@eT3+@Ersatz[n][m][1])%3
- #@e1=@eT1 ; @e2=@eT2; @e3=@eT3
- #begin
- @Umgebung.each do |u|
- #einordnen, zählen wieviele von welchem typus
- case @Ersatz[(n+u[0])%@a][(m+u[1])%@b][1]
- when @e1%10 && @e1/10 !=0
- case @Ersatz[(n+u[0])%@a][(m+u[1])%@b][2]
- when @e1%10
- case @Ersatz[(n+u[0])%@a][(m+u[1])%@b][3]
- when @e1%10 then x1=x1+1
- when @e2%10 && @e2/10!=0 then x12=x12+1
- when @e3%10 && @e3/10!=0 then x13=x13+1
- else x01=x01+1
- end
- when @e2%10 && @e2/10!=0
- case @Ersatz[(n+u[0])%@a][(m+u[1])%@b][3]
- when @e1%10 then return x12=x12+1
- when @e2%10 && @e2/10!=0 then x12=x12+1
- when @e3%10 && @e3/10!=0 then x123=x123+1
- else x012=x012+1
- end
- when @e3%10 && @e3%10!=0
- case @Ersatz[(n+u[0])%@a][(m+u[1])%@b][3]
- when @e1%10 then return x13=x13+1
- when @e2%10 && @e2/10!=0 then x123=x123+1
- when @e3%10 && @e3/10!=0 then x13=x13+1
- else x013=x013+1
- end
- else
- case @Ersatz[(n+u[0])%@a][(m+u[1])%@b][3]
- when @e1%10 then x01=x01+1
- when @e2%10 && @e2/10!=0 then x012=x012+1
- when @e3%10 && @e3/10!=0 then x013=x013+1
- else x01=x01+1
- end
- end
- when @e2%10 && @e2/10!=0
- case@Ersatz[(n+u[0])%@a][(m+u[1])%@b][2]
- when @e1%10 && @e1/10!=0
- case @Ersatz[(n+u[0])%@a][(m+u[1])%@b][3]
- when @e1%10 && @e1/10!=0 then x12=x12+1
- when @e2%10 then x12=x12+1
- when @e3%10 && @e3/10!=0 then x123=x123+1
- else x012=x012+1
- end
- when @e2%10
- case @Ersatz[(n+u[0])%@a][(m+u[1])%@b][3]
- when @e1%10 && @e1/10!=0 then x12=x12+1
- when @e2%10 then x2=x2+1
- when @e3%10 && @e3/10!=0 then x23=x23+1
- else x02=x02+1
- end
- when @e3%10 && @e3%10!=0
- case @Ersatz[(n+u[0])%@a][(m+u[1])%@b][3]
- when @e1%10 && @e1/10!=0 then x123=x123+1
- when @e2%10 then x23=x23+1
- when @e3%10 && @e3/10!=0 then x23=x23+1
- else x023=x023+1
- end
- else
- case @Ersatz[(n+u[0])%@a][(m+u[1])%@b][3]
- when @e1%10 && @e1/10!=0 then x012=x012+1
- when @e2%10 then x02=x02+1
- when @e3%10 && @e3/10!=0 then x023=x023+1
- else x02=x02+1
- end
- end
- when @e3%10 && @e3/10 !=0
- case @Ersatz[(n+u[0])%@a][(m+u[1])%@b][2]
- when @e1%10 && @e1/10!=0
- case @Ersatz[(n+u[0])%@a][(m+u[1])%b][3]
- when @e1%10 && @e1/10!=0 then x13=x13+1
- when @e2%10 && @e2/10!=0 then x123=x123+1
- when @e3%10 then x13=x13+1
- else x013=x013+1
- end
- when @e2%10 && @e2/10!=0
- case @Ersatz[(n+u[0])%@a][(m+u[1])%@b][3]
- when @e1%10 && @e1/10!=0 then x123=x123+1
- when @e2%10 && @e2/10!=0 then x23=x23+1
- when @e3%10 then x23=x23+1
- else x023=x023+1
- end
- when @e3%10
- case @Ersatz[(n+u[0])%@a][(m+u[1])%@b][3]
- when @e1%10 && @e3/10!=0 then x13=x13+1
- when @e2%10 && @e2/10!=0 then x23=x23+1
- when @e3%10 then x3=x3+1
- else x03=x03+1
- end
- else
- case @Ersatz[(n+u[0])%@a][(m+u[1])%@b][3]
- when @e1%10 && @e1/10!=0 then x013=x013+1
- when @e2%10 && @e2/10!=0 then x023=x023+1
- when @e3%10 then x03=x03+1
- else x03=x03+1
- end
- end
- else
- case @Ersatz[(n+u[0])%@a][(m+u[1])%@b][2]
- when @e1%10 && @e1/10!=0
- case @Ersatz[(n+u[0])%@a][(n+u[1])%@b][3]
- when @e1%10 && @e1/10!=0 then x01=x01+1
- when @e2%10 && @e2/10!=0 then x012=x012+1
- when @e3%10 && @e3/10!=0 then x013=x013+1
- else x01=x01+1
- end
- when @e2%10 && @e2/10!=0
- case @Ersatz[(n+u[0])%@a][(m+u[1])%@b][3]
- when @e1%10 && @e1/10!=0 then x012=x012+1
- when @e2%10 && @e2/10!=0 then x02=x02+1
- when @e3%10 && @e3/10!=0 then x023=x023+1
- else x02=x02+1
- end
- when @e3%10 && @e3%10!=0
- case @Ersatz[(n+u[0])%@a][(m+u[1])%@b][3]
- when @e1%10 && @e1/10!=0 then x013=x013+1
- when @e2%10 && @e2/10!=0 then x023=x023+1
- when @e3%10 && @e3/10!=0 then x03=x03+1
- else x03=x03+1; break
- end
- else
- case @Ersatz[(n+u[0])%@a][(m+u[1])%@b][3]
- when @e1%10 && @e1/10!=0 then x01=x01+1
- when @e2%10 && @e2/10!=0 then x02=x02+1
- when @e3%10 && @e3/10!=0 then x03=x03+1
- else x0=x0+1
- end
- end
- end
- #rescue SyntaxError
- #end
- end
- #überbieten
- f1=@eT1/10; f2=@eT2/10; f3=@eT3/10
- f1=f1-x1; f2=f2-x2; f3=f3-x3
- k12=x12; k13=x13; k23=x23
- k123=x123
- if (k13-f1)>0
- f3=f3-(k13-f1); k13=f1
- end
- if (x23-f2)>0
- f3=f3-(f23-f2); k23=f2
- end
- if k12-(f1+f2-k13-k23)>0
- k12=k12-(f1+f2-k13-k23)
- else
- k12=0
- k123=k123+k12-(f1+f2-k13-k23)
- end
- if k13+k23>=k12+k123
- f3=f3-(k12+k123); k12=0; k123=0
- end
- if f1>=0 && f2>=0 && f3>=0 && k12<=0 && k123<=0
- else
- testwert = false
- end
- #unterbieten
- f1=@eT1/10; f2=@eT2/10; f3=@eT3/10
- f1=f1-x1-x01; f2=f2-x2-x02; f3=f3-x3-x03;
- k12=x12+x012; k13=x13+x013; k23=x23+x023
- k123=x123
- if (k13-f1)>0
- f3=f3-(k13-f1); k13=f1
- end
- if (x23-f2)>0
- f3=f3-(f23-f2); k23=f2
- end
- if k12-(f1+f2-k13-k23)>0
- k12=k12-(f1+f2-k13-k23)
- else
- k12=0
- k123=k123+k12-(f1+f2-k13-k23)
- end
- f3=f3-k123
- if f3>0 && k13+k23>=f3 && k12>=f3
- k12=k12-f3
- f3=0
- end
- if f1<=0 && f2<=0 && f3<=0 && k12>=0 && k123>=0
- else
- testwert = false
- end
- return testwert
- end
- end
- #Prüfe ob sich der Änderungswer-t ändert
- def testRegel(n,m)
- rr1=@r1; rr2=@r2; rr3=@r3
- @Umgebung.each do |u|
- if @Ersatz[(n+u[0])%@a][(m+u[1])%@b][1] == rr1%10
- rr1=rr1-1
- elsif @Ersatz[(n+u[0])%@a][(m+u[1])%@b][1] == rr2%10
- rr2=rr2-1
- elsif @Ersatz[(n+u[0])%@a][(m+u[1])%@b][1] == rr3%10
- rr3=rr3-1
- end
- end
- if rr1==0 && rr2==0 && rr3==0
- @Feld[n][m][0]=(@Feld[n][m][0]+1)%3+1
- end
- end
- #Starte den test
- def testmain
- @Ersatz=[] +@Feld
- @Ersatz.each_index do |n|
- @Ersatz[n].each_index do |m|
- testRegel(n,m)
- @Feld[n][m][3]=@Feld[n][m][2]
- @Feld[n][m][2]=@Ersatz[n][m][1]
- if testWechsel(n,m)
- else
- @Feld[n][m][1]=(@Feld[n][m][1]+@Feld[n][m][0])%4
- end
- @k[n][m]=@Feld[n][m][1]
- end
- end
- p @k
- sleep 2
- testmain
- end
- l = Life.new(4, 5, 417)
Add Comment
Please, Sign In to add comment