Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (use vector-lib irregex)
- (define SCREEN-WIDTH 50)
- (define SCREEN-HEIGHT 6)
- (define (make-screen)
- (define x (make-vector SCREEN-HEIGHT))
- (vector-map! (lambda (i x) (make-vector SCREEN-WIDTH #f)) x)
- x)
- (define (vrect! vec x y)
- (vector-map! (lambda (i ya)
- (if (< i y)
- (vector-map (lambda (i xa)
- (if (< i x)
- #t
- xa)) ya)
- ya)) vec))
- (define (vrot-row! vec r x)
- (set! (vector-ref vec r)
- (vector-map (lambda (i _)
- (vector-ref (vector-ref vec r)
- (modulo (- i x) SCREEN-WIDTH)))
- (vector-ref vec r))))
- (define (vrot-col! vec c x)
- (let ((ocol (vector-map (lambda (i x) (vector-ref x c)) vec)))
- (vector-for-each (lambda (i v)
- (set! (vector-ref v c)
- (vector-ref ocol (modulo (- i x) SCREEN-HEIGHT))))
- vec)))
- (define (parse-cmd str)
- (let ((m (irregex-match '(: (? "rotate ")
- (=> cmd (+ alpha)) (*? any)
- (=> a1 (+ num)) (*? any)
- (=> a2 (+ num)) (*? any)) str)))
- (if m
- (list (string->symbol (irregex-match-substring m 'cmd))
- (string->number (irregex-match-substring m 'a1))
- (string->number (irregex-match-substring m 'a2))))))
- (define (eval-cmd! vec cmd)
- (apply
- (case (car cmd)
- ((rect) vrect!)
- ((row) vrot-row!)
- ((column) vrot-col!)) (cons vec (cdr cmd))))
- (define (count-on vec)
- (vector-fold
- (lambda (_ c x)
- (+ c (vector-fold (lambda (_ c x) (if x (+ c 1) c)) 0 x)))
- 0 vec))
- (define (solvep1 file)
- (define scr (make-screen))
- (with-input-from-file file
- (lambda ()
- (let loop ((l (read-line)))
- (when (not (eof-object? l))
- (eval-cmd! scr (parse-cmd l))
- (loop (read-line))))))
- (count-on scr))
- (define (printscr scr)
- (vector-for-each
- (lambda (_ x)
- (vector-for-each
- (lambda (_ x)
- (if x
- (printf "X")
- (printf " "))) x)
- (printf "\n")) scr))
- (define (solvep2 file)
- (define scr (make-screen))
- (with-input-from-file file
- (lambda ()
- (let loop ((l (read-line)))
- (when (not (eof-object? l))
- (eval-cmd! scr (parse-cmd l))
- (loop (read-line))))))
- (printscr scr))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement