[#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
[#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

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

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

[#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 =20
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 =20=

number of recipients is `r` and candles per recipient is `c`, then you =20=

are looking for a (preferably non-repeating) random selection of `r` =20
elements of `c`-combinations of the original set of candles. (In fact =20=

it=92s a bit more complicated than that: the `c`-combinations have to be =
=20
recalculated from the remaining candles each time you give away a =20
group of candles, so we=92ll get to that). Sounds confusing? Don=92t =20
worry, after the implementation everything will be clear!

So first, define a k-combination for a histogram (a Hash like candles =20=

above, where keys are elements and values are cardinalities):

     class Hash
       def comb(group_size)
         result =3D []
         inner_comb =3D lambda do |head,tail|
           tail[0..-(group_size-head.size)].each do |e|
             if (head.size >=3D 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 =3D { :orange   =3D> 2,
                 :vanilla  =3D> 1,
                 :lavender =3D> 1,
                 :garden =3D> 1 }

     pp candles.comb(3)

     =3D> [[: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-=20
combinations of the candles. We can then pick one and assign it to one =20=

of the recipients. Then recalculate the above from the remaining =20
candles, give it to the next recipient - and so on and so forth. =20
That=92s the basic idea, but we also need to ensure the candle =20
combinations are as non-repeating as possible. So let=92s define some =20=

further utility methods:

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

The above code adjusts the number of candles in the original hash once =20=

we give away some of them. So for example:

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

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

And some Array extensions:

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

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

`Array#rand` is trying to pick a random non-repeating combination if =20
there is one (e.g. `[:orange, :lavender, :garden]`) or, if there is no =20=

such combination, then just a random one (e.g. =20
`[:orange, :orange, :garden]` - orange is repeating, but we have no =20
other choice).

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

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

Hmm=85 it would have been much more effective to use a set here rather =20=

than the above CPU-sucker, but now I am lazy to change it. ;-)

OK, so finally for the solution:

     ERROR_STRING =3D "The number of recipients times the number of =20
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}) < =20
(recipients.size * candles_per_recipient))
       candle_set =3D recipients.inject({}) do |a,v|
         tried =3D []
         tries =3D 0
         loop do
           random_pick =3D candles.comb(candles_per_recipient).rand
           tried << random_pick unless tried.unordered_include? =20
random_pick
           break unless a.values.unordered_include? random_pick
           break if (tries+=3D1) > candles.values.size * 2
         end
         candles.remove_set(tried.last)
         a[v] =3D tried.last
         a
       end
       candle_set.merge({:extra =3D> candles})
     end

So, in the inner loop we randomly pick a candles-per-recipient-=20
combination of all the possible combinations; If no one has that combo =20=

yet, we assign it to the next recipient. If someone has it already, we =20=

try to find an unique combination (loop on), unless it is impossible. =20=

In this case we simply start giving out any combinations. Once we give =20=

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 =20=

(so far 1 except me ;-)). The hardest part for me was the =20
implementation of the k-combination (and the result looks awful to me =20=

- I didn=92t check any algorithm/pseudocode/other solution though, I =20
wanted to roll my own) - after that the problem was pretty simple.


In This Thread

Prev Next