[QUIZ] Dreaming of a Ruby Christmas (#187)

Happy holidays, everyone!

Here's mine, it takes the New Years countdown to the next level and will start
counting down from whatever time you run it. Once it counts down to zero, it
says "Happy New Year!" and stops.

For example:
1,046,667!
1,046,666!
1,046,665!
...
3!
2!
1!
Happy New Year!

class Integer
  def commafy
    n = self.to_s.reverse
    n.gsub!(/(\d\d\d)(?=\d)(?!\d*\.)/){ $1 + ',' }
    n.reverse!
  end
end

last = 0

begin
  new_years = Time.local(Time.now.year+1,"jan",1,0,0,0).to_i
  now = Time.now.to_i

  cur = new_years - now
  puts cur.commafy + "!" if (cur != last)
  last = cur
end while now != new_years

puts "Happy New Year!"

···

--
Dana Merrick - System Administrator
Integrated Computer Solutions, Inc.
54B Middlesex Tpke, Bedford, MA 01730
617.621.0060 x112 - http://www.ics.com

Matthew Moss wrote:

## Dreaming of a Ruby Christmas (#187)

It's six more days of Advent, and then... Christmas! Your task is to create a Ruby script that celebrates Christmas. Create a virtual, ASCII Christmas tree completely with blinking lights. Or a countdown calendar 'til December 25th. Or a script that generates the lyrics to _The Twelve Days of Christmas_. Or whatever you like: some Christmas creativity.

And... Merry Christmas and a Happy New Year!!!

Whenever I wrap Matzmas presents the wrapping turns out extremely
lumpy, crinkly, and stuck with gobs of tape everywhere, and the
contents are always disappointing. This script is no exception.

Take the stuff between the '----- cut here -----' lines and save it in
a file, e.g. 'matzmas.rb'. Feed it to ruby, e.g., 'ruby matzmas.rb'.

Please don't try to learn anything from this code!

- Glen

----- cut here -----

                ### M E R R Y M A T Z M A S ###

                              "/|"\
                          "/wl)e";eval(\
                             "A | A"\
                            "A | A"\
                                \
                             "InHhL"\
                            ",Z,%w{-"\
                           ",Y&/LH,L*"\
                          "cCnd,Hh&/d,"\
                         "YCB/Hh,Y&YHh,"\
                        "L&xHh,L*v*nHh,*"\
                       "&ghHh,n&nHh,H*nHh"\
                      ",*q*v*nHh,Hw*qv*Hh}"\
                     "Iq&n*L,Z,[,n&qK,n&qK,"\
                    "@TwC,LH/&ng,gLBbL@K,@Th"\
                   "/**,YC/k*d,Hh/*QdL@K,@FCB"\
                  "/,cQqq&ng,=/CcL@K,@F&v*,RBb"\
                 "y,g*mL!@K,@S&x,mQ/LhQqL,dBm=&"\
                "ng@K,@S*v*n,dBckL,Q-Hy=&ng@K,@E"\
               "&ghH,d&/L,Q-gqCbb&ng@K,@N&n*,/Qng"\
              "*L,LH*==&ng@K,@T*n,H/yL,Q-cQHch&ng@"\
             "K,@Eq*v*n,&CL,=&=&ng@K,@Tw*qv*,mCnk*y"\
            "L,=QHch&ng@,]IDAJJA2)J*Qch,dC,U&UI=/&nH"\
           ",@\nOn,Hh*,\#{nHhL[&]},dQy,CY,MQHzmQL,my,"\
          "H/B*,qCv*,gQv*,HC,m*:\n@I&JdCwnHCD2),dC,UjU"\
         "I=/&nH,@,\#{q&n*L[j]}\n@I*ndI=/&nHDD&,ZZ,A)"\
                             "?,@,"\
                             ",G@,:"\
                             ",@,"\
                             "Gnd,Q"\
                             "@)I=/"\
               "&nH,@,n*w,v*/L&Cn,CY,RBby!\n@I*nd"\
                "I".tr(' ID/VHLYGBqCA&|*UQJ=Z@K,',
                  '+;(r/tsfAulo1i8e|a.p=", '))

----- cut here -----

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
## Dreaming of a Ruby Christmas (#187)

It's six more days of Advent, and then... Christmas! Your task is to create
a Ruby script that celebrates Christmas. Create a virtual, ASCII Christmas
tree completely with blinking lights. Or a countdown calendar 'til December
25th. Or a script that generates the lyrics to _The Twelve Days of
Christmas_. Or whatever you like: some Christmas creativity.

And... Merry Christmas and a Happy New Year!!!

I doubt I will find time to do more with this, so Merry Christmas:

cat RbMasTry.rb

#!/usr/bin/env jruby
require 'java'
require 'mathn'

JFrame = javax.swing.JFrame
JPanel = javax.swing.JPanel
Color = java.awt.Color

frame = JFrame.new("Merry JRuby Christmas")
frame.default_close_operation = JFrame::EXIT_ON_CLOSE
frame.set_size(300, 400)

frame.show

class RbMasTry < JPanel
  def paintComponent(graphics)
    super(graphics)

    [
      [400, 150, 50, 125, 50, 400, 50, 50, 50],
      [300, 150, 200, 50, 200, 350, 0, 200, 0],
      [200, 150, 100, 75, 150, 250],
      [100, 150, 50, 100, 100, 150],
    ].each do |a|
      graphics.set_color(Color.new(*a[6..8])) if a[6]

      a[0].times do
        graphics.draw_line(a[1], a[2], a[3] + rand(a[4]), a[5])
      end
    end

    graphics.set_color(Color.new(255, 255, 0))

    360.times do
      graphics.draw_line(
        150, 50,
        150 + rand(25) * Math.sin(rand(2 * Math::PI)),
         50 + rand(25) * Math.cos(rand(2 * Math::PI))
      )
    end

    graphics.set_color(Color.new(255, 255, 255))

    rand(90).times do
      x, y = rand(300), rand(400)
      rand(180).times do
        graphics.draw_line(
          x, y,
          x + rand(5) * Math.sin(rand(2 * Math::PI)),
          y + rand(5) * Math.cos(rand(2 * Math::PI))
        )
      end
    end
  end
end

tree = RbMasTry.new
frame.add(tree)
tree.repaint
tree.revalidate

···

On Fri, Dec 19, 2008 at 3:08 PM, Matthew Moss <matt@moss.name> wrote:

P.S. Yes, I'm politically-incorrect. That said, if you'd rather celebrate
Hanukkah, Kwanzaa, New Year's or another holiday using Ruby script, please
do!

So I leave it to the user which message to display :wink:
I personally would chose

Health, Love and Peace for All on this World

But if you run my solution with this text you need some patience....

http://pastie.org/346680

Cheers
Robert

I feel compelled to express my sheer amazement. Thank you, Glen, you have made my holiday!

- Josh

···

On Dec 20, 2008, at 2:33 AM, Glen F. Pankow wrote:

Matthew Moss wrote:

## Dreaming of a Ruby Christmas (#187)
It's six more days of Advent, and then... Christmas! Your task is to create a Ruby script that celebrates Christmas. Create a virtual, ASCII Christmas tree completely with blinking lights. Or a countdown calendar 'til December 25th. Or a script that generates the lyrics to _The Twelve Days of Christmas_. Or whatever you like: some Christmas creativity.
And... Merry Christmas and a Happy New Year!!!

Whenever I wrap Matzmas presents the wrapping turns out extremely
lumpy, crinkly, and stuck with gobs of tape everywhere, and the
contents are always disappointing. This script is no exception.

Take the stuff between the '----- cut here -----' lines and save it in
a file, e.g. 'matzmas.rb'. Feed it to ruby, e.g., 'ruby matzmas.rb'.

Please don't try to learn anything from this code!

- Glen

----- cut here -----

              ### M E R R Y M A T Z M A S ###

                            "/|"\
                        "/wl)e";eval(\
                           "A | A"\
                          "A | A"\
                              \
                           "InHhL"\
                          ",Z,%w{-"\
                         ",Y&/LH,L*"\
                        "cCnd,Hh&/d,"\
                       "YCB/Hh,Y&YHh,"\
                      "L&xHh,L*v*nHh,*"\
                     "&ghHh,n&nHh,H*nHh"\
                    ",*q*v*nHh,Hw*qv*Hh}"\
                   "Iq&n*L,Z,[,n&qK,n&qK,"\
                  "@TwC,LH/&ng,gLBbL@K,@Th"\
                 "/**,YC/k*d,Hh/*QdL@K,@FCB"\
                "/,cQqq&ng,=/CcL@K,@F&v*,RBb"\
               "y,g*mL!@K,@S&x,mQ/LhQqL,dBm=&"\
              "ng@K,@S*v*n,dBckL,Q-Hy=&ng@K,@E"\
             "&ghH,d&/L,Q-gqCbb&ng@K,@N&n*,/Qng"\
            "*L,LH*==&ng@K,@T*n,H/yL,Q-cQHch&ng@"\
           "K,@Eq*v*n,&CL,=&=&ng@K,@Tw*qv*,mCnk*y"\
          "L,=QHch&ng@,]IDAJJA2)J*Qch,dC,U&UI=/&nH"\
         ",@\nOn,Hh*,\#{nHhL[&]},dQy,CY,MQHzmQL,my,"\
        "H/B*,qCv*,gQv*,HC,m*:\n@I&JdCwnHCD2),dC,UjU"\
       "I=/&nH,@,\#{q&n*L[j]}\n@I*ndI=/&nHDD&,ZZ,A)"\
                           "?,@,"\
                           ",G@,:"\
                           ",@,"\
                           "Gnd,Q"\
                           "@)I=/"\
             "&nH,@,n*w,v*/L&Cn,CY,RBby!\n@I*nd"\
              "I".tr(' ID/VHLYGBqCA&|*UQJ=Z@K,',
                '+;(r/tsfAulo1i8e|a.p=", '))

----- cut here -----

Hi, I was wondering about this expression and its siblings:

Math.sin(rand(2 * Math::PI))

The documentation
<module Kernel - RDoc Documentation that
rand(num) will pick a random integer between 0 and num.abs.to_i
(unless this is different in JRuby). Therefore, the only values that can
come out of this expression are sin(0), sin(1), ... sin(6) which are 0,
.841, .909, .141, -.757, -.960, and -.279 (of course these are different for
cosine). Is it just the range -1<y<1? Would rand(2)-1 suffice? What is
the significance of these numbers and doing rand(2pi) instead of rand(6)?

I did enjoy seeing a JRuby solution, especially a GUI-based one. Kudos.

Thanks,
Dan

···

On Mon, Dec 22, 2008 at 12:44 PM, <brabuhr@gmail.com> wrote:

On Fri, Dec 19, 2008 at 3:08 PM, Matthew Moss <matt@moss.name> wrote:
> -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
> ## Dreaming of a Ruby Christmas (#187)
>
> It's six more days of Advent, and then... Christmas! Your task is to
create
> a Ruby script that celebrates Christmas. Create a virtual, ASCII
Christmas
> tree completely with blinking lights. Or a countdown calendar 'til
December
> 25th. Or a script that generates the lyrics to _The Twelve Days of
> Christmas_. Or whatever you like: some Christmas creativity.
>
> And... Merry Christmas and a Happy New Year!!!

I doubt I will find time to do more with this, so Merry Christmas:

> cat RbMasTry.rb
#!/usr/bin/env jruby
require 'java'
require 'mathn'

JFrame = javax.swing.JFrame
JPanel = javax.swing.JPanel
Color = java.awt.Color

frame = JFrame.new("Merry JRuby Christmas")
frame.default_close_operation = JFrame::EXIT_ON_CLOSE
frame.set_size(300, 400)

frame.show

class RbMasTry < JPanel
def paintComponent(graphics)
   super(graphics)

   [
     [400, 150, 50, 125, 50, 400, 50, 50, 50],
     [300, 150, 200, 50, 200, 350, 0, 200, 0],
     [200, 150, 100, 75, 150, 250],
     [100, 150, 50, 100, 100, 150],
   ].each do |a|
     graphics.set_color(Color.new(*a[6..8])) if a[6]

     a[0].times do
       graphics.draw_line(a[1], a[2], a[3] + rand(a[4]), a[5])
     end
   end

   graphics.set_color(Color.new(255, 255, 0))

   360.times do
     graphics.draw_line(
       150, 50,
       150 + rand(25) * Math.sin(rand(2 * Math::PI)),
        50 + rand(25) * Math.cos(rand(2 * Math::PI))
     )
   end

   graphics.set_color(Color.new(255, 255, 255))

   rand(90).times do
     x, y = rand(300), rand(400)
     rand(180).times do
       graphics.draw_line(
         x, y,
         x + rand(5) * Math.sin(rand(2 * Math::PI)),
         y + rand(5) * Math.cos(rand(2 * Math::PI))
       )
     end
   end
end
end

tree = RbMasTry.new
frame.add(tree)
tree.repaint
tree.revalidate

I did make a few modifications:
  * removed unnecessary require
  * removed unnecessary trig functions
  * changed background color to black
  * "animated" the star :slight_smile:
  * removed the snow :frowning:
I never did get around to:
  * decorating the tree
  * putting presents under the tree

http://github.com/fjc/rubyquiz/tree/master/187

#!/usr/bin/env jruby
require 'java'

JFrame = javax.swing.JFrame
JPanel = javax.swing.JPanel
Color = java.awt.Color

frame = JFrame.new("Merry JRuby Christmas")
frame.default_close_operation = JFrame::EXIT_ON_CLOSE
frame.set_size(300, 400)

frame.show

class RbMasTry < JPanel
  def paintComponent(graphics)
    super(graphics)

    srand(@tree_seed ||= srand)
    [
      [400, 150, 50, 125, 50, 400, 50, 50, 50],
      [300, 150, 200, 50, 200, 350, 0, 200, 0],
      [200, 150, 100, 75, 150, 250],
      [100, 150, 50, 100, 100, 150],
    ].each do |a|
      graphics.set_color(Color.new(*a[6..8])) if a[6]

      a[0].times do
        graphics.draw_line(a[1], a[2], a[3] + rand(a[4]), a[5])
      end
    end
    srand

    graphics.set_color(Color.new(255, 255, 0))

    360.times do
      graphics.draw_line(
        150, 50,
        150 + rand(25) * (rand * 2 - 1),
         50 + rand(25) * (rand * 2 - 1)
      )
    end
  end
end

tree = RbMasTry.new
tree.background = Color.new(0, 0, 0)
frame.add(tree)

loop do
  tree.repaint
  tree.revalidate
  sleep 0.1
end

···

On Mon, Dec 22, 2008 at 12:44 PM, <brabuhr@gmail.com> wrote:

On Fri, Dec 19, 2008 at 3:08 PM, Matthew Moss <matt@moss.name> wrote:

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
## Dreaming of a Ruby Christmas (#187)

I doubt I will find time to do more with this, so Merry Christmas:

Well as I had to fix a bug, I made the random choice converging, now
we can have peace in less time :slight_smile:

http://pastie.org/346680

R.

···

On Thu, Dec 25, 2008 at 5:35 PM, Robert Dober <robert.dober@gmail.com> wrote:

P.S. Yes, I'm politically-incorrect. That said, if you'd rather celebrate
Hanukkah, Kwanzaa, New Year's or another holiday using Ruby script, please
do!

So I leave it to the user which message to display :wink:
I personally would chose

Health, Love and Peace for All on this World

But if you run my solution with this text you need some patience....

I agree, that's v cool :slight_smile:

···

On Sat, Dec 20, 2008 at 6:54 PM, Joshua Ballanco <jballanc@gmail.com> wrote:

I feel compelled to express my sheer amazement. Thank you, Glen, you have
made my holiday!

- Josh

On Dec 20, 2008, at 2:33 AM, Glen F. Pankow wrote:

Matthew Moss wrote:

## Dreaming of a Ruby Christmas (#187)
It's six more days of Advent, and then... Christmas! Your task is to
create a Ruby script that celebrates Christmas. Create a virtual, ASCII
Christmas tree completely with blinking lights. Or a countdown calendar 'til
December 25th. Or a script that generates the lyrics to _The Twelve Days of
Christmas_. Or whatever you like: some Christmas creativity.
And... Merry Christmas and a Happy New Year!!!

Whenever I wrap Matzmas presents the wrapping turns out extremely
lumpy, crinkly, and stuck with gobs of tape everywhere, and the
contents are always disappointing. This script is no exception.

Take the stuff between the '----- cut here -----' lines and save it in
a file, e.g. 'matzmas.rb'. Feed it to ruby, e.g., 'ruby matzmas.rb'.

Please don't try to learn anything from this code!

- Glen

----- cut here -----

             ### M E R R Y M A T Z M A S ###

                           "/|"\
                       "/wl)e";eval(\
                          "A | A"\
                         "A | A"\
                             \
                          "InHhL"\
                         ",Z,%w{-"\
                        ",Y&/LH,L*"\
                       "cCnd,Hh&/d,"\
                      "YCB/Hh,Y&YHh,"\
                     "L&xHh,L*v*nHh,*"\
                    "&ghHh,n&nHh,H*nHh"\
                   ",*q*v*nHh,Hw*qv*Hh}"\
                  "Iq&n*L,Z,[,n&qK,n&qK,"\
                 "@TwC,LH/&ng,gLBbL@K,@Th"\
                "/**,YC/k*d,Hh/*QdL@K,@FCB"\
               "/,cQqq&ng,=/CcL@K,@F&v*,RBb"\
              "y,g*mL!@K,@S&x,mQ/LhQqL,dBm=&"\
             "ng@K,@S*v*n,dBckL,Q-Hy=&ng@K,@E"\
            "&ghH,d&/L,Q-gqCbb&ng@K,@N&n*,/Qng"\
           "*L,LH*==&ng@K,@T*n,H/yL,Q-cQHch&ng@"\
          "K,@Eq*v*n,&CL,=&=&ng@K,@Tw*qv*,mCnk*y"\
         "L,=QHch&ng@,]IDAJJA2)J*Qch,dC,U&UI=/&nH"\
        ",@\nOn,Hh*,\#{nHhL[&]},dQy,CY,MQHzmQL,my,"\
       "H/B*,qCv*,gQv*,HC,m*:\n@I&JdCwnHCD2),dC,UjU"\
      "I=/&nH,@,\#{q&n*L[j]}\n@I*ndI=/&nHDD&,ZZ,A)"\
                          "?,@,"\
                          ",G@,:"\
                          ",@,"\
                          "Gnd,Q"\
                          "@)I=/"\
            "&nH,@,n*w,v*/L&Cn,CY,RBby!\n@I*nd"\
             "I".tr(' ID/VHLYGBqCA&|*UQJ=Z@K,',
               '+;(r/tsfAulo1i8e|a.p=", '))

----- cut here -----

No significance other than trying to finish before 1:00. :slight_smile: Maybe
I was thinking: sin(rand * 2 * PI? But, yeah rand * 2 - 1 would have
sufficed there.

Thanks.

···

On Mon, Dec 22, 2008 at 7:27 PM, Daniel Finnie <dan@danfinnie.com> wrote:

Hi, I was wondering about this expression and its siblings:

Math.sin(rand(2 * Math::PI))

The documentation
<module Kernel - RDoc Documentation that
rand(num) will pick a random integer between 0 and num.abs.to_i
(unless this is different in JRuby). Therefore, the only values that can
come out of this expression are sin(0), sin(1), ... sin(6) which are 0,
.841, .909, .141, -.757, -.960, and -.279 (of course these are different for
cosine). Is it just the range -1<y<1? Would rand(2)-1 suffice? What is
the significance of these numbers and doing rand(2pi) instead of rand(6)?