v / examples
Raw file | 100 loc (92 sloc) | 1.68 KB | Latest commit hash 114a341f5
1import os
2import rand
3
4fn main() {
5 mut arg := '31'
6 if os.args.len != 2 {
7 println('Usage: rule110 [<n>]')
8 println('Using default `n` value: 31')
9 } else {
10 arg = os.args[1]
11 }
12
13 mut n := arg.int()
14 if n > 200 || n < 3 {
15 eprintln('`n` must be between 3 and 200!')
16 exit(1)
17 }
18
19 print('\n')
20 title := ' Rule 110 V Implementation '
21 title_len := title.len
22 if n > title_len {
23 for _ in 0 .. (n - title_len) / 2 {
24 print('=')
25 }
26 print(title)
27 for _ in 0 .. (n - title_len) / 2 {
28 print('=')
29 }
30 } else {
31 println(title[1..(title_len - 1)])
32 }
33
34 mut generation_bin := []int{len: n}
35 for i in 0 .. n {
36 generation_bin[i] = rand.intn(2) or { 0 }
37 }
38 print('\n')
39
40 // println('Random generated first automaton content: $generation_bin')
41 for _ in 0 .. n {
42 print_generation(generation_bin)
43 next_generation(mut generation_bin)
44 }
45}
46
47fn print_generation(arr []int) {
48 symbols := [' ', '*']!
49 for i in 0 .. arr.len {
50 print(symbols[arr[i]])
51 }
52 print('\n')
53}
54
55fn next_generation(mut gen []int) {
56 mut arr := gen.clone()
57 mut prev := 0
58 mut curr := 0
59 mut next := 0
60 for i in 0 .. arr.len {
61 if (i - 1) % gen.len < 0 {
62 prev = gen[gen.len - 1]
63 } else {
64 prev = gen[(i - 1) % gen.len]
65 }
66 curr = gen[i]
67 next = gen[(i + 1) % gen.len]
68
69 if prev == 1 {
70 if curr == 1 {
71 if next == 1 { // 111
72 arr[i] = 0
73 } else { // 110
74 arr[i] = 1
75 }
76 } else {
77 if next == 1 { // 101
78 arr[i] = 1
79 } else { // 100
80 arr[i] = 0
81 }
82 }
83 } else {
84 if curr == 1 {
85 if next == 1 { // 011
86 arr[i] = 1
87 } else { // 010
88 arr[i] = 1
89 }
90 } else {
91 if next == 1 { // 001
92 arr[i] = 1
93 } else { // 000
94 arr[i] = 0
95 }
96 }
97 }
98 }
99 gen = arr.clone()
100}