v/examples/rule110.v

101 lines
1.7 KiB
V

import os
import rand
fn main() {
mut arg := '31'
if os.args.len != 2 {
println('Usage: rule110 [<n>]')
println('Using default `n` value: 31')
} else {
arg = os.args[1]
}
mut n := arg.int()
if n > 200 || n < 3 {
eprintln('`n` must be between 3 and 200!')
exit(1)
}
print('\n')
title := ' Rule 110 V Implementation '
title_len := title.len
if n > title_len {
for _ in 0 .. (n - title_len) / 2 {
print('=')
}
print(title)
for _ in 0 .. (n - title_len) / 2 {
print('=')
}
} else {
println(title[1..(title_len - 1)])
}
mut generation_bin := []int{len: n}
for i in 0 .. n {
generation_bin[i] = rand.intn(2) or { 0 }
}
print('\n')
// println('Random generated first automaton content: $generation_bin')
for _ in 0 .. n {
print_generation(generation_bin)
next_generation(mut generation_bin)
}
}
fn print_generation(arr []int) {
symbols := [' ', '*']!
for i in 0 .. arr.len {
print(symbols[arr[i]])
}
print('\n')
}
fn next_generation(mut gen []int) {
mut arr := gen.clone()
mut prev := 0
mut curr := 0
mut next := 0
for i in 0 .. arr.len {
if (i - 1) % gen.len < 0 {
prev = gen[gen.len - 1]
} else {
prev = gen[(i - 1) % gen.len]
}
curr = gen[i]
next = gen[(i + 1) % gen.len]
if prev == 1 {
if curr == 1 {
if next == 1 { // 111
arr[i] = 0
} else { // 110
arr[i] = 1
}
} else {
if next == 1 { // 101
arr[i] = 1
} else { // 100
arr[i] = 0
}
}
} else {
if curr == 1 {
if next == 1 { // 011
arr[i] = 1
} else { // 010
arr[i] = 1
}
} else {
if next == 1 { // 001
arr[i] = 1
} else { // 000
arr[i] = 0
}
}
}
}
gen = arr.clone()
}