降順と昇順を組み合わせたソート - わさっきの答え(Rubyスクリプト)を書く前に,ソートのためのデータを生成しないといけません.
#!/usr/bin/env ruby # ddgenerator.rb require 'date' require 'pp' def generate(seed = 20080722, date_from = Date.new(2008, 4, 1), date_to = Date.new(2009, 3, 31)) srand(seed) if seed array = [] date_from.upto(date_to) do |date| num_max = rand(10) 1.upto(num_max) do |num| array.insert(rand(array.size + 1), "#{date.strftime('%Y%m%d')}-#{num}") end end array end pp generate
乱数のシードと,日付の最初と最後を引数にとり,"YYYYMMDD-N"の文字列を生成して,配列にランダムに挿入していきます.Nすなわち通し番号の最大値は,1以上9以下で,年月日(というか乱数系列)によって変わります.
Date型オブジェクトに対してuptoを使う例は,1日1行カレンダー - わさっきにもあります.
配列の要素の並びをランダムにする*1には,shuffleメソッドもありますが,あえて使っていません.挿入の処理で,「rand(array.size + 1)」のところを「rand(array.size)」とすると,最初に挿入した値(デフォルトの呼び出しだと "20080401-1")が,常に配列の最後になってしまいます.
*1:それをしないと,ソートするのが無駄です.まあ,今回の問題を考えるのが時間の無駄と言われればそこまでですが.