; casting out nines
(define-syntax assert
(syntax-rules ()
((assert expr result)
(if (not (equal? expr result))
(for-each display `(
#\newline "failed assertion:" #\newline
expr #\newline "expected: " ,result
#\newline "returned: " ,expr #\newline))))))
(define (nines n)
(let loop ((n n) (s 0))
(if (< 0 n)
(let ((q (quotient n 10))
(r (remainder n 10)))
(loop q (+ r s)))
(if (< 9 s) (nines s)
(if (= 9 s) 0 s)))))
(display (do ((n 0 (+ n 1))) ((= n 1000) 'done)
(assert (nines n) (modulo n 9))))
(newline)
(display
(= (nines (+ (nines 3074)
(nines 6017)
(nines 13814)
(nines 1810)
(nines 27)
(nines 3611)))
(nines 28353)))
OyBjYXN0aW5nIG91dCBuaW5lcwoKKGRlZmluZS1zeW50YXggYXNzZXJ0CiAgKHN5bnRheC1ydWxlcyAoKQogICAgKChhc3NlcnQgZXhwciByZXN1bHQpCiAgICAgIChpZiAobm90IChlcXVhbD8gZXhwciByZXN1bHQpKQogICAgICAgICAgKGZvci1lYWNoIGRpc3BsYXkgYCgKICAgICAgICAgICAgI1xuZXdsaW5lICJmYWlsZWQgYXNzZXJ0aW9uOiIgI1xuZXdsaW5lCiAgICAgICAgICAgIGV4cHIgI1xuZXdsaW5lICJleHBlY3RlZDogIiAscmVzdWx0CiAgICAgICAgICAgICNcbmV3bGluZSAicmV0dXJuZWQ6ICIgLGV4cHIgI1xuZXdsaW5lKSkpKSkpCgooZGVmaW5lIChuaW5lcyBuKQogIChsZXQgbG9vcCAoKG4gbikgKHMgMCkpCiAgICAoaWYgKDwgMCBuKQogICAgICAgIChsZXQgKChxIChxdW90aWVudCBuIDEwKSkKICAgICAgICAgICAgICAociAocmVtYWluZGVyIG4gMTApKSkKICAgICAgICAgIChsb29wIHEgKCsgciBzKSkpCiAgICAgICAgKGlmICg8IDkgcykgKG5pbmVzIHMpCiAgICAgICAgICAoaWYgKD0gOSBzKSAwIHMpKSkpKQoKKGRpc3BsYXkgKGRvICgobiAwICgrIG4gMSkpKSAoKD0gbiAxMDAwKSAnZG9uZSkKICAgIChhc3NlcnQgKG5pbmVzIG4pIChtb2R1bG8gbiA5KSkpKQoobmV3bGluZSkKCihkaXNwbGF5CiAgKD0gKG5pbmVzICgrIChuaW5lcyAgMzA3NCkKICAgICAgICAgICAgICAgKG5pbmVzICA2MDE3KQogICAgICAgICAgICAgICAobmluZXMgMTM4MTQpCiAgICAgICAgICAgICAgIChuaW5lcyAgMTgxMCkKICAgICAgICAgICAgICAgKG5pbmVzICAgIDI3KQogICAgICAgICAgICAgICAobmluZXMgIDM2MTEpKSkKICAgICAobmluZXMgICAgICAgICAgIDI4MzUzKSkp