[Odin] Validate, count, print formatted result[Odin] Validate, count, print formatted result

💶

Euro Counterfeits

Week 44, 2026

package main import "core:fmt" import "core:encoding/json" @rodata Divisions_Json := #load("divisions.json") @rodata Serial_Numbers_Json := #load("serial_numbers.json") main :: proc () { divisions: map [string] Division json.unmarshal(Divisions_Json, &divisions) serial_numbers: [dynamic] string json.unmarshal(Serial_Numbers_Json, &serial_numbers) total_bad: int for sn in serial_numbers { result := validate(sn, divisions) fmt.printfln(Validate_Result_Print_Format[result], sn) if result != .ok do total_bad += 1 } fmt.printfln( "Found %d counterfeit notes from a total of %d notes", total_bad, len(serial_numbers), ) } Division :: struct { printingWorks : string, printingCountry : string, controlCode : int, } Validate_Result :: enum { ok, bad_format, bad_printing_works, bad_checksum, } @rodata Validate_Result_Print_Format := [Validate_Result] string { .ok = "🟢 %s", .bad_format = "🔴 %s - wrong format", .bad_printing_works = "🔴 %s - non-existent printing works", .bad_checksum = "🔴 %s - wrong checksum", } validate :: proc (sn: string, divisions: map [string] Division) -> Validate_Result { if len(sn) != 12 do return .bad_format for r, i in sn { if i<=1 && !is_letter(byte(r)) do return .bad_format if i>=2 && !is_digit(byte(r)) do return .bad_format } div := divisions[sn[:1]] if div == {} do return .bad_printing_works sum := int(sn[1] - 'A' + 2) // A=2, B=3, ... Z=27 for r in sn[2:] do sum += int(r) - '0' for sum > 9 do sum = sum/10 + sum%10 if sum != div.controlCode do return .bad_checksum return .ok is_letter :: proc (b: byte) -> bool { return b>='A' && b<='Z' } is_digit :: proc (b: byte) -> bool { return b>='0' && b<='9' } }