Advertisement
Guest User

Untitled

a guest
Dec 8th, 2016
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 2.49 KB | None | 0 0
  1. (use vector-lib irregex)
  2. (define SCREEN-WIDTH 50)
  3. (define SCREEN-HEIGHT 6)
  4.  
  5. (define (make-screen)
  6.   (define x (make-vector SCREEN-HEIGHT))
  7.   (vector-map! (lambda (i x) (make-vector SCREEN-WIDTH #f)) x)
  8.   x)
  9.  
  10. (define (vrect! vec x y)
  11.   (vector-map! (lambda (i ya)
  12.                  (if (< i y)
  13.                      (vector-map (lambda (i xa)
  14.                                    (if (< i x)
  15.                                        #t
  16.                                        xa)) ya)
  17.                      ya)) vec))
  18.  
  19. (define (vrot-row! vec r x)
  20.   (set! (vector-ref vec r)
  21.     (vector-map (lambda (i _)
  22.                   (vector-ref (vector-ref vec r)
  23.                               (modulo (- i x) SCREEN-WIDTH)))
  24.                 (vector-ref vec r))))
  25.  
  26. (define (vrot-col! vec c x)
  27.   (let ((ocol (vector-map (lambda (i x) (vector-ref x c)) vec)))
  28.     (vector-for-each (lambda (i v)
  29.                        (set! (vector-ref v c)
  30.                          (vector-ref ocol (modulo (- i x) SCREEN-HEIGHT))))
  31.                      vec)))
  32.  
  33. (define (parse-cmd str)
  34.   (let ((m (irregex-match '(: (? "rotate ")
  35.                               (=> cmd (+ alpha)) (*? any)
  36.                               (=> a1 (+ num)) (*? any)
  37.                               (=> a2 (+ num)) (*? any)) str)))
  38.     (if m
  39.         (list (string->symbol (irregex-match-substring m 'cmd))
  40.               (string->number (irregex-match-substring m 'a1))
  41.               (string->number (irregex-match-substring m 'a2))))))
  42.  
  43. (define (eval-cmd! vec cmd)
  44.   (apply
  45.    (case (car cmd)
  46.      ((rect) vrect!)
  47.      ((row) vrot-row!)
  48.      ((column) vrot-col!)) (cons vec (cdr cmd))))
  49.  
  50. (define (count-on vec)
  51.   (vector-fold
  52.    (lambda (_ c x)
  53.      (+ c (vector-fold (lambda (_ c x) (if x (+ c 1) c)) 0 x)))
  54.    0 vec))
  55.  
  56. (define (solvep1 file)
  57.   (define scr (make-screen))
  58.   (with-input-from-file file
  59.     (lambda ()
  60.       (let loop ((l (read-line)))
  61.         (when (not (eof-object? l))
  62.           (eval-cmd! scr (parse-cmd l))
  63.           (loop (read-line))))))
  64.   (count-on scr))
  65.  
  66. (define (printscr scr)
  67.   (vector-for-each
  68.    (lambda (_ x)
  69.      (vector-for-each
  70.       (lambda (_ x)
  71.         (if x
  72.             (printf "X")
  73.             (printf " "))) x)
  74.      (printf "\n")) scr))
  75.  
  76. (define (solvep2 file)
  77.   (define scr (make-screen))
  78.   (with-input-from-file file
  79.     (lambda ()
  80.       (let loop ((l (read-line)))
  81.         (when (not (eof-object? l))
  82.           (eval-cmd! scr (parse-cmd l))
  83.           (loop (read-line))))))
  84.   (printscr scr))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement