Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.programming > #10278

Re: Long winter evenings

From Richard Heathfield <rjh@cpax.org.uk>
Newsgroups comp.programming
Subject Re: Long winter evenings
Date 2019-11-04 21:51 +0000
Organization Fix this later
Message-ID <qpq6hk$1nl$1@dont-email.me> (permalink)
References <qppnk6$584$1@dont-email.me> <qpq5r8$t8i$1@dont-email.me>

Show all headers | View raw


On 04/11/2019 21:39, David Brown wrote:
> On 04/11/2019 18:37, Richard Heathfield wrote:
>> I have just written a program in C, which for reasons that will remain 
>> shrouded in the mists of wossname I wanted to be as short as possible. 
>> The program solves a highly specific and relatively antiquated problem.
>>
>> Now that the nights are drawing in, some of you might be at a loose 
>> end and wish for something to help you pass the time.
>>
>> So here's the puzzle, which is in two parts:
>>
>> (1) What, *exactly*, does the program do? That is, what is the 
>> significance of the printed result?
> 
> Apart from a "newbie" award at the IOCCC?  I don't know yet.

Oh, it wasn't intended to be obfuscated. (You can try for obfuscated if 
you like - I'm not a genius at it like some of the IOCCC guys, but when 
I'm trying I can generally put three or four levels of obfusc in there 
somewhere.)

> 
>>
>> (2) Is there a way to make the program shorter, without compromising 
>> its rigorous adherence to ISO C90? (See below.)
>>
>> #include <stdio.h>
>> int r(int*c){int f=0;if(*c%5==1)*c/= 5,*c*=4,f=1;return f;}
> 
> Surely "f" can be eliminated and replaced with a tertiary operator 
> expression?
> 
> int r(int*c){return(*c%5==1)?*c/= 5,*c*=4,1:0;}
> 
> And there is a redundant space in "*c/= 5".

Damn! I thought I'd caught them all.

> 
>> int t(int c){int f=1,i;for(i=0;f&&i<5;i++)f=r(&c);return f*!(c%5);}
> 
> The call to "r" could then be inlined
> 
>> int main(void){int n=0,d=0;while(!d)d=t(++n);printf("%d\n",n);return 0;}
> 
> And the call to "t" could be inlined.
> 
> #include <stdio.h>
> int main(void){int 
> n=0,d=0,c,f,i;while(!d){++n;c=n,f=1;for(i=0;f&&i<5;i++)f=(c%5==1)?c/=5,c*=4,1:0;d=f*!(c%5);};printf("%d\n",n);return 
> 0;}
> 
> That's 160 characters, compared to the original 221.

An astonishing reduction. The inlining was the big win - and, bizarrely, 
I moved those bits out to functions because doing so had the effect of 
dramatically *reducing* the size! So it's quite pleasing to see them 
moved back in again and gaining a further reduction in the process.

> And I guess this is cheating too?
> 
> #include <stdio.h>
> int main(void){printf("3121\n;return 0;}

Yes! That is quite definitely cheating! :-)

And I'm surprised at you: puts("3121") is a mere 75% of the size that 
printf("3121\n would be if you'd closed it off properly with ")

The problem with printing 3121 is that it removes the calculation, which 
is intrinsic to establishing what the program is actually for.

>> If nobody gets it within a week or so, I'll post the solution to (1). 
>> (If I could think of a solution to (2), I'd have written it that way 
>> to start with!)
>>
> 
> I still don't know what it does...

Phone home and tell them you'll be late.

-- 
Richard Heathfield
Email: rjh at cpax dot org dot uk
"Usenet is a strange place" - dmr 29 July 1999
Sig line 4 vacant - apply within

Back to comp.programming | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

Long winter evenings Richard Heathfield <rjh@cpax.org.uk> - 2019-11-04 17:37 +0000
  Re: Long winter evenings David Brown <david.brown@hesbynett.no> - 2019-11-04 22:39 +0100
    Re: Long winter evenings Richard Heathfield <rjh@cpax.org.uk> - 2019-11-04 21:51 +0000
      Re: Long winter evenings David Brown <david.brown@hesbynett.no> - 2019-11-05 10:42 +0100
    Re: Long winter evenings Ben Bacarisse <ben.usenet@bsb.me.uk> - 2019-11-04 22:24 +0000
  Re: Long winter evenings Ben Bacarisse <ben.usenet@bsb.me.uk> - 2019-11-04 22:19 +0000
    Re: Long winter evenings Richard Heathfield <rjh@cpax.org.uk> - 2019-11-04 22:30 +0000
      Re: Long winter evenings Ben Bacarisse <ben.usenet@bsb.me.uk> - 2019-11-04 23:59 +0000
        Re: Long winter evenings Richard Heathfield <rjh@cpax.org.uk> - 2019-11-05 01:03 +0000
          Re: Long winter evenings Ben Bacarisse <ben.usenet@bsb.me.uk> - 2019-11-05 04:01 +0000
            Re: Long winter evenings Richard Heathfield <rjh@cpax.org.uk> - 2019-11-05 07:42 +0000
  Re: Long winter evenings Melzzzzz <Melzzzzz@zzzzz.com> - 2019-11-04 23:00 +0000
  Re: Long winter evenings Tim Rentsch <tr.17687@z991.linuxsc.com> - 2019-11-06 04:58 -0800

csiph-web