10 KiB
10 KiB
title | author | date | url | wordtwit_post_info | categories | |||
---|---|---|---|---|---|---|---|---|
isbn13からisbn10を求めるlispスクリプト | kazu634 | 2008-11-07 | /2008/11/07/_1140/ |
|
|
「 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なんじゃなかろうかと思っているから、考え中。
- 作者: Kahuaプロジェクト,川合史朗
- 出版社/メーカー: オライリージャパン
- 発売日: 2008/03/14
- メディア: 大型本
- 購入: 22人 クリック: 713回
- この商品を含むブログ (272件) を見る