isbn13からisbn10を求めるスクリプトを作る(途中) – 武蔵の日記」の続きです。

前回まではここまでできました。

;; 9784774135045
(define (isbn arg)
(if (rxmatch #/\d\d\d\d\d\d\d\d\d\d\d\d\d/ (number->string arg))
(print "Match")
(print "Not match")))
(define (number->list number)
(define (loop lis)
(cond [(null? lis) '()]
[else (cons (digit->integer (car lis)) (loop (cdr lis)))]))
(let ((num_list (string->list (number->string number))))
(loop num_list)))

今回は13桁の数字から必要な部分を抜き出して、チェックディジットを求める巻数を作りました。

;; isbn13から必要な部分だけを抜き出してリストにする
(define (split-list list)
(drop-right (take-right list 10) 1))
(define (chkdigit num)
(define (proc list)
(cond [(null? list) ]
[else (+ (* (car list) (+ 1 (length list))) (proc (cdr list)))]))
(let ((result (- 11 (modulo (proc (split-list (number->list num))) 11))))
(if (= result 10)
'X
result)))
gosh> (define isbn13 9784873113487)
isbn13
gosh> (chkdigit isbn13)
2

fold使うともっとelegantなんじゃなかろうかと思っているから、考え中。

プログラミングGauche

プログラミングGauche