RosettaCodeData/Task/Elementary-cellular-automat.../FreeBASIC/elementary-cellular-automat...

60 lines
1.7 KiB
Plaintext

Function noCelda(celda As String) As String
Return Iif(celda = "1", "0", "1")
End Function
Function invierteBits(regla As Integer) As String
Dim reglaBits As String = ""
For i As Integer = 0 To 7
reglaBits &= (regla Shr i) And 1
Next
Return reglaBits
End Function
Sub ecaInfinito(celdas As String, regla As Integer, n As Integer, ret() As String)
Dim As Integer i, j, k, indice
Dim reglaBits As String = invierteBits(regla)
Dim vecinoSgte(7) As String
For i = 0 To 7
vecinoSgte(i) = Mid(reglaBits, i + 1, 1)
Next
For i = 0 To n - 1
ret(i) = celdas
celdas = noCelda(Mid(celdas, 1, 1)) & noCelda(Mid(celdas, 1, 1)) & celdas & noCelda(Mid(celdas, Len(celdas), 1)) & noCelda(Mid(celdas, Len(celdas), 1))
Dim celdasNuevas As String = ""
For j = 0 To Len(celdas) - 3
indice = 0
For k = 0 To 2
indice = indice * 2 + Val(Mid(celdas, j + k + 1, 1))
Next
celdasNuevas &= vecinoSgte(indice)
Next
celdas = celdasNuevas
Next
End Sub
Sub Evolucionar(lineas As Integer)
Dim As Integer i, j, k, regla
Dim reglas(1) As Integer = {90, 30}
Dim s(24) As String
Dim salida As String
For i = 0 To 1
regla = reglas(i)
Print !"\nRule: "; regla; " ("; invierteBits(regla); ")"
ecaInfinito("1", regla, lineas, s())
For j = 0 To lineas - 1
salida = ""
For k = 1 To Len(s(j))
salida &= Iif(Mid(s(j), k, 1) = "0", ".", "#")
Next
Print j + 1; ": "; Space(lineas - j - 1); salida
Next
Next
End Sub
Evolucionar(25)
Sleep