[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