7 ms·
For loops help - comp.lang.c
- edge17 16y agofunny... though that was easier to read and less obfuscated and hideous than code i've encountered in real life.
- donaq 16y agoThat's just cruel. Very clever, though.
- mseebach 16y agoA bit, perhaps. But the guy asking the question is clearly just offloading his homework to a newsgroup, which is also rude.
- rick_2047 16y agoRude, No. Lazy, yes.
- seabee 16y agoHow is telling a group "I have made no effort to do this task, can you guys do this for me" not rude?
- rick_2047 16y ago> 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 16y agoThe 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 16y agoHis "C: The Complete Reference" textbook? http://news.ycombinator.com/item?id=1339884 http://news.ycombinator.com/item?id=1339884 :)
- Silhouette 16y agoAh, 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.
- kabdib 16y agoPerhaps the key is "ASAP" -- he waited until the last minute, then realized he was in trouble with a deadline. Programming takes time as well as understanding and effort. [I always finished my assignments early. I learned not to mention this, because I was beset with demands of the "help me with this" nature, where the people needing help really just needed to do the work. Of course, towards the end of the semester, with a week left and three projects remaining and a /really/ loaded mainframe -- a Univac 1108 in my case -- with turnarond time measured in hours, well, this was beyond pathetic or poignant, it was simple stupidity for them to expect that they could do that much work in so little time.]
- donaq 16y agoTrue, true. The response falls somewhere between ignoring him and telling him to run "del ." in C: in terms of cruelty.
- helium 16y agoIt's not cruel at all. If the Japanese guy could understand that program, he would have no need to do the C++ course anymore.
- mahmud 16y agoI am a C programmer and could work through that code with a bit more effort than code I have maintained. However, I have seen some C++ code that baffled me more than this ever would. C++ != trivially obfuscated C.
- ubernostrum 16y agoNow I'm just waiting for someone to post a Perl version shaped like a camel.
- mst 16y agoHm. 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 ...
- tlrobinson 16y agoMostly 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 16y agoThe 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+%2B+y+%3C+14+%26%26+y+%3C+x+%2B+6+%26%26+y+%3E+x+-+5+ http://www.wolframalpha.com/input/?i=x+%2B+y+%3E+3+%26%26+x+...
- Oatmeat 16y agoThe program is drawing on a grid 9 wide by 10 high. The loop is going over each space in this grid. It puts a * in each cell that falls within the equations described by the four inequalities. Here's a slightly more simplified version. int putchar ( int ) ; int main ( void ) { int z; int width = 9; int height = 10; for (z = 0; z < width * height; z++) { int x = z % width; int y = z / width; putchar ( x + y > 3 && /* top left */ x + y < 14 && /* bottom right */ y < x + 6 && /* bottom left */ y > x - 5 /* top right */ ? '*' : ' ' ); if (x == width - 1) putchar ( '\n' ); }; putchar ( '\n' ) ; return 0; } It would be clearer to separate the main loop into nested loops for x and y, but I've left it as is to show a closer resemblance to the previous version. The fun part is that you can now play with the various settings. Try increasing the height and width and scaling the equations appropriately. Replace x by 2 * x or x * x for more interesting shapes. You can bound the picture by any equations you like. Example: http://ideone.com/53Qh3 http://ideone.com/53Qh3
- jf 16y agoIf you're too lazy to compile it yourself, you can run the code online: http://ideone.com/QKQG6 http://ideone.com/QKQG6
- kuszi 16y agoThanks!
- confoocious 16y agoBleh. Perl + Acme::EyeDrops >> * Nice try though.
- n2linux 16y agoThere goes the rest of my morning...
- domdefelice 16y agoThis is too funny xD
- yurifury 16y agoThat wasn't helpful at all!
- telemachos 16y agoI 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 16y agogo from 0 to A.E. Housman Piqued. Lessee, http://en.wikipedia.org/wiki/Alfred_Edward_Housman 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 16y agoOnce 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 16y agoThanks 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 http://en.wikiquote.org/wiki/Alfred_Edward_Housman , and here http://www.lrb.co.uk/v29/n13/frank-kermode/nothing-for-ever-and-ever http://www.lrb.co.uk/v29/n13/frank-kermode/nothing-for-ever-... (Also, a passing appreciation by Chesterton, a guide I trust, here http://wikilivres.info/wiki/Autobiography_%28Chesterton%29/Chapter_XIII http://wikilivres.info/wiki/Autobiography_%28Chesterton%29/C...)
- RyanMcGreal 16y agoA 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 16y agoI 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 16y agoHere, 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 16y agoParameterized! 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 16y agoI have made a version of that myself just before posting here, but I made n be width, not the height. Still an interesting solution.
- joss82 16y agoSlightly shorter: print '\n'.join([" "abs(4-i) + ""(9-abs(8-i2)) for i in range(9)])
- BoppreH 16y agoThat actually doesn't do the trick because there is only one line 9 asterisks wide when it should be two. I don't think you can accomplish this replacing max/min with any combination of abs.
- moron4hire 16y agoRegardless 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?
- DCoder 16y agoThere's just so many times you can direct people to http://www.catb.org/~esr/faqs/smart-questions.html http://www.catb.org/~esr/faqs/smart-questions.html without losing your sanity. I spent several years trying to help people on a specific topic and eventually gave up because the stream of people who haven't put their brain to use before asking was reaching 90%. And that's on a niche topic, I don't even want to know how much more noise common topics get, and I have great respect for people like Heathfield for not giving up.
- Silhouette 16y ago> 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.
- johnohara 16y agoThis 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 16y agoExactly. 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 16y agoNot rude, but has waaaay too much time on his hands!
- cabalamat 16y ago> It is literally one of those defining problems that separates those who are serious from those who are not. It's up there with FizzBuzz; anyone who can't do it simply isn't up to being a programmer.
- huherto 16y agoA 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
- eru 16y agoYou could have a look at the "Frequently Questioned Answers" (http://yosefk.com/c++fqa/ http://yosefk.com/c++fqa/). But that will probably produce more frustration with C++ than it helps..
- xenthral 16y agoOne of the things you want to hit up right away after you get reacquainted is the boost library: http://www.boost.org/ 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 16y agoWhat 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 16y agoWow, 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 16y agoNot 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 16y agoNobody's yet mentioned the poster's very first mistake -- asking for help with C++ in a C newsgroup.