aboutsummaryrefslogtreecommitdiffstats
path: root/examples/rule110.bdl
blob: abc89a9e4e31e0d618c061563584c747f677fa29 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
(def sequence (list 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1))

(fun reverse (ls)
    (fun rev-acc (ls acc)
        (if (nil? ls)
            acc
            (rev-acc (cdr ls) (cons (car ls) acc))))
    (rev-acc ls '()))

(fun print-line (seq)
    (if (or (nil? seq) (= 0 (car seq)))
        (print "  ")
        (print "🖤"))
    (if (not (nil? seq)) (print-line (cdr seq))))

(fun rule-110 (seq n)
    (print-line seq)
    (newline)
    (fun new-generation (lst seq)
    (def a (if (nil? seq) 0 (car seq)))
    (def b (if (or (nil? seq)
                   (nil? (cdr seq)))
                0
                (car (cdr seq))))
    (def c (if (or (nil? seq)
                   (nil? (cdr seq))
                   (nil? (cdr (cdr seq))))
                0
                (car (cdr (cdr seq)))))
    (def number (+ (* a 2 2) (* b 2) c))
    (def cell (cond ((= number 0) 0)
                    ((= number 1) 1)
                    ((= number 2) 1)
                    ((= number 3) 1)
                    ((= number 4) 0)
                    ((= number 5) 1)
                    ((= number 6) 1)
                    ((= number 7) 0)))
    (if (nil? (cdr seq))
        lst
        (new-generation (cons cell lst) (cdr seq))))
    (def seq (cons 0 (reverse (new-generation '() seq))))
    (if (= n 0)
        ()
        (rule-110 seq (- n 1))))

(rule-110 sequence 25)