Syntactic Confectionery Delight PerlMonks

### Re^2: Perl Golf Ethics

by petdance (Parson)
 on Jan 02, 2007 at 17:47 UTC ( #592593=note: print w/replies, xml ) Need Help??

in reply to Re: Perl Golf Ethics

This node falls below the community's threshold of quality. You may see it by logging in.

Replies are listed 'Best First'.
Re^3: Perl Golf Ethics
by eyepopslikeamosquito (Bishop) on Jan 03, 2007 at 03:26 UTC

To do well at Perl golf, perhaps the most important thing is to unearth the "fundamental insights" into the problem. Some of the fundamental insights of this golf were:

• Rather than calculating a running total, it's shorter and simpler to convert \$_ in place; for example, transform II plus III into 2 + 3. With that done, simply use eval to compute the total.
• The y/IVXLC/XLCDM/ transliteration is a short and sneaky way to multiply by ten.
• You don't need to write two converters: it is sufficient to write an arabic_to_roman() converter. To convert the other way, simply convert 1..3999 into a table or something and do a lookup. I didn't appreciate this at first and foolishly wrote two converters. When I became aware of my blunderific overlook, my score dropped by 40 strokes.
• The shortest way to lookup the number corresponding to a roman numeral is to create a symbolic reference for each roman numeral whose value is the corresponding arabic number. For more fun, a la ton and others, transform, for example, II plus III into \$II  +\$  III and eval that. This is the insight I missed, only trying a hash and a grep lookup.
• You can further eliminate the array of roman numerals by creating a second set of symbolic references mapping negative numbers to roman numerals. Note that for this to work you must use negative numbers, since positive ones (e.g. \$3) are read-only variables used by perl's regex engine. As you might expect, not many of the contestants hit upon this final insight, only ton, Juho, and jojo managing it.
Notice that none of these insights depends on knowing Ton's magic formula. Golfers like Ton have a knack for finding these insights quickly and easily, while I struggle; once I find them, it is a simple matter of golfing technique to whittle down the solution. For me, the hard part is to find them. Using the above insights, a simple solution like this:
```#!perl -pl
map{\$_.=(!y/IVXLC/XLCDM/,I,II,III,IV,V,VI,VII,VIII,IX)[\$&]while s/\d//
+;\$\$_=\$n++}@R=0..3999;
y/mp/-+/;s/\w+/\${\$&}/g;\$_=\$R[eval]
comes in at around 130. You could get down to around 120, again without knowing Ton's magic formula, by whittling the arabic-to-roman converter:
```#!perl -pl
map{y/IVXLC/XLCDM//s//\$&-9?\$&-4?I x\$&:IV:IX/e&s/I{5}/V/while/\d/;\$\$_=\$
+n++}@R=0..3999;
y/m/-/;s/\w+/+\${\$&}/g;\$_=\$R[eval]
To go lower, you'll need to sneak in y/iul-}/-\$+ / somewhere to transform \$_ directly into symrefs (e.g. \$II  +\$  III) that can be directly eval'ed. Doing that allows you to eliminate the s/\w+/\${\$&}/g above. Still further savings are available by replacing the @R array above with a second set of symbolic references, this time mapping negative numbers back to roman numerals.

While I don't fully understand your shortest 186 solution:

```#!perl -pla
%n=I1V5X10L50C100D500M1000=~/(.)(\d+)/g;sub
d{\$#_-=\$z*2*(@_&&\$z<\$_)-(\$z=\$_)for@n{/./g};@_}\$t+=(\$.=/p/-/n/||\$.)*d
for@F;map{\$s.=\$_ x(\$t/d),\$t%=d}M,CM,D,CD,C,XC,L,XL,X,IX,V,IV,I;\$_=\$s
it seems like sour grapes to claim that:
this contest was effectively written for a few people who were in the know, who had seen your magic algorithm, shutting out the rest of us.
As shown above, without knowing Ton's magic algorithm, you could have easily trimmed 60 strokes off your solution by unearthing the fundamental insights into the problem.

Update: oops, changed 4e3 to 3999 (4e3 fails test case "MD plus I") plus minor code improvements. Added extra symbolic reference insight.

A reply falls below the community's threshold of quality. You may see it by logging in.
Re^3: Perl Golf Ethics
by eyepopslikeamosquito (Bishop) on Jan 02, 2007 at 22:04 UTC

Ton's brilliant magic formula won the original roman tournament by only three strokes. It is also worth noting from the fonality golf post mortem that TedYoung (presumably a first time golfer) produced a score of 116.50 before finding Ton's magic formula ... and that a score of 169.51 was enough to win a prize. Also, Jasper, who is part of the Perl golf community, "forgot" about Ton's magic formula, yet was still able to finish in ninth place with a score of 125.

So not knowing this formula did not "shut out" people from winning a prize. Moreover, searching for perl golf (via google and/or SuperSearch) would have uncovered the original perl golf roman numerals game easily enough (as Ted Young did).

Perhaps the rules should have been clarified to state, as Ton says, that golfers are expected to research and learn from prior art and that it is not cheating to do so.

In summary, I do not blame Fonality for this and, despite the prior roman art, the wide range of scores and creative approaches showed that there was a lot of golf played in this competition outside the magic formula.

A reply falls below the community's threshold of quality. You may see it by logging in.
Re^3: Perl Golf Ethics
by shmem (Chancellor) on Jan 02, 2007 at 19:32 UTC

The competition was for golfers and golfer wannabees like me.

I'm a bad golfer. Despite of that, I have been lurking quite some time on #perlgolf on IRC, so maybe that's why I'm "in the know" ;-) ... anyways, for those new to the sport Super Search helps. Searching for "golf book" turns up:

amongst others, which all mention The Perl Golf Book. The algorithm is there, just search the pdf for "roman".

It's not Fonality's fault you didn't see it. (I used it in some entries, got them rejected and thought it was because of thospel's algorithm, and didn't try any further).

--shmem

```_(\$_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
/\_¯/(q    /
----------------------------  \__(m.====·.(_("always off the crowd"))."·
");sub _{s./.(\$e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;\$e.e && print}```
thanks for promoting the book! a small comment, #perlgolf on irc network named IRCNet (not on slashnet, freenode, dalnet, efnet etc).
Re^3: Perl Golf Ethics
by thospel (Hermit) on Jan 02, 2007 at 21:19 UTC
I agree that this was very unfortunate, but let's not try to read too much into it.

From an email exchange I know that the organizers didn't know about that particular very relevant historical golf, so it certainly wasn't intentional. I'm quite sure they would not have chosen this challenge if they had known.

The link to the relevant code was in shmems post in this very thread. You being part of the perlmonks community made that information available to you too.

As the other solutions in that historical golf show, not hitting on the magic method doesn't loose a good golfer more than (order of magnitude) 5 strokes. This might indeed be enough to pass a few people on the scoreboard, but it's in fact less than the average distance between players.

A reply falls below the community's threshold of quality. You may see it by logging in.
Re^3: Perl Golf Ethics
by Solo (Deacon) on Jan 02, 2007 at 18:44 UTC
Well, I imagine there are a lot of communities where being part of that community is worth cash.

There was a cash-paying competition for Perl. Let's agree that more cash for Perl knowledge is a good thing, even if the methods in this case may not meet your standards.

--Solo

--
You said you wanted to be around when I made a mistake; well, this could be it, sweetheart.

Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://592593]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (6)
As of 2022-06-30 01:14 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?