
import stdio

bool divisible3(byte x) = x %% 3 == 0
bool divisible5(byte x) = x %% 5 == 0

struct stage {
    function.byte.to.bool predicate
    pointer text
}

#if ENCODING_NOLOWER
array(stage) stages = [
    stage(divisible3.pointer, "FIZZ"z),
    stage(divisible5.pointer, "BUZZ"z)
]
#else
array(stage) stages = [
    stage(divisible3.pointer, "fizz"z),
    stage(divisible5.pointer, "buzz"z)
]
#endif

void main() {
    byte i, s
    bool printed
    for i,1,to,100 {
        printed = false
        for s,0,until,stages.length {
            if call(stages[s].predicate, i) {
                printed = true
                putstrz(stages[s].text)
            }
        }
        if not(printed) {
            putword(i)
        }
        putchar(' ')
    }
}

