fork download
  1. ; IBAN
  2.  
  3. (define (split n xs)
  4. (let loop ((n n) (xs xs) (zs '()))
  5. (if (or (zero? n) (null? xs))
  6. (values (reverse zs) xs)
  7. (loop (- n 1) (cdr xs) (cons (car xs) zs)))))
  8.  
  9. (define (flatten xs)
  10. (cond ((null? xs) xs)
  11. ((pair? xs)
  12. (append (flatten (car xs))
  13. (flatten (cdr xs))))
  14. (else (list xs))))
  15.  
  16. (define (iban str)
  17. (let-values (((start end) (split 4 (string->list str))))
  18. (let loop ((cs (append end start)) (zs (list)))
  19. (cond ((null? cs)
  20. (string->number
  21. (list->string
  22. (flatten
  23. (reverse zs)))))
  24. ((char-alphabetic? (car cs))
  25. (loop (cdr cs)
  26. (cons (string->list
  27. (number->string
  28. (- (char->integer (car cs)) 55)))
  29. zs)))
  30. (else (loop (cdr cs) (cons (car cs) zs)))))))
  31.  
  32. (define (valid? str) (= 1 (modulo (iban str) 97)))
  33. (define (gen str) (- 98 (modulo (iban str) 97)))
  34.  
  35. (display (valid? "GB82WEST12345698765432")) (newline)
  36. (display (gen "GB00WEST12345698765432")) (newline)
Success #stdin #stdout 0.01s 8004KB
stdin
Standard input is empty
stdout
#f
98.0