The Damm algorithm is a checksum algorithm which detects all single digit errors and adjacent transposition errors.



The algorithm is named after H. Michael Damm.



Task

Verify the checksum, stored as last digit of an input.



 
Module Damm_Algorithm{
	Function Prepare {
		function OperationTable {
			data    (0, 3, 1, 7, 5, 9, 8, 6, 4, 2)
			data    (7, 0, 9, 2, 1, 5, 4, 8, 6, 3)
			data    (4, 2, 0, 6, 8, 7, 1, 3, 5, 9)
			data    (1, 7, 5, 0, 9, 8, 3, 4, 2, 6)
			data    (6, 1, 2, 3, 0, 4, 5, 9, 7, 8)
			data    (3, 6, 7, 4, 2, 0, 9, 5, 8, 1)
			data    (5, 8, 6, 9, 7, 2, 0, 1, 3, 4)
			data    (8, 9, 4, 5, 3, 6, 2, 0, 1, 7)
			data    (9, 4, 3, 8, 6, 1, 7, 2, 0, 5)
			data    (2, 5, 8, 1, 4, 3, 6, 7, 9, 0)
			=array([])
		}
		Digits= Lambda (d) ->{
			d$=str$(d,"")
			for i=1 to len(d$)
				data val(mid$(d$,i,1))
			next
			=Array([])
		}
		=Lambda a()=OperationTable(), Digits  (N) -> {
			dim b()
			b()=Digits(N)
			m=0
			for i=0 to len(b())-1
				m=a(m)(b(i))
			next i
			=m
		}
	}
	Damm=Prepare()
	Data 5724, 5727, 112946, 112940
	while not empty
		over  ' double the top of stack
		over
		Print number, Damm(number),  Damm(number)=0
	End While
}
Damm_Algorithm
 