Kan bidra med en version i Lisp(Allegro) som vi hade i uppgift i skolan någon gång för att ta ut personnummer:
; Kontrollerar om ett personnummer är korrekt
(defun kontrollera-pnr(l)
(= (kontrollsiffra l ) (hämtasiffra (summera (multiplicera l '() 2)))))
; Multiplicerar en lista med omväxlande 1 och 2
(defun multiplicera(l newlist tal)
(cond
((= (length l) 1) newlist)
(t (multiplicera (rest l) (append newlist (list (* tal (first l)))) (byttal tal)))))
; Summerar en lista
(defun summera(l)
(if (endp l) 0
(+ (split (first l)) (summera (rest l)))))
; Hämtar kontrollsiffran efter uträkning
(defun hämtasiffra(tal)
(if (= (ental tal) 0) 0
(- (* (+ (tiotal tal) 1) 10 ) tal)))
(defun byttal(n) ;Byter ett tal till 1 om det är 2 eller 2 om det är 1
(if (= n 1) 2
1))
(defun kontrollsiffra(l)(first (last l))) ; Hämtar kontrollsiffran
(defun split(tal) ( + (ental tal) (tiotal tal))) ; Delar upp tvåsiffriga tal
(defun ental(tal) (mod tal 10)) ; Tar ut entalsiffran
(defun tiotal(tal) (truncate (/ (mod tal 100) 10))) ; Tar ut tiotals siffran
; Om tredje siffran är ojämn=man jämn=kvinna
(defun kon-pnr(l)
(if (oddp (second (reverse l))) 'man
'kvinna))