Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

Re^2: Drunk on golf: 99 Bottles of Beer

by eyepopslikeamosquito (Canon)
on May 29, 2011 at 21:16 UTC ( #907242=note: print w/ replies, xml ) Need Help??


in reply to Re: Drunk on golf: 99 Bottles of Beer
in thread Drunk on golf: 99 Bottles of Beer

In the middle of the night it occurred to me that a further stroke can be shaved by changing the terminating regex from /, 99.*\n\n/ to /, 99\D+/, producing the following 161 stroker:

/s/until@c=(@b=(++$n,bottle.$&,of,beer),on,the,wall),s/^/Take one down + and pass it around, @c. @c, @b. /,/, 99\D+/;print$'."Go to the store and buy some more$&"
The same trick can be applied to Ruby also.


Comment on Re^2: Drunk on golf: 99 Bottles of Beer
Select or Download Code
Re^3: Drunk on golf: 99 Bottles of Beer
by eyepopslikeamosquito (Canon) on Jun 03, 2011 at 12:48 UTC

    After applying the new terminating regex to Ruby via the following 175 stroker:

    n=0;~/s/ until/, 99\D+/=~$_="Take one down and pass it around, #{c=n+= +1," bottle#$& of beer"," on the wall"}. #{c}, %s%s. #$_"%c;puts$'+"Go to the store and buy some more"+$&
    I could not restrain myself from trying to reduce it further. Two eyesores that I found extremely annoying were:
    • The space between the ~/s/ and until.
    • The n=0; initialization, which is not needed in Perl.
    Can anything be done about them? To get rid of the wretched space, I tried reorganizing via:
    n=0;$_="Take one down and pass it around, #{~/s/;c=n+=1," bottle#$& of + beer"," on the wall"}. #{c}, %s%s. #$_"%c until~/, 99\D+/;puts$'+"Go to the store and buy some more"+$&
    Still a space before the until and still 175 strokes. Rats. Chanting Eugene's "can't possibly work, try it anyway" mantra, I changed ~/, 99\D+/ to /, 99\D+/ and it worked! Though it now emits a "warning: regex literal in condition" message to stderr, that does not matter to codegolf. Another stroke shaved. Not as I intended, but no matter. Only one more needed to catch flagitious.

    What about the n=0; initialization? At this point, I remembered the Roman to Decimal challenge, where I was able to avoid an initialization by hijacking the $. variable. Indeed, if you want a numeric variable initialized to a known value, that is the only built-in variable Ruby makes available. Given my program is four lines in length, $. is initialized to the value four. So I scribbled this down during my lunchtime walk to Neutral Bay today:

    n=0;n+=1 4-$.-=1
    Hmmm, well that's clearly one stroke less. But will it work? Or will Ruby complain when the $. "line number" becomes negative? Nope, not a whimper about a negative line number. So, much to my surprise, I've now tied flagitious for the Ruby lead on 173 strokes:
    $_="Take one down and pass it around, #{~/s/;c=4-$.-=1," bottle#$& of +beer"," on the wall"}. #{c}, %s%s. #$_"%c until/, 99\D+/;puts$'+"Go to the store and buy some more"+$&

    Update: an alternative 173 using Ruby symbols:

    $_="Take one down and pass it around, #{c=4-$.-=1," bottle#{c&&:s} of +beer"," on the wall"}. #{c}, %s%s. #$_"%c until/, 99\D+/;puts$'+"Go to the store and buy some more"+$&

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://907242]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (11)
As of 2014-09-01 13:05 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite cookbook is:










    Results (10 votes), past polls