ocaml: phase 5.1 luhn.ml baseline (Luhn check-digit, 2/4 inputs valid)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 27s

Walks digits right-to-left, doubles every other starting from the
second-from-right; if a doubled value > 9, subtract 9. Sum must be
divisible by 10:

  let luhn s =
    let n = String.length s in
    let total = ref 0 in
    for i = 0 to n - 1 do
      let d = Char.code s.[n - 1 - i] - Char.code '0' in
      let v = if i mod 2 = 1 then
        let dd = d * 2 in
        if dd > 9 then dd - 9 else dd
      else d
      in
      total := !total + v
    done;
    !total mod 10 = 0

Test cases:
  '79927398713'        valid
  '79927398710'        invalid
  '4532015112830366'   valid (real Visa test)
  '1234567890123456'   invalid
  sum = 2

Tests right-to-left index walk via 'n - 1 - i', Char.code '0'
arithmetic for digit conversion, and nested if-then-else.

75 baseline programs total.
This commit is contained in:
2026-05-09 15:42:01 +00:00
parent 5b38f4d499
commit 07de86365e
3 changed files with 31 additions and 0 deletions

View File

@@ -35,6 +35,7 @@
"fizzbuzz.ml": 57,
"flatten_tree.ml": 28,
"list_ops.ml": 30,
"luhn.ml": 2,
"mat_mul.ml": 621,
"max_path_tree.ml": 11,
"mod_inverse.ml": 27,

View File

@@ -0,0 +1,20 @@
let luhn s =
let n = String.length s in
let total = ref 0 in
for i = 0 to n - 1 do
let d = Char.code s.[n - 1 - i] - Char.code '0' in
let v = if i mod 2 = 1 then
let dd = d * 2 in
if dd > 9 then dd - 9 else dd
else d
in
total := !total + v
done;
!total mod 10 = 0
;;
(if luhn "79927398713" then 1 else 0)
+ (if luhn "79927398710" then 1 else 0)
+ (if luhn "4532015112830366" then 1 else 0)
+ (if luhn "1234567890123456" then 1 else 0)

View File

@@ -407,6 +407,16 @@ _Newest first._
binary search tree (`type 'a tree = Leaf | Node of 'a * 'a tree *
'a tree`) with insert + in-order traversal. Tests parametric ADT,
recursive match, List.append, List.fold_left.
- 2026-05-09 Phase 5.1 — luhn.ml baseline (Luhn check digit, 2/4
inputs valid). Walks digits right-to-left, doubles every other
starting from the second-from-right; if doubled value > 9
subtract 9. Sum must be divisible by 10. Tests:
79927398713 ✓ valid
79927398710 ✗
4532015112830366 ✓ valid (real Visa test number)
1234567890123456 ✗
Sum = 2. Tests right-to-left index walk + Char.code '0' arithmetic
+ nested if-then-else. 75 baseline programs total.
- 2026-05-09 Phase 5.1 — triangle.ml baseline (Pascal-shape min path
sum, 2+3+5+1 = 11). Bottom-up DP over the triangle:
2