All SolutionsAll Solutions
💶
Euro Counterfeits
Week 44, 2026
Validate, count, print formatted result | greenya | Odin Solutions
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' }
}