[#368826] ANN: home_run 0.9.1 Released — Jeremy Evans <code@...>

= home_run

14 messages 2010/09/01

[#368894] uninitialized constant NArray (Name Error) — Abder-Rahman Ali <abder.rahman.ali@...>

Following section (2) here:

12 messages 2010/09/02

[#368914] p vs. print — Abder-Rahman Ali <abder.rahman.ali@...>

I wrote the following scripts from section (2) here:

24 messages 2010/09/02
[#368915] Re: p vs. print — Alex Stahl <astahl@...5.com> 2010/09/02

Ruby uses "puts", not "print". "p" is short for "puts".

[#368977] Read cookie — Pål Bergström <pal@...>

How can I get the value of a browser cookie with Ruby?

29 messages 2010/09/03
[#368978] Re: Read cookie — Brian Candler <b.candler@...> 2010/09/03

P奪l Bergstr旦m wrote:

[#368984] Re: Read cookie — Pål Bergström <pal@...> 2010/09/03

Brian Candler wrote:

[#369036] ruby_archive 0.1.0 released — Jonathan Nielsen <jonathan@...>

After a summer of working on various ways to implement it, I'm happy to

10 messages 2010/09/03

[#369106] A better idiomatic way of doing this?! — Tim Romberg <tim.jakobsson@...>

Hi Im new at Ruby and been struggling with this lab I have for a course

12 messages 2010/09/05

[#369113] unable to open X server `' (Magick::ImageMagickError) — Abder-Rahman Ali <abder.rahman.ali@...>

I have written a Ruby script "dicom_info.rb", and when I try running

16 messages 2010/09/06
[#369119] Re: unable to open X server `' (Magick::ImageMagickError) — Brian Candler <B.Candler@...> 2010/09/06

On Mon, Sep 06, 2010 at 12:42:11PM +0900, Abder-Rahman Ali wrote:

[#369132] Re: unable to open X server `' (Magick::ImageMagickError) — Abder-Rahman Ali <abder.rahman.ali@...> 2010/09/06

Thanks a lot Brian.

[#369139] Re: unable to open X server `' (Magick::ImageMagickError) — Brian Candler <B.Candler@...> 2010/09/06

On Mon, Sep 06, 2010 at 11:55:32PM +0900, Abder-Rahman Ali wrote:

[#369140] Re: unable to open X server `' (Magick::ImageMagickError) — Abder-Rahman Ali <abder.rahman.ali@...> 2010/09/06

So, do you suggest installing "cygwin"?

[#369159] Re: unable to open X server `' (Magick::ImageMagickError) — Roger Pack <rogerpack2005@...> 2010/09/06

> you suggest installing "cygwin"?

[#369124] Odd functional programming question — Peter Hickman <peterhickman386@...>

Ok this is probably not really functional programming but I was just

10 messages 2010/09/06

[#369169] How do I request a HTTPS page? — Samuel Sternhagen <samatoms@...>

I would like to access a https page from irb

14 messages 2010/09/06

[#369226] What OS do you use for Ruby development? — Nick Hird <nrhird@...>

I don't want to start any OS wars. I was just curious as to what OS

67 messages 2010/09/07

[#369301] Nokogiri and LibXML — unbewusst.sein@... (Une B騅ue)

Each time i launch a script using Nokogiri i get :

12 messages 2010/09/08

[#369302] Receiving array naturally? — Terry Michaels <spare@...>

As I learn Ruby, I find a lot of flexibility in the syntax. I was

14 messages 2010/09/08

[#369389] Key Associated w/ Maximum Value in Hash — Timothy Baron <timothy.baron@...>

Simple question: what's the cleanest way to retrieve a key associated

11 messages 2010/09/09

[#369477] How to do foo.chomp!.rstrip!.downcase! ? — Geometric Patterns <geometric.patterns@...>

15 messages 2010/09/10

[#369623] Ruby packaging in Debian and Ubuntu: Mythbusting and FAQ — Lucas Nussbaum <lucas@...>

Hi,

11 messages 2010/09/12

[#369638] Declarative relations between object attributes — Knut Franke <knut.franke@...>

Some time ago I stumbled over Cells[1], a Common Lisp extension allowing

16 messages 2010/09/12

[#369710] Encoding error while installing rails on ruby 1.9.2 — Bek Bek <bekis3@...>

Hello everybody,

11 messages 2010/09/14

[#369796] Ruby Multi-threading? — Terry Michaels <spare@...>

I read a Ruby e-book recently that indicated that although Ruby has

12 messages 2010/09/15

[#369952] Developing for Ruby on Windows? — Tom Wardrop <tom@...>

I've heard a lot of criticism about developing for Ruby on Windows, but

11 messages 2010/09/17

[#370039] Ruby-based data language — Intransition <transfire@...>

Has anyone ever endeavored to create a data/configuration file format

14 messages 2010/09/19

[#370053] Getting GUI for ruby for Linux running (QT or wxWidget)? — Markus Fischer <markus@...>

Hi,

23 messages 2010/09/19
[#370054] Re: Getting GUI for ruby for Linux running (QT or wxWidget)? — Markus Fischer <markus@...> 2010/09/19

On 20.09.2010 01:14, Markus Fischer wrote:

[#370116] Re: Getting GUI for ruby for Linux running (QT or wxWidget)? — Quintus <sutniuq@...> 2010/09/20

-----BEGIN PGP SIGNED MESSAGE-----

[#370164] Re: Getting GUI for ruby for Linux running (QT or wxWidget)? — Ryan Melton <ryanmelt@...> 2010/09/21

qt does have a new gem I put together:

[#370205] QT works! (was: Re: Getting GUI for ruby for Linux running (QT or wxWidget)) — Markus Fischer <markus@...> 2010/09/21

Hi,

[#370127] An elegant way... — "F. Senault" <fred@...>

Hello everybody.

23 messages 2010/09/20

[#370210] The Great Ruby GUI Toolkit Roundup — Ed Howland <ed.howland@...>

Hi,

15 messages 2010/09/21

[#370257] having problems with open4 and stuck forked processes — Tim Uckun <timuckun@...>

I am running a batch process which uses the wkhtmltoimage-i386 binary

13 messages 2010/09/22
[#370268] Re: having problems with open4 and stuck forked processes — Robert Klemme <shortcutter@...> 2010/09/22

On Wed, Sep 22, 2010 at 2:31 PM, Tim Uckun <timuckun@gmail.com> wrote:

[#370294] Re: having problems with open4 and stuck forked processes — Tim Uckun <timuckun@...> 2010/09/22

> What do you mean by that?  Goes the timeout undetected?  Can't you

[#370309] Re: having problems with open4 and stuck forked processes — Robert Klemme <shortcutter@...> 2010/09/23

On 23.09.2010 01:59, Tim Uckun wrote:

[#370289] Sorting problem with an Array of Arrays — Paul <tester.paul@...>

Hi there, I have an array of arrays that looks like the following:

15 messages 2010/09/22

[#370296] Ruby Installation Error — Tridib Bandopadhyay <tridib04@...>

I am trying this command to build the ruby interpreter

20 messages 2010/09/23
[#370689] Re: Ruby Installation Error — Brian Candler <b.candler@...> 2010/09/29

Tridib Bandopadhyay wrote:

[#370319] to make dot method dot method work? — Pen Ttt <myocean135@...>

here is the class

14 messages 2010/09/23

[#370373] how do i force ruby to release memory — Amit Tomar <amittomer25@...>

Hi all,

19 messages 2010/09/24
[#370374] Re: how do i force ruby to release memory — Robert Klemme <shortcutter@...> 2010/09/24

On Fri, Sep 24, 2010 at 7:36 AM, Amit Tomar <amittomer25@yahoo.com> wrote:

[#370379] Re: how do i force ruby to release memory — Amit Tomar <amittomer25@...> 2010/09/24

Robert Klemme wrote:

[#370380] Re: how do i force ruby to release memory — Jes俍 Gabriel y Gal疣 <jgabrielygalan@...> 2010/09/24

On Fri, Sep 24, 2010 at 10:31 AM, Amit Tomar <amittomer25@yahoo.com> wrote:

[#370383] Re: how do i force ruby to release memory — Amit Tomar <amittomer25@...> 2010/09/24

Jes炭s Gabriel y Gal叩n wrote:

[#370388] How to delete the browser cache through ruby — Arihan Sinha <arihan_sinha@...>

Hi All,

11 messages 2010/09/24

[#370590] Point me to help w/ multithreading in 1.9.2-p0 — Alex Stahl <astahl@...5.com>

Hi Folks - A week or two ago, I pinged this list for recommendations on

11 messages 2010/09/28
[#370593] Re: Point me to help w/ multithreading in 1.9.2-p0 — Alex Stahl <astahl@...5.com> 2010/09/28

Nevermind... figured it out.

[#370640] puts and return — Jim Haungs <jhaungs@...>

10.times do |i|

14 messages 2010/09/28

[#370661] Color sequences in ri on Windows — Eric Christopherson <echristopherson@...>

After installing some gems, the system recommended that I refresh ri

11 messages 2010/09/28

[#370721] The beauty of Ruby through examples — Adriano Ferreira <adrfer@...>

Hey all,

33 messages 2010/09/29

[#370740] Can't upgrade ruby on Snow Leopard — Ast Jay <azzzz@...>

I've followed the instructions here:

13 messages 2010/09/29

[#370796] How to prevent overwriting methods by accident? — Stefan Salewski <mail@...>

In Ruby we can add new methods to existing classes.

13 messages 2010/09/30
[#370797] Re: How to prevent overwriting methods by accident? — Jeremy Bopp <jeremy@...> 2010/09/30

On 9/30/2010 2:15 PM, Stefan Salewski wrote:

[#370800] Re: How to prevent overwriting methods by accident? — Alex Stahl <astahl@...5.com> 2010/09/30

But is there a way to call the original method instead of just quitting

Re: Is my code unelegant?

From: Ryan Davis <ryand-ruby@...>
Date: 2010-09-06 01:17:49 UTC
List: ruby-talk #369111
On Sep 5, 2010, at 14:49 , Mark Walker wrote:

> Is the attached code too messy to be considered "good"?
> 
> I can't figure out if I created too many variables.
> 
> I'm just now learning Ruby, and I just can't figure out if that's bad
> code.

This is the type of feedback I'd give my students or coworkers:

> # original code

> def roman_numerals input
>   number_of_m = input/1000
>   remainder = input%1000
> 
>   number_of_d = remainder/500
>   remainder_2 = remainder%500
> 
>   number_of_c = remainder_2/100
>   remainder_3 = remainder_2%100
> 
>   number_of_l = remainder_3/50
>   remainder_4 = remainder_3%50
> 
>   number_of_x = remainder_4/10
>   remainder_5 = remainder_4%10
> 
>   number_of_v = remainder_5/5
>   last_remainder = remainder_5%5
> 
>   number_of_i = last_remainder
> 
>   return_string = ('M' * number_of_m) + ('D' * number_of_d) + ('C' * number_of_c) + ('L' * number_of_l) + ('X' * number_of_x) + ('V' * number_of_v) + ('I' * number_of_i)
> end
> 
> # fold all the unnecessary remainder vars back into input, remove last var
> def roman_numerals1 input
>   number_of_m = input/1000
>   input = input%1000
> 
>   number_of_d = input/500
>   input = input%500
> 
>   number_of_c = input/100
>   input = input%100
> 
>   number_of_l = input/50
>   input = input%50
> 
>   number_of_x = input/10
>   input = input%10
> 
>   number_of_v = input/5
>   input = input%5
> 
>   number_of_i = input
> 
>   ('M' * number_of_m) + ('D' * number_of_d) + ('C' * number_of_c) + ('L' * number_of_l) + ('X' * number_of_x) + ('V' * number_of_v) + ('I' * number_of_i)
> end
> 
> # remove unnecessary variable prefixes
> def roman_numerals2 input
>   m = input/1000
>   input = input%1000
> 
>   d = input/500
>   input = input%500
> 
>   c = input/100
>   input = input%100
> 
>   l = input/50
>   input = input%50
> 
>   x = input/10
>   input = input%10
> 
>   v = input/5
>   input = input%5
> 
>   i = input
> 
>   ('M' * m) + ('D' * d) + ('C' * c) + ('L' * l) + ('X' * x) + ('V' * v) + ('I' * i)
> end
> 
> # remove unnecessary variable prefixes
> def roman_numerals3 input
>   m = input/1000
>   input = input%1000
> 
>   d = input/500
>   input = input%500
> 
>   c = input/100
>   input = input%100
> 
>   l = input/50
>   input = input%50
> 
>   x = input/10
>   input = input%10
> 
>   v = input/5
>   input = input%5
> 
>   i = input
> 
>   ('M' * m) + ('D' * d) + ('C' * c) + ('L' * l) + ('X' * x) + ('V' * v) + ('I' * i)
> end
> 
> # switch to operator equals format
> def roman_numerals4 input
>   m  = input / 1000
>   input %= 1000
> 
>   d  = input / 500
>   input %= 500
> 
>   c  = input / 100
>   input %= 100
> 
>   l  = input / 50
>   input %= 50
> 
>   x  = input / 10
>   input %= 10
> 
>   v  = input / 5
>   input %= 5
> 
>   i = input
> 
>   ('M' * m) + ('D' * d) + ('C' * c) + ('L' * l) + ('X' * x) + ('V' * v) + ('I' * i)
> end
> 
> # rename input and clean up formatting to be more readable
> def roman_numerals5 n
>   m = n / 1000; n %= 1000
>   d = n /  500; n %=  500
>   c = n /  100; n %=  100
>   l = n /   50; n %=   50
>   x = n /   10; n %=   10
>   v = n /    5; n %=    5
>   i = n
> 
>   ('M' * m) + ('D' * d) + ('C' * c) + ('L' * l) +
>     ('X' * x) + ('V' * v) + ('I' * i)
> end
> 
> # avoid string +
> def roman_numerals6 n
>   m = n / 1000; n %= 1000
>   d = n /  500; n %=  500
>   c = n /  100; n %=  100
>   l = n /   50; n %=   50
>   x = n /   10; n %=   10
>   v = n /    5; n %=    5
>   i = n
> 
>   [('M' * m), ('D' * d), ('C' * c), ('L' * l),
>    ('X' * x), ('V' * v), ('I' * i)].join
> end

Here are a few iterations of what I wrote. Since the process of old roman numerals is reductive, it is essentially an inject:

> ROMAN_DEC = [1000, 500, 100, 50, 10, 5, 1]
> ROMAN_ROM = %W(M D C L X V I)
> 
> def roman1 n
>   units = []
>   ROMAN_DEC.inject(n) { |num, unit| units << num / unit; num % unit }
>   units.zip(ROMAN_ROM).map { |num, unit| unit * num }.join
> end
> 
> def roman2 n
>   units = []
>   ROMAN_DEC.map { |unit| x, n = n.divmod unit; x }.zip(ROMAN_ROM).map { |num, unit| unit * num }.join
> end

Eventually I realized that inject wasn't necessary at all and the whole thing could be cleaned up to:

> ROMAN = ROMAN_DEC.zip(ROMAN_ROM).sort.reverse
> 
> def roman3 n
>   units = []
>   ROMAN.map { |dec,rom| x, n = n.divmod dec; rom * x }.join
> end

Next, benchmarking so you realize the impact of your code:

> require 'benchmark'
> 
> max = (ARGV.shift || 1_000_000).to_i
> 
> puts "# of iterations = #{max}"
> Benchmark::bm(20) do |x|
>   x.report("null_time") do
>     for i in 0..max do
>       # do nothing
>     end
>   end
> 
>   x.report("roman_numerals") do
>     for i in 0..max do
>       roman_numerals 2002
>     end
>   end
> 
>   x.report("roman_numerals1") do
>     for i in 0..max do
>       roman_numerals1 2002
>     end
>   end
> 
>   x.report("roman_numerals2") do
>     for i in 0..max do
>       roman_numerals2 2002
>     end
>   end
> 
>   x.report("roman_numerals3") do
>     for i in 0..max do
>       roman_numerals3 2002
>     end
>   end
> 
>   x.report("roman_numerals4") do
>     for i in 0..max do
>       roman_numerals4 2002
>     end
>   end
> 
>   x.report("roman_numerals5") do
>     for i in 0..max do
>       roman_numerals5 2002
>     end
>   end
> 
>   x.report("roman_numerals6") do
>     for i in 0..max do
>       roman_numerals6 2002
>     end
>   end
> 
>   x.report("roman1") do
>     for i in 0..max do
>       roman1 2002
>     end
>   end
> 
>   x.report("roman2") do
>     for i in 0..max do
>       roman2 2002
>     end
>   end
> 
>   x.report("roman3") do
>     for i in 0..max do
>       roman3 2002
>     end
>   end
> end

outputs:

> # of iterations = 100000
>                           user     system      total        real
> null_time             0.010000   0.000000   0.010000 (  0.010981)
> roman_numerals        0.840000   0.000000   0.840000 (  0.843659)
> roman_numerals1       0.840000   0.000000   0.840000 (  0.839783)
> roman_numerals2       0.840000   0.000000   0.840000 (  0.842840)
> roman_numerals3       0.850000   0.000000   0.850000 (  0.843407)
> roman_numerals4       0.830000   0.000000   0.830000 (  0.837354)
> roman_numerals5       0.840000   0.000000   0.840000 (  0.839698)
> roman1                1.820000   0.000000   1.820000 (  1.819902)
> roman2                1.530000   0.000000   1.530000 (  1.530743)
> roman3                1.110000   0.000000   1.110000 (  1.108522)

So, all your times except the last are basically the same and the only thing I did was massage it to be cleaner. On the last iteration, I did perform a change that actually saves you a fair amount of time and memory by avoiding String#+ in favor of Array#join. String concatination would probably fare just as well, but wouldn't be as readable imo.

My times are larger because I'm doing more looping. Your code is essentially an unwound loop and I wanted to see how it looked wound back up. It doesn't fare as well until I hit my last iteration where it finally becomes a fair balance between readable and performant. I would probably go with my last version over your last version just for readability sake (it isn't like this could will be performed billions of times a day).


In This Thread

Prev Next