; marsaglia's mental rng
(define rs
(do ((rs (list 23)
(cons (+ (quotient (car rs) 10)
(* (modulo (car rs) 10) 6))
rs)))
((member (car rs) (cdr rs))
(reverse (cdr rs)))))
(display rs) (newline)
(define (mod n) (lambda (x) (modulo x n)))
(display (map (mod 10) rs)) (newline)
(display
(map (lambda (n)
(case n ((0) 'rock) ((1) 'paper) ((2) 'scissors)))
(map (mod 3) rs)))
(newline)
(define (uniq-c eql? xs)
(if (null? xs) xs
(let loop ((xs (cdr xs)) (prev (car xs)) (k 1) (result '()))
(cond ((null? xs) (reverse (cons (cons prev k) result)))
((eql? (car xs) prev) (loop (cdr xs) prev (+ k 1) result))
(else (loop (cdr xs) (car xs) 1 (cons (cons prev k) result)))))))
(display (uniq-c = (sort (map (mod 10) rs) <))) (newline)
(define ps
(let loop ((rs (append (map (mod 10) rs)
(list ((mod 10) (car rs)))))
(ps (list)))
(if (null? (cdr rs)) (reverse ps)
(loop (cdr rs) (cons (cons (car rs) (cadr rs)) ps)))))
(display ps) (newline)
(display
(sort ps (lambda (a b) (or (< (car a) (car b))
(and (= (car a) (car b))
(< (cdr a) (cdr b)))))))
(newline)
OyBtYXJzYWdsaWEncyBtZW50YWwgcm5nCgooZGVmaW5lIHJzCiAgKGRvICgocnMgKGxpc3QgMjMpCiAgICAgICAgKGNvbnMgKCsgKHF1b3RpZW50IChjYXIgcnMpIDEwKQogICAgICAgICAgICAgICAgICgqIChtb2R1bG8gKGNhciBycykgMTApIDYpKQogICAgICAgICAgICAgIHJzKSkpCiAgICAgICgobWVtYmVyIChjYXIgcnMpIChjZHIgcnMpKQogICAgICAgIChyZXZlcnNlIChjZHIgcnMpKSkpKQoKKGRpc3BsYXkgcnMpIChuZXdsaW5lKQoKKGRlZmluZSAobW9kIG4pIChsYW1iZGEgKHgpIChtb2R1bG8geCBuKSkpCgooZGlzcGxheSAobWFwIChtb2QgMTApIHJzKSkgKG5ld2xpbmUpCiAgICAgICAgIAooZGlzcGxheQogIChtYXAgKGxhbWJkYSAobikKICAgICAgIAkgKGNhc2UgbiAoKDApICdyb2NrKSAoKDEpICdwYXBlcikgKCgyKSAnc2Npc3NvcnMpKSkKICAgICAgIChtYXAgKG1vZCAzKSBycykpKQoobmV3bGluZSkKCihkZWZpbmUgKHVuaXEtYyBlcWw/IHhzKQogIChpZiAobnVsbD8geHMpIHhzCiAgICAobGV0IGxvb3AgKCh4cyAoY2RyIHhzKSkgKHByZXYgKGNhciB4cykpIChrIDEpIChyZXN1bHQgJygpKSkKICAgICAgKGNvbmQgKChudWxsPyB4cykgKHJldmVyc2UgKGNvbnMgKGNvbnMgcHJldiBrKSByZXN1bHQpKSkKICAgICAgICAgICAgKChlcWw/IChjYXIgeHMpIHByZXYpIChsb29wIChjZHIgeHMpIHByZXYgKCsgayAxKSByZXN1bHQpKQogICAgICAgICAgICAoZWxzZSAobG9vcCAoY2RyIHhzKSAoY2FyIHhzKSAxIChjb25zIChjb25zIHByZXYgaykgcmVzdWx0KSkpKSkpKQoKKGRpc3BsYXkgKHVuaXEtYyA9IChzb3J0IChtYXAgKG1vZCAxMCkgcnMpIDwpKSkgKG5ld2xpbmUpCgooZGVmaW5lIHBzCiAgKGxldCBsb29wICgocnMgKGFwcGVuZCAobWFwIChtb2QgMTApIHJzKQogICAgICAgICAgICAgICAgICAgICAgICAgKGxpc3QgKChtb2QgMTApIChjYXIgcnMpKSkpKQogICAgICAgICAgICAgKHBzIChsaXN0KSkpCiAgICAoaWYgKG51bGw/IChjZHIgcnMpKSAocmV2ZXJzZSBwcykKICAgICAgKGxvb3AgKGNkciBycykgKGNvbnMgKGNvbnMgKGNhciBycykgKGNhZHIgcnMpKSBwcykpKSkpCgooZGlzcGxheSBwcykgKG5ld2xpbmUpCgooZGlzcGxheQogIChzb3J0IHBzIChsYW1iZGEgKGEgYikgKG9yICg8IChjYXIgYSkgKGNhciBiKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kICg9IChjYXIgYSkgKGNhciBiKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg8IChjZHIgYSkgKGNkciBiKSkpKSkpKQogICAgICAgIAoobmV3bGluZSk=