>> Write a program that prints the numbers from 1 to 121. But for
>> multiples of three print "Fizz" instead of the number and for the
>> multiples of five print "Buzz". For numbers which are multiples of
>> both three and five print "FizzBuzz". For numbers which are multiples
>> of seven, print "Zoom". For numbers which are multiples of three and
>> seven, print "FizzZoom". For numbers which are multiples of five and
>> seven, print "BuzzZoom". For numbers which are multiples of three,
>> five and seven, print "FizzBuzzZoom".
>
>This seems like a messy specification to me, and also an incorrect or
>ambiguous one, since (e.g.) for n=15 it allows printing "Fizz Buzz
>FizzBuzz".
That supposed ambiguity is already there in the original
specification. It still seems that everybody interpreted it in the
same way, following the following rule: Apply the most specific rule
of those given. And actually this specific rule is necessary, because
otherwise there would be an ambiguity about what happens for numbers
divisible by three and by five; should we apply the three-rule, the
five rule, first three, then five or first five, then three. And I
guess that's why you spelled out every case of this kind explicitly in
your incomplete extension of the specification, too.
>Here's another attempt:
>
> Write a program that prints the numbers from 1 to 120 (inclusive) in
> FBZ (Fizz-Buzz-Zoom) notation, one per line. For a natural number n
> that is coprime to 3, 5, and 7, the FBZ notation for n is the same as
> the decimal representation of n. For other natural numbers n, the
> FBZ notation for n is the concatenation of the F, B, and Z notations
> for n. The F notation for natural n is the string "Fizz" if n is a
> multiple of 3, otherwise it is the empty string. The B notation for
> natural n is the string "Buzz" if n is a multiple of 5, otherwise it
> is the empty string. The Z notation for natural n is the string
> "Zoom" if n is a multiple of 7, otherwise it is the empty string.
>
>That is also a messy spec, but most ways I see to clean it up involve
>introducing more machinery that in other ways makes it worse.
It's also longer (10 lines instead of 8), more complicated and harder
to understand. Let's see what program follows naturally from it:
: fbz ( -- )
121 1 ?do
cr i 3 mod 0<> i 5 mod 0<> i 7 mod 0<> and and if
i .
else
i 3 mod 0= if ." fizz" then
i 5 mod 0= if ." buzz" then
i 7 mod 0= if ." zoom" then
then
loop ;
>Anyway, as someone in the earlier clf thread mentioned, it's an
>interview question rather than a "program from spec" problem. In that
>situation, some ambiguity can be a good thing since it lets you see the
>candidate's approach to resolving it.
Not in this case, because the interviewer was interested in
correctness. I also don't think that ambiguity lets you see a
candidates approach any better than non-ambiguity.
>Even with a formal spec, it's still appropriate to identify the patterns
>inherent in the spec and reflect them in the code.
If the point of the example is correctness (as in the original
example), staying close to the spec is a good idea, as it reduces the
opportunities for mistakes. If the goal is to have the solution fast,
staying close to the spec is also a good idea. If the point of the
example is to produce small or efficient code, then one should also
consider other approaches.
Concerning the goal of future-proofing the program, I find that hard
for a contrived problem; you contrive one extension of the problem,
but someone else might contrive a completely different one, and there
is no way to predict which contrived extension is more probably.
Besides, future-proofing is not the Forth way:-).