Skip to content

Instantly share code, notes, and snippets.

@MasayukiFukada
Last active November 19, 2015 00:05
Show Gist options
  • Save MasayukiFukada/60120a49b9cbf5f84c93 to your computer and use it in GitHub Desktop.
Save MasayukiFukada/60120a49b9cbf5f84c93 to your computer and use it in GitHub Desktop.
Scheme(Gauche)でマイナンバーのチェックデジットを計算する ref: http://qiita.com/X___MOON___X/items/70b81090beb003534cd8
(use gauche.sequence)
;; マイナンバーのチェック計算
;; dataPair = ("11桁の数値文字列" . チェックデジット)
(define (calculateMyNumber dataPair)
;; チェックデジットの判定
(define (judgeDigit modValue checkDigit)
(cond ((= modValue 0) (= checkDigit 0))
((= modValue 1) (= checkDigit 0))
(else (= checkDigit (- 11 modValue))) ))
;; Pn * Qn を返す
(define (getPn*Qn pn n)
(if (< 6 n)
(* pn (- n 5))
(* pn (+ n 1))))
(judgeDigit (mod (fold + 0 (map-with-index (lambda (n x) (getPn*Qn (digit->integer x) (+ n 1)))
(reverse (string->list (car dataPair)))))
11)
(string->number (cdr dataPair))))
;; 妥当な形式か(数値文字列か、桁数は正しいか)?
(define (validMyNumber? value)
(if (string? value)
(if (= (string-length value) 12)
(string->number value)
#f)
#f))
(define (verifiMyNumber numberString)
(if (validMyNumber? numberString)
(calculateMyNumber ((lambda (value)
(cons (substring value 0 11)
(substring value 11 12)))
numberString))
#f))
(for-each (lambda (x) (print x " : " (verifiMyNumber x)))
'("123456789010"
"123456789011"
"123456789012"
"123456789013"
"123456789014"
"123456789015"
"123456789016"
"123456789017"
"123456789018"
"123456789019"
"023456789013"))
123456789010 : #f
123456789011 : #f
123456789012 : #f
123456789013 : #f
123456789014 : #f
123456789015 : #f
123456789016 : #f
123456789017 : #f
123456789018 : #t
123456789019 : #f
023456789013 : #t
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment