僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。
ついでに一部を省略。
(defun ncdr(lat) () (numfilter (cdr lat))) (defun numfilter (lat) (cond ((null lat) nil) ((numberp (car lat)) (ncdr lat)) (t (cons (car lat) (ncdr lat))))) (numfilter '(1 2 a b c 3 d 5)) (a b c d)
今度は数字の方を。
(define atom? (lambda (n) (and (not (pair? n)) (not (null? n))))) (define SREC (lambda (l) (strfilter* (cdr l)))) (define strfilter* (lambda (l) (cond ((null? l) '()) ((atom? (car l)) (cond ((number? (car l)) (cons (car l) (SREC l))) (else (SREC l)))) (else (cons (strfilter* (car l)) (SREC l))))))
(strfilter* '(10 (21 (a 32) bb) ccc 43 dddd)) gosh> (10 (21 (32)) 43)
...が少し面白かった。0の出る確率が他よりずっと 高い(間違いを見逃しやすい...は、もう少し先にある話のようだけど) ということをちょっと試す。
#!/usr/bin/env python import random random.seed() example = random.randint(10000000000, 99999999999) numlist = [] for x in range(1,12): numlist.append( (example % (10**x))/(10**(x-1))) checkdigit = \ 11 - (\ numlist[0]*2 + \ numlist[1]*3 + \ numlist[2]*4 + \ numlist[3]*5 + \ numlist[4]*6 + \ numlist[5]*7 + \ numlist[6]*2 + \ numlist[7]*3 + \ numlist[8]*4 + \ numlist[9]*5 + \ numlist[10]*6) \ % 11 if checkdigit >= 10: checkdigit = 0 print checkdigit
で、1000回繰り返して頻度確認。
細かいところで間違ってる可能性は後で(多分確認しない)。
Core i5 2.4GHzの8GBで22秒ほどかかった。
$ for x in `seq 1000`
> do
> python checkdigit.py
> done |
> sort | uniq -c | sort -nr | cat -n
1 190 0
2 109 9
3 100 1
4 99 2
5 96 8
6 86 7
7 85 4
8 81 6
9 79 5
10 75 3
リンクはご自由にどうぞ。でもURLや内容が変った場合はあしからず。