(use tcp srfi-1) (define block-rows 5) (define block-cols 6) (define solid-black "000000") (define (expand-row x y r color) (let ((expanded (concatenate (map (lambda (x) (list-tabulate block-size (lambda (_) x))) r)))) (let loop ((x x) (y y) (e expanded) (res '())) (if (null? e) (reverse res) (loop (add1 x) y (cdr e) (cons (sprintf "PX ~a ~a ~a~%" x y (if (zero? (car e)) solid-black color)) res)))))) (define (expand-block x y b color) (let ((expanded (concatenate (map (lambda (r) (list-tabulate block-size (lambda (_) r))) b)))) (let loop ((x x) (y y) (e expanded) (res '())) (if (null? e) (reverse (concatenate res)) (loop x (add1 y) (cdr e) (cons (expand-row x y (car e) color) res)))))) (define (mirror grid) (map (lambda (lst) (append lst (cdr (reverse lst)))) grid)) (define (random-blocks) (mirror (list-tabulate block-rows (lambda _ (list-tabulate (/ block-cols 2) (lambda _ (random 2))))))) (define host (second (argv))) (define port (string->number (third (argv)))) (define block-size (string->number (fourth (argv)))) (define (random-color) (define (prefix n) (string-append (if (< n 16) "0" "") (number->string n 16))) (string-append (prefix (random 256)) (prefix (random 256)) (prefix (random 256)))) (receive (i o) (tcp-connect host port) (fprintf (current-error-port) "Asking for size... ") (fprintf o "SIZE~%~!") (let* ((size (string-split (read-line i))) (x (string->number (second size))) (y (string->number (third size)))) (fprintf (current-error-port) "Size: ~a x ~a~%" x y) (let l () (for-each (lambda (l) (display l o)) (expand-block (random x) (random y) (random-blocks) (random-color))) (l))))