Advertisement
Guest User

Untitled

a guest
Jun 23rd, 2020
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 2.20 KB | None | 0 0
  1. ;; Very ugly port of https://github.com/guicho271828/life10-benchmarks/blob/master/life.ros
  2.  
  3. (import (rnrs bytevectors))
  4.  
  5. ;;; life.scm -- Conway's Game of Life in Scheme (at least R5RS and later)
  6. ;; this let was not needed
  7. (let ((n 40)
  8.       (m 80)
  9.       (g 66000))
  10.  
  11. (define-syntax dotimes
  12.   (syntax-rules ()
  13.     ((_ (start goal) body ...)
  14.      (let loop ((start 0))
  15.        (when (< start goal)
  16.      body ...
  17.      (loop (+ start 1)))))))
  18.  
  19. (define-syntax aref*
  20.   (syntax-rules ()
  21.     ((_ a i j)
  22.      (bytevector-u8-ref a (+ (* i m) j)))))
  23.  
  24. (define-syntax aset!
  25.   (syntax-rules ()
  26.     ((_ a i j v)
  27.      (bytevector-u8-set! a (+ (* i m) j) v))))
  28.  
  29. (define (display-it b)
  30.   (dotimes (i n)
  31.     (dotimes (j m)
  32.       (if (eq? 0 (aref* b i j))
  33.           (display #\space)
  34.           (display #\*)))
  35.     (newline)))
  36.  
  37.  
  38. (define (main)
  39.   (let ((b     (make-bytevector (* n m)))
  40.         (nextb (make-bytevector (* n m))))
  41.     (aset! b 19 41 1)
  42.     (aset! b 20 40 1)
  43.     (aset! b 21 40 1)
  44.     (aset! b 22 40 1)
  45.     (aset! b 22 41 1)
  46.     (aset! b 22 42 1)
  47.     (aset! b 22 43 1)
  48.     (aset! b 19 44 1)
  49.     (display "Before:")
  50.     (display-it b)
  51.  
  52.     (let loop ((k 0)
  53.            (b b)
  54.            (nextb nextb))
  55.       (when (< k g)
  56.     (dotimes (i n)
  57.       (let* ((nm1 (1- n))
  58.          (up (if (not (eq? i 0))
  59.              (1- i)
  60.              nm1))
  61.          (upm (* up m))
  62.          (down (if (not (eq? i nm1))
  63.                (1+ i)
  64.                0))
  65.          (downm (* down m))
  66.          (im (* i m)))
  67.        
  68.         (dotimes (j m)
  69.           (let* ((mm1 (1- m))
  70.              (left (if (not (eq? j 0))
  71.                    (1- j)
  72.                    mm1))
  73.              (right (if (not (eq? j mm1))
  74.                 (1+ j)
  75.                 0))
  76.              (count
  77.               (+ (bytevector-u8-ref b (+ upm  left))
  78.              (bytevector-u8-ref b (+ upm  j))
  79.              (bytevector-u8-ref b (+ upm  right))
  80.              (bytevector-u8-ref b (+ im   right))
  81.              (bytevector-u8-ref b (+ downm right))
  82.              (bytevector-u8-ref b (+ downm j))
  83.              (bytevector-u8-ref b (+ downm left))
  84.              (bytevector-u8-ref b (+ im   left)))))
  85.         (aset! nextb i j
  86.                (cond
  87.              ((eq? count 2) (aref* b i j))
  88.              ((eq? count 3) 1)
  89.              (else 0)))))))
  90.     (loop (1+ k) nextb b)))
  91.  
  92.     (display "After ") (display g) (display " generations:") (newline)
  93.     (display-it b)))
  94.  
  95. (main)
  96. )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement