Benji Flaming

25 CD giveaway


Previous | Random | Next

In keeping with the proverbial “Christmas spirit”, this December 25th I will be mailing out 25 copies of my solo banjo CD to randomly-selected subscribers to my e-mail list. I’ll also be sending everyone on my e-mail list a link to download an MP3 of my solo banjo Carol of the Bells arrangement.

If you are already subscribed, but you aren’t sure whether you provided your zip/postal code when you signed up (the random-selection program will ignore entries with no zip/postal code), you can check or update your subscription info at:

If you are interested in the precise technical details of how the selection process will be handled, below is the complete code listing. It is written in Ruby, although it is not written in particularly good Ruby. I’m a little out-of-practice at the moment, but this is what I cooked up in an hour:

#!/usr/bin/env ruby
# choosewinner.rb

require 'csv'

# These could be parsed from the command-line, if I wrote Ruby more often.
filename = 'entries.csv'
winner_list_filename = 'winners.csv'
winner_count = 25

# empty arrays
entries = []
eligible = []
winners = []

puts "Opening and processing #{filename}", 'r') do |row|
 entries << row
puts "Read #{entries.length} lines"

# The first line of the CSV file contains the column names.  We remove it from
# the list of entries, and extract the column indices from it.
column_names = entries.shift
zipcode = column_names.index("zip")
email = column_names.index("email")
firstname = column_names.index("firstname")
lastname = column_names.index("lastname")

# discard entries which are missing a zipcode or e-mail address
entries.each do |entry|
 eligible << entry if entry[zipcode] and entry[email]
puts "Found #{eligible.length} eligible entries out of #{entries.length} total"

# randomly select each winning entry, and remove it from the pool
winner_count.times do
 winner_index = rand(eligible.length)
 winners << eligible[winner_index]
puts "Got #{winners.length} winners:"
puts "----------------------------------------"

# display a summary onscreen, and write the details to a file, 'w') do |winner_list|

 # preserve column names from original CSV file
 winner_list.puts column_names.join(',')

 winners.each do |winner|
  puts "#{winner[firstname]} #{winner[lastname]} #{winner[email]}"
  winner_list.puts winner.join(',')
puts "----------------------------------------"
puts "Detailed results written to #{winner_list_filename}"

Where to next?

Copyright © 1998-2022 Benjamin Flaming
All rights reserved.