[ create a new paste ] login | about

Project: programmingpraxis
Link: http://programmingpraxis.codepad.org/H7akaoDD    [ raw code | output | fork ]

programmingpraxis - Scheme, pasted on May 9:
; cellular automata

(define (rule->bits rule)
  (let loop ((rule rule) (k 8) (bits '()))
    (cond ((zero? k) (list->vector (reverse bits)))
          ((odd? rule) (loop (quotient rule 2) (- k 1) (cons 1 bits)))
          (else (loop (quotient rule 2) (- k 1) (cons 0 bits))))))

(define (display-row row)
  (let ((len (- (vector-length row) 2)))
    (do ((i 1 (+ i 1))) ((> i len) (newline))
      (if (zero? (vector-ref row i))
          (display #\space)
          (display #\X))
      (if (< i len) (display #\space)))))

(define (next-row row bits)
  (let* ((len (- (vector-length row) 2))
         (next (make-vector (+ len 2) 0)))
    (do ((i 1 (+ i 1)))
        ((> i len)
          (vector-set! next 0 (vector-ref next 1))
          (vector-set! next (+ len 1) (vector-ref next len))
          next)
      (let ((neighbors (+ (* (vector-ref row (- i 1)) 4)
                          (* (vector-ref row i) 2)
                          (vector-ref row (+ i 1)))))
        (vector-set! next i (vector-ref bits neighbors))))))

(define (cells rule ticks)
  (let* ((row (make-vector (+ ticks ticks 3) 0))
         (bits (rule->bits rule)))
    (vector-set! row (+ ticks 1) 1)
    (do ((tick 0 (+ tick 1))
         (row row (next-row row bits)))
        ((> tick ticks))
      (display-row row))))

(cells 79 12)


Output:
1
2
3
4
5
6
7
8
9
10
11
12
13
                        X                        
X X X X X X X X X X X X X   X X X X X X X X X X X
                        X   X                    
X X X X X X X X X X X X X   X   X X X X X X X X X
                        X   X   X                
X X X X X X X X X X X X X   X   X   X X X X X X X
                        X   X   X   X            
X X X X X X X X X X X X X   X   X   X   X X X X X
                        X   X   X   X   X        
X X X X X X X X X X X X X   X   X   X   X   X X X
                        X   X   X   X   X   X    
X X X X X X X X X X X X X   X   X   X   X   X   X
                        X   X   X   X   X   X   X


Create a new paste based on this one


Comments: