| 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 | } |
| 101 | |