http://www.perlmonks.org?node_id=847944


in reply to Re^2: Counting positive numbers
in thread Counting positive numbers

I don't believe it can be done "legitimately" in six strokes. Only by "cheating". I have no experience of spoj competitions, but it looks like solutions are accepted automatically by a robot referee (i.e. without a human checking each submitted solution for correctness). With this sort of automated judging, part of the game (lamentably IMHO) is finding a way to trick the robot into accepting an invalid solution. In the past, cheating has been common at codegolf sites with automated judging. For example:

In your spoj game, one (bizarre) rule that may be exploitable is:

Score equals to size of source code of your program except symbols with ASCII code <= 32.
Why on earth would they make such an arbitrary rule? This is not true golf IMHO. It's also possible there are bugs in their robot referee or test program for this particular game (e.g. a poor or very small set of fixed test data) which may be exploited. But, to me, this sort of activity is not really golf anymore; it's more akin to finding exploits to hack into web sites.

Replies are listed 'Best First'.
Re^4: Counting positive numbers
by Young Monk (Novice) on Jul 04, 2010 at 08:15 UTC

    After a little googling, i found that those top scoring guys have actually exploiting the "<33 ASCII not counted as character" condition to get a very high(low, actually) score...!

    Take a look

    Im wondering, how can u compress a perl program into characters with ASCII <33 such tat the latter still works???

      It seems to me you'll need to invent an encoding scheme and build the required "normal" program string from a string consisting of characters in the ord range 0-32 ... then use Perl's eval function (or perhaps s///ee) to evaluate it.

      This looks like a tricky problem to me, especially for a Perl novice. Many approaches are possible. One way to get started is to use the s/// and the y/// operators with a delimiter less than ord(32) like so:

      s^Z^Z^A^B^C^D^E^F^G^H^Z; y^Z^A^B^C^D^E^F^G^H^Za-z^Z; print
      where ^A to ^Z above are CTRL-A to CTRL-Z (i.e. chars with ord 1..26). Running the little test program above produces:
      abcdefgh
      You may be able to extend this scheme to produce whatever 30 or so characters are required by a "normal" (unencoded) solution. Having generated the required program string, you could replace the print above with eval. That would seem to yield a solution of around 11 "characters" in length. If you start down this road, you may find further inspiration as you try out ideas.

      Some old nodes from mtve might provide further ideas you could try:

      Most likely this is a golfed version of Acme::Bleach. But doing something like that in 6 characters still seems hard...