Now that I remember:<div><br></div><div>Hole number 2 was about ordering a sentence by the second character of each word, my solution was:</div><div><br></div><div>sentence.split(' ').sort{ |a, b| a[1] <=> b[1] }.join ' '</div>
<div><br></div><div>It could be shortened into:</div><div><br></div><div>sentence.split(' ').sort_by{ |a| a[1] }.join ' '<br><br></div><div><br><div class="gmail_quote">On 12 May 2011 10:44, James Adam <span dir="ltr"><<a href="mailto:james@lazyatom.com">james@lazyatom.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">I thought that I left with is how we always seemed driven towards<br>
functional rather than procedural solutions. This could just be a<br>
consequence of the particular problems we had to solve, which were<br>
almost all simple input transformations, but I suspect the shortest<br>
solution to any problem would include a lot of functional operations.<br>
They really are powerful.<br>
<br>
In hindsight this seems obvious, but by the end of the evening I was<br>
desperately trying to think of how to save characters by aliasing<br>
`inject` to something, since we used it in almost every single hole.<br>
<br>
Oh, also: a single-letter constant is one character shorter than "-1" :)<br>
<font color="#888888"><br>
- James<br>
</font><div><div></div><div class="h5"><br>
On 12 May 2011 10:41, Aanand Prasad <<a href="mailto:aanand.prasad@gmail.com">aanand.prasad@gmail.com</a>> wrote:<br>
> 1. The (a ? b : c) ternary operator does the expected thing if you chain it<br>
> and leave out parentheses, making it shorter than if/elsif/else, even if it<br>
> looks terrifying:<br>
> s > 3600 ? "more than an hour" : s > 60 ? "more than a minute" : s > 1 ?<br>
> "more than a second" : "GET OUT OF THE WAY"<br>
> 2. a[-1] is 1 character shorter than a.last.<br>
> On Thursday, May 12, 2011 at 10:30 AM, Murray Steele wrote:<br>
><br>
> I think it might be useful to do a bit of a review of things people learned<br>
> while doing rubygolf*.  We didn't have time on the night and it sounds like<br>
> that might have been at good part of the SHRUG meeting.<br>
> I'll start with some snippets that I learned / remembered:<br>
> 1. Enumerable#inject doesn't need a block, it actually takes 2 params, a<br>
> initial value and a symbol as an argument.  Each iteration the symbol is the<br>
> method that'll be called on the accumulator and passed the current element.<br>
>  Also if you don't supply an initial element then it'll use the first<br>
> element of the enumerable.  So you can turn<br>
> array.inject(0) {|s, i| s + i}<br>
> into<br>
> array.inject(:+)<br>
> 2. Procs and Lambdas can be invoked via .[] rather than .call.<br>
> 3. There are millions of ways of defining methods on something.  Luckily,<br>
> the tests don't say that Golf needs to be a class, so we can define Golf as<br>
> a constant and just add methods to it.  So we can turn:<br>
> class Golf<br>
>   class << self<br>
>     def hole1<br>
>       ...<br>
>     end<br>
>   end<br>
> end<br>
> into:<br>
> class << Golf = ''<br>
>   def hole1<br>
>     ...<br>
>   end<br>
> end<br>
> (e.g open up the metaclass of Golf, which happens to be a constant of an<br>
> empty string, rather than a class.  Works because assignment (Golf = '') has<br>
> higher precendence than class-opening-up (class << Golf).<br>
> I tried to shave 1 character by setting Golf to be numbic constant:<br>
> class << Golf = 1<br>
>   def hole1<br>
>     ...<br>
>   end<br>
> end<br>
> But it doesn't work because Fixnums have no metaclass.  Depending on what<br>
> you do to try and add the methods you get various errors like:<br>
> TypeError: no virtual class for Fixnum<br>
> or<br>
> TypeError: can't define singleton method "hole1" for Fixnum"<br>
> I found this surprising, (and I think I've come across it before, and was<br>
> surprised then too) as I always believed the "everything is an object"<br>
> mantra of Ruby, assuming everything was the same under the hood.  Turns out<br>
> that while it's still true that everything is an object, some objects are<br>
> clearly more objecty than others.<br>
> I doubt I'd ever want to use any of these tricks in production code (as<br>
> someone said, it's can be far from readable), but I don't think it's been<br>
> just a toy exercise.  In trying to shave characters off my solution I've<br>
> been pushing the boundaries of what Ruby can and can't do.  This in turn<br>
> helps solidify my understanding of the object-model and syntax parser.<br>
> So, anyone else want to share what they learned?<br>
> Muz<br>
> *: I'm still working on mine and while I don't want to look directly at<br>
> other solutions, I'm happy to be given inspiration by discussing<br>
> techniques**.<br>
> **: Yes I know this makes no sense.<br>
><br>
> On 10 May 2011 15:03, Andrew McDonough <<a href="mailto:andrew@andrewmcdonough.co.uk">andrew@andrewmcdonough.co.uk</a>> wrote:<br>
><br>
> Thanks James.  I'm glad that ShRUG enjoyed it.  We were a bit short on<br>
> time at LRUG, with less than an hour available for coding.  Four teams<br>
> completed the course, and our winner was Tomasz Wegrzanowsk (@t_a_w),<br>
> who was working on his own, and managed 704 characters<br>
> (<a href="http://j.mp/lbcXV2" target="_blank">http://j.mp/lbcXV2</a>).  Second place was @zuppr, @jamiemill @morticed<br>
> and @aanand who came a close second in with 843 chars<br>
> <a href="http://j.mp/mBjfJU" target="_blank">http://j.mp/mBjfJU</a>, third place was  @danlucraft, @nfelger, Jordi,<br>
> Dan, Tony, Steve and Keith who completed the course in 883 chars<br>
> <a href="http://j.mp/jHhbWU" target="_blank">http://j.mp/jHhbWU</a> and finally one other anonymous team completed the<br>
> course with 1208 characters (if this was you, please let us know who<br>
> you are).  The winner, Tomasz (<a href="http://j.mp/lSsmJd" target="_blank">http://j.mp/lSsmJd</a>), was presented with<br>
> a trophy (<a href="http://j.mp/iRFwGP" target="_blank">http://j.mp/iRFwGP</a>) and the second placed team got medals.<br>
> There are still four medals left, which I will award at the next LRUG<br>
> to the four people who produce the best solutions (not necessarily the<br>
> shortest ones), so there's still something to play for if you didn't<br>
> come along on the evening.<br>
><br>
> There appears to have been a lot of work done since to get the<br>
> character counts down even further, in particular from Paul Battley<br>
> with some help from Tom Stuart.  Their commit log is worth looking<br>
> through:<br>
><br>
> <a href="https://github.com/threedaymonk/rubygolf/commits/master" target="_blank">https://github.com/threedaymonk/rubygolf/commits/master</a><br>
><br>
> They got the solution down to 654 characters, before realising they<br>
> could exploit my "whitespace isn't counted" rule to encode their<br>
> solution in spaces and newlines, and then simply decode and exec.<br>
> This brought the solution down to 37 characters.  He gets one of the<br>
> four medals.  Genius:<br>
><br>
> <a href="https://github.com/threedaymonk/rubygolf/blob/master/lib/golf.rb" target="_blank">https://github.com/threedaymonk/rubygolf/blob/master/lib/golf.rb</a><br>
><br>
> I have put the introductory presentation I made up on heroku:<br>
><br>
> <a href="http://rubygolf-presentation.heroku.com" target="_blank">http://rubygolf-presentation.heroku.com</a><br>
><br>
> Skills Matter have published some photos of the evening:<br>
><br>
> <a href="http://www.flickr.com/photos/skillsmatter/5704350908/in/set-72157626683669388/" target="_blank">http://www.flickr.com/photos/skillsmatter/5704350908/in/set-72157626683669388/</a><br>
><br>
> I will follow up later with some analysis of the solutions and some of<br>
> the tricks and techniques used, but for now, you can look through the<br>
> various solutions that were submitted:<br>
><br>
> <a href="https://github.com/andrewmcdonough/rubygolf/network" target="_blank">https://github.com/andrewmcdonough/rubygolf/network</a><br>
><br>
> Congratulations to ShRUG - you guys did really well completing the<br>
> course with so few characters.<br>
><br>
> Andrew<br>
><br>
> ---<br>
> Andrew McDonough<br>
> CTO, Tribesports<br>
> <a href="http://tribesports.com" target="_blank">http://tribesports.com</a><br>
><br>
><br>
> On 10 May 2011 13:59, James Almond <<a href="mailto:james@jamesalmond.com">james@jamesalmond.com</a>> wrote:<br>
>> Hi all,<br>
>> As promised, an update on ShRUG's progress with the Ruby Golf night we ran<br>
>> in parallel with LRUG.<br>
>> Firstly, I managed to fork the repository before the 7th hole was added<br>
>> and<br>
>> nobody noticed until a fair amount of time into the evening so we<br>
>> completed<br>
>> the course without it. We also worked with a slightly lighter and RSpec<br>
>> 2 compatible runner, but all specs and counting mechanisms stayed the<br>
>> same.<br>
>> Everyone had 1.9.2 installed and favoured it, so we went with that over<br>
>> 1.8.7. I think we were still pretty close to what you were running. We had<br>
>> around 5 pairs of 2.<br>
>> Our lowest team effort on the night was 592 (with hole 7<br>
>> missing): <a href="https://github.com/ianwhite/rubygolf/blob/master/lib/golf.rb" target="_blank">https://github.com/ianwhite/rubygolf/blob/master/lib/golf.rb</a><br>
>> A group discussion and edit took the count down to<br>
>><br>
>> 522: <a href="https://github.com/shruggers/rubygolf/blob/ecd0b312bfb9707b6debfc01062eab5e39d5f95a/lib/golf.rb" target="_blank">https://github.com/shruggers/rubygolf/blob/ecd0b312bfb9707b6debfc01062eab5e39d5f95a/lib/golf.rb</a><br>

>> A bit of post-ShRUG editing and adding hole 7 our final team count was<br>
>> 604: <a href="https://github.com/shruggers/rubygolf/blob/master/lib/golf.rb" target="_blank">https://github.com/shruggers/rubygolf/blob/master/lib/golf.rb</a><br>
>> The discussion and collating of the results at the end was good fun and<br>
>> also<br>
>> made it one of the latest running ShRUG meetings I can remember.<br>
>> Everyone had a great evening, and learnt something new. Thanks to Andrew<br>
>> (and anybody else who contributed) for the holes, much appreciated! The<br>
>> #rubygolf radio silence from Sheffield was because everyone was too busy<br>
>> attempting the holes, sorry about that.<br>
>> James<br>
>> _______________________________________________<br>
>> Chat mailing list<br>
>> <a href="mailto:Chat@lists.lrug.org">Chat@lists.lrug.org</a><br>
>> <a href="http://lists.lrug.org/listinfo.cgi/chat-lrug.org" target="_blank">http://lists.lrug.org/listinfo.cgi/chat-lrug.org</a><br>
>><br>
>><br>
> _______________________________________________<br>
> Chat mailing list<br>
> <a href="mailto:Chat@lists.lrug.org">Chat@lists.lrug.org</a><br>
> <a href="http://lists.lrug.org/listinfo.cgi/chat-lrug.org" target="_blank">http://lists.lrug.org/listinfo.cgi/chat-lrug.org</a><br>
><br>
> _______________________________________________<br>
> Chat mailing list<br>
> <a href="mailto:Chat@lists.lrug.org">Chat@lists.lrug.org</a><br>
> <a href="http://lists.lrug.org/listinfo.cgi/chat-lrug.org" target="_blank">http://lists.lrug.org/listinfo.cgi/chat-lrug.org</a><br>
><br>
><br>
> _______________________________________________<br>
> Chat mailing list<br>
> <a href="mailto:Chat@lists.lrug.org">Chat@lists.lrug.org</a><br>
> <a href="http://lists.lrug.org/listinfo.cgi/chat-lrug.org" target="_blank">http://lists.lrug.org/listinfo.cgi/chat-lrug.org</a><br>
><br>
><br>
_______________________________________________<br>
Chat mailing list<br>
<a href="mailto:Chat@lists.lrug.org">Chat@lists.lrug.org</a><br>
<a href="http://lists.lrug.org/listinfo.cgi/chat-lrug.org" target="_blank">http://lists.lrug.org/listinfo.cgi/chat-lrug.org</a><br>
</div></div></blockquote></div><br></div>