
For loops help - comp.lang.c - awa
https://groups.google.com/group/comp.lang.c/msg/e105e5d339edec01?pli=1
======
tlrobinson
Mostly deobfuscated:

    
    
        int putchar ( int ) ;
    
        int main ( void )
        {
            int z ;
            for (z = 0; z < 90; z++)
            {
                putchar (
                    z % 9 + z / 9 > 3 &&
                    z % 9 + z / 9 < 14 &&
                    z / 9 < z % 9 + 6 &&
                    z / 9 > z % 9 - 5 ? '*' : ' ' );
    
                if (!(z % 9 - 9 + 1))
                    putchar ( '\n' );
            };
            putchar ( '\n' ) ;
            return 0;
        }
    

It's too late at night for me to try to simplify that big expression in the
middle...

~~~
mmastrac
The big expression in the middle is effectively unpacking a 2D point encoded
in z. z % 9 is the x coordinate and z / 9 is the y coordinate:

    
    
      x = z % 9;
      y = z / 9;
    
      putchar (
              x + y > 3 &&
              x + y < 14 &&
              y < x + 6 &&
              y > x - 5 ? '*' : ' ' );
    
      if (x == 8)
        putchar ( '\n' );
    
    

Wolfram Alpha plots this inequality nicely:

[http://www.wolframalpha.com/input/?i=x+%2B+y+%3E+3+%26%26+x+...](http://www.wolframalpha.com/input/?i=x+%2B+y+%3E+3+%26%26+x+%2B+y+%3C+14+%26%26+y+%3C+x+%2B+6+%26%26+y+%3E+x+-+5+)

------
johnohara
This problem appears in the Deitel and Deitel book "C++ How to Program" as
well as in their Java book.

It's a great exercise that challenges CS students every year and does a very
good job at teaching nested loops.

Later in the same set of exercises is the four triangles problem that ties
increment and decrement operators to the use of nested loops. It's one of my
personal favorites.

CS students who legitimately complete these exercises always do well with
chapter 4 (Arrays, Simpletron), chapter 5 (pointers) and chapter 6 (structs
and classes) and come away with insight and a sense of confidence that echoes
for a long time.

It is literally one of those defining problems that separates those who are
serious from those who are not.

The responder at comp.lang.c knew that. Kudos to him.

~~~
kmt
Exactly. I'm surprised to see many people here saying that the responder was
unhelpful or rude. I think that the answer was not only fascinating but also
responsible, pedagogical and, in a way, even compassionate.

~~~
cabalamat
Not rude, but has waaaay too much time on his hands!

------
telemachos
I subscribed to comp.lang.c for a few months about two years ago when I was
taking a course on C. Like a lot of older or more high-volume lists, the
regulars are complete characters. Small battles over minor points of style go
from 0 to A.E. Housman in no time at all. (If the Housman reference is too
odd, substitute Erik Naggum.)

I eventually quit the list because it was too much of a time suck, but it's
well worth a half a day swimming through the archives. Heathfield's posts are
almost always worth a look.

~~~
ableal
_go from 0 to A.E. Housman_

Piqued. Lessee, <http://en.wikipedia.org/wiki/Alfred_Edward_Housman> ...
_colleagues were unnerved by his scathing critical attacks ... they "were
often savage in the extreme."_

Also, for other reasons: _A fellow don described him as being "descended from
a long line of maiden aunts"._

~~~
telemachos
Once upon a time, I was a Classics student, and even in the 1980s and 1990s,
people still got a lot of mileage out of Housman stories and quotations. (He
died in 1936.)

Apparently, after he died, they found notebooks in his office that he had
filled with long elaborate, witty, hurtful insults -- aimed at nobody in
particular. When he wrote a review, he would tweak the pre-fab insults as
needed and voila. A sick, twisted person, but fascinating. (If you're _really_
curious, check out Tom Stoppard's _The Invention of Love_.)

~~~
ableal
Thanks for the pointer. I tried desultorily to get a (net-)look at the Gow
text, but no dice. I'll have to leave it to some weekend/vacation time to
chase sources.

It's curious that the A.E.H. vinegar does not get wider circulation. My copy
of Matthew Parris' Scorn only features a couple of harmless barbs (one the
'malt/Milton' line). There are some scraps over at
<http://en.wikiquote.org/wiki/Alfred_Edward_Housman> , and here
[http://www.lrb.co.uk/v29/n13/frank-kermode/nothing-for-
ever-...](http://www.lrb.co.uk/v29/n13/frank-kermode/nothing-for-ever-and-
ever)

(Also, a passing appreciation by Chesterton, a guide I trust, here
[http://wikilivres.info/wiki/Autobiography_%28Chesterton%29/C...](http://wikilivres.info/wiki/Autobiography_%28Chesterton%29/Chapter_XIII))

~~~
gursikh
"Nature, not content with denying to Mr — the faculty of thought, has endowed
him with the faculty of writing."

The name was left blank in the original, but was intended to be filled in and
used when a suitable subject should turn up.

------
ubernostrum
Now I'm just waiting for someone to post a Perl version shaped like a camel.

~~~
mst
Hm. Or I could take the obsfucated C version, dump it into an Inline::C block
and then run it through Acme::EyeDrops. Then we could have a C version shaped
like a camel. I am, however, far too tired to actually do so - anybody more
awake is welcome to steal the idea ...

------
jf
If you're too lazy to compile it yourself, you can run the code online:
<http://ideone.com/QKQG6>

~~~
kuszi
Thanks!

------
RyanMcGreal
A one-line solution in Python:

    
    
        print '\n'.join(['%s%s%s' % (' '*((9-step)/2), '*'*step, ' '*((9-step)/2)) for step in [1, 3, 5, 7, 9, 9, 7, 5, 3, 1]])
    

Not diamond shaped, but moderately obfuscated.

~~~
BoppreH
I think the hardest part of the problem is defining the formula that generates
the number (or position) of asterisks at each line.

And you hard-coded it in a list. I consider this cheating.

~~~
BoppreH
Here, a one-liner that makes its own calculations:

    
    
      print '\n'.join(max(4-i, i-5)*' ' + (min(i, 9-i)*2+1)*'*' for i in range(0, 10))
    

Edit: shaved off a few more characters and somehow made it _slightly_ clearer.
I _would_ make it diamond shaped, but python will whine because of "invalid
indentation".

~~~
paulbaumgart
Parameterized!

    
    
      def d(n): return '\n'.join(int(max((n-1)/2-i,i-n/2))*' '+(min(i,n-1-i)*2+1)*'*' for i in xrange(0,n))

~~~
BoppreH
I have made a version of that myself just before posting here, but I made _n_
be width, not the height. Still an interesting solution.

------
donaq
That's just cruel. Very clever, though.

~~~
mseebach
A bit, perhaps. But the guy asking the question is clearly just offloading his
homework to a newsgroup, which is also rude.

~~~
rick_2047
Rude, No. Lazy, yes.

~~~
seabee
How is telling a group "I have made no effort to do this task, can you guys do
this for me" not rude?

~~~
rick_2047
_> I'm having a hard time writing a code for this one. I tried several

> times, but I can't get it to work properly. I live in Japan and I take

> an online C++ course. The instructor lives in the US so whenever I am

> awake, he's asleep. Therefore, I cannot contact him directly when I

> need help. I have to get this program up and running ASAP. I tried

> searching everywhere for help, but there's none except for this group.

> My textbook isn't much of a help either. I WILL GREATLY APPRECIATE THE

> HELP I WILL GET! _

This is what he said. And trust me I have seen people struggle with writing a
function to add two numbers after taking a college course of 1 year in C. I
don't think he didn't try at all.

~~~
mseebach
The way he presents the problem gives no point of reference for a nice person
to say "oh, I see where you misunderstood what foo does" and make it a
learning experience. He could, for example, have included one of the several
some-what working attempts.

The only "good" answers to such a request are a: here's the code and b: lesson
one, here's how a for-loop works. Since his textbook doesn't help, option b
doesn't seem viable.

Rude, lazy, it's a fine line, I suppose. Being lazy in front of strangers
you're asking for help is perhaps not rude, but doesn't exactly scream for a
super-constructive response.

~~~
stralep
His "C: The Complete Reference" textbook?

<http://news.ycombinator.com/item?id=1339884>

:)

~~~
Silhouette
Ah, yes. Another little piece of comp.lang.* lore: the expression
"Bullschildt" was not invented for nothing.

See also his annotated version of the official C standard, which at the time
it was published contained not only Schildt's comments but also the complete
text of the standard itself. The standard was available from the international
standards bodies for a small fortune, yet the annotated version was available
in bookshops for a modest fraction of the cost. It was widely speculated that
the difference in price reflected the value added by Schildt's comments.

------
edge17
funny... though that was easier to read and less obfuscated and hideous than
code i've encountered in real life.

------
confoocious
Bleh. Perl + Acme::EyeDrops >> * Nice try though.

~~~
n2linux
There goes the rest of my morning...

------
huherto
A little of topic. I may need to dive back in C++. I knew the language pretty
well (circa 1994), the STL was brand new and namespaces were experimental. I
don't know what happened after that. Can anyone recommend any online resources
to fill the gap? Thanks

~~~
xenthral
One of the things you want to hit up right away after you get reacquainted is
the boost library: <http://www.boost.org/>

If you use it well, it does a lot of heavy lifting, adds a lot of safety and
expressiveness (boost::bind is just pure magic) that just wasn't there before,
and a lot of the boost libraries are going into the standard - and are already
implemented in the TR1 namespace.

------
mkeblx
What percent of HN users could figure this out without using references? I've
been .NET programming for 5+ years and couldn't figure it out giving it a few
hours to try.

------
hernan7
Wow, how do you even begin to write something so obfuscated? Do people do this
by hand, or are there any computer-assisted tools for it? I mean:

    
    
       for( z = 002354l / 000644l / 000132l / 000322l / 000374l ; ...
    

has all the hallmarks of machine-generated code.

~~~
lolcraft
Not really. Almost any numbers would do, since z is an int and integer
division "a/b" in C means not exactly a/b, but its floor. For instance,
"2/2/2".

------
pmiller2
Nobody's yet mentioned the poster's very first mistake -- asking for help with
C++ in a C newsgroup.

------
yurifury
That wasn't helpful at all!

------
moron4hire
Regardless of whether or not the original post was rude is no excuse for a
rude answer. Kindness begets kindness, patience begets patience. We have a
duty to not escalate stuff like this into shit-storms. If the kid didn't post
correctly, then we should answer by asking the right questions to guide him to
the correct question. If you can't do that, then just move along, you don't
need to post.

I remember being that kid. Well, not quite so bad that I literally wanted
someone to write code for me, but I'm sure someone thought my poorly worded
questions were asking people to write code for me. How many kids are we
scaring away because we're being assholes to them?

~~~
Silhouette
> Regardless of whether or not the original post was rude is no excuse for a
> rude answer.

The answer wasn't rude, it was just unhelpful.

For those not familiar with the culture on comp.lang.c and the various related
C and C++ groups, it is very simple: people will generally be helpful in
dealing with homework questions _as long as the asker has made a genuine
effort_.

On the other hand, anyone who just reposts homework verbatim with no effort
whatsoever to solve the problem first is likely to find themselves given a
very clever answer that is technically correct but clearly completely
implausible for a beginner, thus making it very obvious to the teacher that
the person is cheating on their homework. I recall a similar example where
someone asked how to work out factorials in C++, and was presented with a
highly efficient answer... because it used template metaprogramming and
generated that answer at compile time.

This was certainly clear in the related FAQs last time I checked, so anyone
who asks a homework question without making any effort to solve it themselves
is not only lazy but also incapable of following basic netiquette. I doubt
you'd find many regular posters on those groups who had much sympathy, even
though some of those same posters give up a great deal of time to help those
who are making a _genuine_ effort to improve.

~~~
foldr
>The answer wasn't rude, it was just unhelpful.

Being deliberately unhelpful _is_ rude.

------
domdefelice
This is too funny xD

