1 | import os |
2 | import rand |
3 | |
4 | fn 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 | |
47 | fn print_generation(arr []int) { |
48 | symbols := [' ', '*']! |
49 | for i in 0 .. arr.len { |
50 | print(symbols[arr[i]]) |
51 | } |
52 | print('\n') |
53 | } |
54 | |
55 | fn 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 | } |