[chbot] New chocolate fish challenge
Stephen Irons
stephen.irons at clear.net.nz
Wed Nov 19 20:22:43 GMT 2014
On 20 November 2014 09:20, Stephen Irons <stephen.irons at clear.net.nz> wrote:
>>
>> At 03:36 p.m. 19/11/2014, you wrote:
>>
>>> I'm building a jumbo LED clock (using 8" 7-segment displays) for the local pool, as I can't read a small analogue clock without my glasses when swimming. The PCBs are on their way from China as I type....
>>>
>>> So here is the challenge. Make a C function that usually returns 0, but returns a value of 1 once in every 60 calls calls - just like this:
>>>
>>> int chocolate_fish(void)
>>>
>>> {
>>>
>>> unsigned counter = 0;
>>>
>>> if(counter == 59) {
>>>
>>> counter = 0;
>>>
>>> return 1;
>>>
>>> }
>>>
>>> counter++;
>>>
>>> return 0;
>>>
>>> }
>>>
>>> Now to make it hard. You can't use any math operations - no addition, subtraction multiplication or division, including the increment/decrement operations.
>>>
>>> Bonus points for using no more static memory than one byte, and code less than 10 lines - with each statement on a line of their own.
>>>
>>> Mike
>>>
>
> (I lost the original message, so have replied to an early response)
>
> I would contend that a comparison is an arithmetic operation: most
> CPUs subtract and compare with zero.
>
> My version assumes that flash (or ROM) is cheap, and RAM is expensive.
> It has a constant array containing the next count value and output
> value. It hides the arithmetic operation in an array de-reference.
>
> -------- 8< --------
> #include <stdint.h>
> #include <stdio.h>
>
> typedef struct
> {
> uint8_t count;
> uint8_t output;
> } state_t;
>
> const state_t states[] =
> {
> { 1, 0 },
> { 2, 0 },
> { 3, 0 },
> { 4, 0 },
> { 5, 0 },
> { 6, 0 },
> { 0, 1 },
> };
>
> state_t counter(void)
> {
> static int count;
>
> state_t next_state = states[count];
> count = next_state.count;
> return next_state;
> }
>
> int main(int argc, char * argv[])
> {
> int i = 0;
> state_t state;
> while (1)
> {
> i += 1;
> state = counter();
> printf("%d %d %d\n", i, state.count, state.output);
> }
> }
>
> -------- 8< --------
>
> The actual counter function is less than 10 lines. The array
> definition *could* be one long line; it is one statement. I'm not sure
> about the typedef.
>
> The typedef could pack both the next count value and the output into
> one byte, and count up to 127.
Of course, this example only counts up to 7; extend the array to count
up to 60...
>
> Please explain why all these restrictions; it will help us to
> understand whether any given implementation meets the restrictions.
>
> Stephen Irons
More information about the Chchrobotics
mailing list