Your skill will accomplishwhat the force of many cannot PerlMonks

### Re^3: Perl Golf Ethics

by eyepopslikeamosquito (Chancellor)
 on Jan 03, 2007 at 03:26 UTC ( #592689=note: print w/replies, xml ) Need Help??

in reply to Re^2: Perl Golf Ethics

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.

Replies are listed 'Best First'.
Re^4: Perl Golf Ethics
by petdance (Parson) on Jan 03, 2007 at 04:50 UTC
Your assessment of my concerns as "sour grapes" and "rubbish" is noted.
Your assessment of my concerns as "sour grapes" and "rubbish" is noted.

Basically what you've been claiming, boasting I'd dare to say, in all this thread is that you had been playing under "higher ethical rules", implicitly suggesting that searching for previous golf competitions and solutions would be "unethical": a misunderstood conception of ethicity. Actually, following the same line of reasoning we should never read books or try to learn or exercise or train, but just try to be as clever as possible. Not a wrong thing in and of itself, but cleverness doesn't grow out of nothing. Maybe we should not teach kids ho to do sums, but challenge them and see if they discover by themselves. Maybe we should not teach students e.g. the Theory of Ordinary Differential Equations, but challenge them and see if they discover by themselves.

Fortunately, we "live on the shoulders of giants": we have a huge heritage from the past. Avoiding to take advantage of that doesn't sound as particularly smart nor "ethical". Granted, some kids who happen to be extremely gifted do rediscover things before they are taught to them. Just as you may rediscover some golfing technique while challenging your coding skills. Of course Perl Golf is only a minor aspect of human culture, but the same rules apply: the truth is that however clever they are, people just have to study and apply. Indeed I bet that even some of the wonderfully skilled golfers who took part to this thread didn't become such out of the blue, but out of study and application. And study and application in this context may mean to do searches and/or "being in-the-know".

To prevent your next move, I guess you'll make me notice that things are different in this case because we're talking about a competition. To which in turn I answer with another question: so an athlete preparing for a competition should not take advantage of prior art in training for similar competitions?!? That plainly doesn't make sense to me, just as most of your complains and concerns. Matters would be quite different if previous knowledge were not publicly available, in which case to uncover it would require to break some sort of protection. (And would raise the question of ethicity on part of the person holding it, for not sharing it for the advancement of the art and retaining it for exclusive personal advantage, but that's a whole another story.)

Create A New User
Node Status?
node history
Node Type: note [id://592689]
help
Chatterbox?
 [ovedpo15]: how to check with regex that string has ",0" (notice the comma) but it 0 is the last char. for example: "hey,0" = good, "a,0" = good, "a,01" = bad, "hey,010101" = bad [ovedpo15]: also "hey,010" is bad. only ",0 *end of string*"

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (4)
As of 2018-03-20 07:40 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
When I think of a mole I think of:

Results (248 votes). Check out past polls.

Notices?