[#321574] Regular Expressions — Mmcolli00 Mom <mmc_collins@...>

Hi everyone.

15 messages 2008/12/01

[#321655] Ruby cgi script — ZippySwish <fischer.jan@...>

I put "script.rb" into the cgi-bin folder of my webhost, but nothing's

12 messages 2008/12/02

[#321733] FFI 0.2.0 — "Wayne Meissner" <wmeissner@...>

Greetings Rubyists.

20 messages 2008/12/03

[#321920] Force a program to stop if runtime exceeds given duration — Aldric Giacomoni <"aldric[remove]"@...>

Any idea how to do that?

25 messages 2008/12/04
[#321924] Re: Force a program to stop if runtime exceeds given duration — "Glen Holcomb" <damnbigman@...> 2008/12/04

On Thu, Dec 4, 2008 at 10:04 AM, Aldric Giacomoni <"aldric[remove]"@

[#322011] Re: Force a program to stop if runtime exceeds given duration — Ron Fox <fox@...> 2008/12/05

See http://www.ruby-doc.org/core-1.9/classes/Process.html#M003012

[#322016] Re: Force a program to stop if runtime exceeds given duration — Aldric Giacomoni <"aldric[remove]"@...> 2008/12/05

Everybody automatically assumes that rubyists are using Linux - sadly,

[#321969] Are there any Ruby Technical Writers here? — Vito Fontaine <vito.matro@...>

I am a beginner with Ruby who was interested in writing some programs.

15 messages 2008/12/04
[#321975] Re: Are there any Ruby Technical Writers here? — Robert Klemme <shortcutter@...> 2008/12/04

On 04.12.2008 22:43, Vito Fontaine wrote:

[#321984] Re: Are there any Ruby Technical Writers here? — Vito Fontaine <vito.matro@...> 2008/12/05

Robert Klemme wrote:

[#322014] Proximity searches in Ruby — Stuart Clarke <stuart.clarke1986@...>

Does Ruby have the ability to perform proximity searches on data. For

14 messages 2008/12/05
[#322056] Re: Proximity searches in Ruby — Ilan Berci <coder68@...> 2008/12/05

No proximity searches with 1.8.. you would need a full fledged text

[#322073] shoes 2 (raisins) is go. — _why <why@...>

Salutations and hi.

13 messages 2008/12/06

[#322260] Help on algorythm — Helder Oliveira <hrpoliveira@...>

Guys i have been trying to make this algorythm but with no sucess, can

13 messages 2008/12/09
[#322261] Re: Help on algorythm — "Glen Holcomb" <damnbigman@...> 2008/12/09

On Tue, Dec 9, 2008 at 7:44 AM, Helder Oliveira <hrpoliveira@gmail.com>wrote:

[#322283] Completely new programmer lacks direction — Cameron Carroll <ubernoobs@...>

Hi. I recently picked up a beginning ruby book, having only lightly

17 messages 2008/12/09

[#322285] compare 2 text files - check for difference - Please help — Mmcolli00 Mom <mmc_collins@...>

Hi. I want to take two files that are supposed to be identical, then ook

12 messages 2008/12/09
[#322301] Re: compare 2 text files - check for difference - Please help — Brian Candler <b.candler@...> 2008/12/09

Mmcolli00 Mom wrote:

[#322306] Re: compare 2 text files - check for difference - Please help — Mmcolli00 Mom <mmc_collins@...> 2008/12/09

require 'diff/lcs/Array'

[#322417] why Hash corrupts 'key' object ? — Dmitry Perfilyev <dmitry1976@...>

Hi, I have next script:

13 messages 2008/12/10

[#322464] Q: FFI and C++? — Jeremy Henty <onepoint@...>

If I want to wrap a C++ library using FFI, can it cope with the name

14 messages 2008/12/11

[#322516] Invoking Ruby code from a low-level language? — Alex Fulton <a.fulton@...>

Hi, my sincerest apologies if this question has already been answered

11 messages 2008/12/11

[#322529] parallel method return value — Louis-Philippe <default@...>

Hi all,

17 messages 2008/12/12

[#322566] How to run background processes (more than 1 worker) parallely. — "Deepak Gole" <deepak.gole8@...>

Hi

10 messages 2008/12/12

[#322624] singleton methods vs. meta instance methods — Daniel DeLorme <dan-ml@...42.com>

If I understand the ruby object model correctly, then an object's

15 messages 2008/12/13

[#322705] ruby 1.9.1: Encoding trouble: broken US-ASCII String — Tom Link <micathom@...>

Hi,

22 messages 2008/12/14

[#322710] Help with an "easy" regular expression substitution — Iñaki Baz Castillo <ibc@...>

Hi, I'm getting crazy to get a theorically easy substitution:

16 messages 2008/12/14

[#322819] Pure Ruby Zlib::GzipWriter — Daniel Berger <djberg96@...>

Hi,

53 messages 2008/12/15
[#324442] Re: Pure Ruby Zlib::GzipWriter — Luis Lavena <luislavena@...> 2009/01/10

On Jan 9, 9:26m, "Charles L." <aquas...@gmail.com> wrote:

[#323877] Re: Pure Ruby Zlib::GzipWriter — Daniel Berger <djberg96@...> 2009/01/03

[#323903] Re: Pure Ruby Zlib::GzipWriter — Roger Pack <rogerpack2005@...> 2009/01/04

[#324011] Re: Pure Ruby Zlib::GzipWriter — Daniel Berger <djberg96@...> 2009/01/05

[#322987] Using ruby hash on array — Stuart Clarke <stuart.clarke1986@...>

I would like to process some data from an array and using hash to

14 messages 2008/12/17

[#323085] Ruby and Rails supported on 10gen — "Jim Menard" <jim.menard@...>

http://www.10gen.com/blog/2008/12/ruby-support-on-10gen

11 messages 2008/12/18

[#323166] Dreaming of a Ruby Christmas (#187) — Matthew Moss <matt@...>

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

11 messages 2008/12/19

[#323204] get first and last line from txt file - how? — Mmcolli00 Mom <mmc_collins@...>

I have txt file with date/time stamps only. I want to grab the first

19 messages 2008/12/20
[#323205] Re: get first and last line from txt file - how? — Tim Hunter <TimHunter@...> 2008/12/20

Mmcolli00 Mom wrote:

[#323207] Re: get first and last line from txt file - how? — "Yaser Sulaiman" <yaserbuntu@...> 2008/12/20

I'm just wondering..

[#323273] how to make installing Ruby easier for amateurs — Tom Cloyd <tomcloyd@...>

Greetings!

21 messages 2008/12/22

[#323312] Name that data structure! — Simon Chiang <simon.a.chiang@...>

I'm using a data structure that I'm sure has been implemented and

18 messages 2008/12/22
[#323314] Re: Name that data structure! — "Gregory Brown" <gregory.t.brown@...> 2008/12/22

On Mon, Dec 22, 2008 at 5:38 PM, Simon Chiang <simon.a.chiang@gmail.com> wrote:

[#323342] Are all Ruby built-in objects thread safe? — "Just Another Victim of the Ambient Morality" <ihatespam@...>

Are all built-in objects thread safe? For example, if I have an array

23 messages 2008/12/23
[#323346] Re: Are all Ruby built-in objects thread safe? — Yukihiro Matsumoto <matz@...> 2008/12/23

Hi,

[#323519] What does 'Monkey Patching' exactly Mean in Ruby? — "Yaser Sulaiman" <yaserbuntu@...>

According to Wikipedia, a monkey patch[1] is:

36 messages 2008/12/27
[#323813] Re: What does 'Monkey Patching' exactly Mean in Ruby? — Jg W Mittag <JoergWMittag+Usenet@...> 2009/01/02

Phlip wrote:

[#323832] Re: What does 'Monkey Patching' exactly Mean in Ruby? — "David A. Black" <dblack@...> 2009/01/02

Hi --

[#323644] Why Ruby? — Mike Stephens <rubfor@...>

I have never seen or heard of Ruby in a corporate context. The single

35 messages 2008/12/30

[#323668] Ruby 1.9.1 RC1 is released — "Yugui (Yuki Sonoda)" <yugui@...>

Hi, folks

21 messages 2008/12/30

[SUMMARY] Mix and Match (#186)

From: Matthew Moss <matt@...>
Date: 2008-12-18 23:09:34 UTC
List: ruby-talk #323107
_This week's summary is provided by Peter, originally [posted to his  
blog][1]. I am providing it here with permission._

[1]: http://www.rubyrailways.com/ruby-quiz-mix-and-match/


In my interpretation, this is a simple combinatorial problem: say the  
number of recipients is `r` and candles per recipient is `c`, then you  
are looking for a (preferably non-repeating) random selection of `r`  
elements of `c`-combinations of the original set of candles. (In fact  
it痴 a bit more complicated than that: the `c`-combinations have to be  
recalculated from the remaining candles each time you give away a  
group of candles, so we値l get to that). Sounds confusing? Don稚  
worry, after the implementation everything will be clear!

So first, define a k-combination for a histogram (a Hash like candles  
above, where keys are elements and values are cardinalities):

     class Hash
       def comb(group_size)
         result = []
         inner_comb = lambda do |head,tail|
           tail[0..-(group_size-head.size)].each do |e|
             if (head.size >= group_size-1)
               tail.each {|t| result << head + [t]}
             else
               inner_comb[head + [e], tail[tail.index(e)+1..-1]]
             end
           end
         end
         inner_comb[[],self.inject([]) {|a,v| v[1].times{a << v[0]}; a}]
         result.uniq
       end

For example:

     candles = { :orange   => 2,
                 :vanilla  => 1,
                 :lavender => 1,
                 :garden => 1 }

     pp candles.comb(3)

     => [[:lavender, :garden, :orange],
         [:lavender, :garden, :vanilla],
         [:lavender, :orange, :orange],
         [:lavender, :orange, :vanilla],
         [:garden, :orange, :orange],
         [:garden, :orange, :vanilla],
         [:orange, :orange, :vanilla]]

So, for a set of candles, this method generates all possible 3- 
combinations of the candles. We can then pick one and assign it to one  
of the recipients. Then recalculate the above from the remaining  
candles, give it to the next recipient - and so on and so forth.  
That痴 the basic idea, but we also need to ensure the candle  
combinations are as non-repeating as possible. So let痴 define some  
further utility methods:

     class Hash
       def remove_set(set)
         set.each {|e| self[e] -= 1}
       end
     end

The above code adjusts the number of candles in the original hash once  
we give away some of them. So for example:

     candles = { :orange   => 2,
                 :vanilla  => 1,
                 :lavender => 1,
                 :garden => 1 }

     candles.remove_set([:orange,:orange,:lavender])
     p candles
     => {:lavender=>0, :garden=>1, :orange=>0, :vanilla=>1}

And some Array extensions:

     class Array
       def rand
         uniqs = self.select{|e| e.uniq.size == e.size}
       uniqs.empty? ? self[Kernel.rand(length)] :  
uniqs[Kernel.rand(uniqs.length)]
       end

       def unordered_include?(other)
         self.map{|e| e.map{|s| s.to_s}.sort}.include? other.map{|s|  
s.to_s}.sort
       end
     end

`Array#rand` is trying to pick a random non-repeating combination if  
there is one (e.g. `[:orange, :lavender, :garden]`) or, if there is no  
such combination, then just a random one (e.g.  
`[:orange, :orange, :garden]` - orange is repeating, but we have no  
other choice).

`Array#unordered_include?` is like normal `Array#include?`, but  
disregards the ordering of the elements. So for example:

     [[:lavender, :garden, :orange]].include?  
[:lavender, :orange, :garden] => false
     [[:lavender, :garden, :orange]].unordered_include?  
[:lavender, :orange, :garden] => true

Hmmit would have been much more effective to use a set here rather  
than the above CPU-sucker, but now I am lazy to change it. ;-)

OK, so finally for the solution:

     ERROR_STRING = "The number of recipients times the number of  
candles per recipient is more than the supply!"

     def mix_and_match(candles, recipients, candles_per_recipient)
       return ERROR_STRING if ((candles.values.inject{|a,v| a+v}) <  
(recipients.size * candles_per_recipient))
       candle_set = recipients.inject({}) do |a,v|
         tried = []
         tries = 0
         loop do
           random_pick = candles.comb(candles_per_recipient).rand
           tried << random_pick unless tried.unordered_include?  
random_pick
           break unless a.values.unordered_include? random_pick
           break if (tries+=1) > candles.values.size * 2
         end
         candles.remove_set(tried.last)
         a[v] = tried.last
         a
       end
       candle_set.merge({:extra => candles})
     end

So, in the inner loop we randomly pick a candles-per-recipient- 
combination of all the possible combinations; If no one has that combo  
yet, we assign it to the next recipient. If someone has it already, we  
try to find an unique combination (loop on), unless it is impossible.  
In this case we simply start giving out any combinations. Once we give  
away a set of candles, we remove them from the original set. Easy-peasy.

You can check out the source code here.

This was a great quiz, too bad that not many people took a stab at it  
(so far 1 except me ;-)). The hardest part for me was the  
implementation of the k-combination (and the result looks awful to me  
- I didn稚 check any algorithm/pseudocode/other solution though, I  
wanted to roll my own) - after that the problem was pretty simple.


In This Thread

Prev Next