#!/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)