Ken Bloom <kbloom / gmail.com> writes:

> On Mon, 09 Apr 2007 01:39:19 +0900, Christian Neukirchen wrote:
>
>> =begin
>>> The quiz, then, is to solve this problem without thinking, instead
>>> letting the computer think for you.
>> 
>> I did not intent to seriously submit this solution, but it can be
>> helpful as an example of how to use Ruby to solve a problem quickly
>> without thinking too much or locating Knuth on the bookshelve. Writing
>> this code took maybe ten minutes and happened step-by-step with checking
>> the immediate results.
>> 
>> Since there are only 168 solutions (254 if you allow a sign before the
>> first digit), brute-forcing is the simplest thing one can do. Additional
>> operations can be added by changing the base and mapping the digits onto
>> further operations.  (Different digit order is not that easy to
>> implement and maybe be futile to do with brute-forcing.) =end
>> 
>> (00000000..'22222222'.to_i(3)).map { |x| x.to_s(3).rjust(8, "0").
>>                                                    tr('012', '-+ ') }.
>>   find_all { |x| x.count("-") == 2 and x.count("+") == 1 }.
>
> A less ram-intensive version of this would swap the map and find_all 
> calls as follows:
>
> (00000000..'22222222'.to_i(3)).
>   find_all { |x| x.to_s(3).count("0") == 2 and
> 		 x.to_s(3).count("1") == 1 }.
>   map { |x| x.to_s(3).tr('012', '-+ ').rjust(8," ")}.
>
> (It doesn't keep maintain references to the bad combinations of 
> operators, allowing the GC to reclaim them earlier.)

Yes, but that confuses the application logic.  I don't think it will
save memory compared to yours, you are #to_s'ing a lot more than me!

-- 
Christian Neukirchen  <chneukirchen / gmail.com>  http://chneukirchen.org