#!/home/arne/wisp/wisp-multiline.sh ; !# ; A world projected on a d20 (20-sided die) ; For this we need a vector with 20 elements, a vector which shows the ; neighboring elements and accessor functions which give us the ; relevant elements for any set of longitude and latitude as well as ; its inverse (element-id to lon+lat). For further subdivisions, just ; elevate the center of each edge and connect these centers. . (define world (make-vector 20)) . (define neighbors (make-vector 20)) ; count from the top ; Contains the numbers instead of the indexes, to make it easier for ; me to think about them. ; ; 7 8 ; 3 4 ; 1 ; 6 2 9 ; 5 10 ; ; 14 13 ; 18 17 ; 20 ; 15 19 12 ; 16 11 ; . (define neighbors-helper '((1 2 3 4) (2 1 5 10) (3 1 6 7) (4 1 8 9) (5 2 6 14) (6 3 5 15) (7 3 8 16) (8 4 7 11) (9 4 10 12) (10 1 9 13) (20 19 18 17) (19 20 16 11) (18 20 15 14) (17 20 13 12) (16 19 17 7) (15 18 16 6) (14 18 13 5) (13 17 14 10) (12 17 11 9) (11 19 12 8))) . (let loop ((relationships neighbors-helper)) (cond ((null? relationships) neighbors) (else (let* ((cur (car relationships)) (idx (1- (car cur))) (vec (cdr cur))) (vector-set! world idx idx) (vector-set! neighbors idx (make-vector 3)) (let setidx ((idxtoset '(0 1 2))) (cond ((null? idxtoset) #t) (else (vector-set! (vector-ref neighbors idx) (car idxtoset) (1- (list-ref vec (car idxtoset)))) (setidx (cdr idxtoset))))) (loop (cdr relationships)))))) . (display world) . (newline) . (display neighbors) . (newline) . (display (vector-ref world 0)) . (newline)