2012年2月13日月曜日

開発環境

『初めてのプログラミング 第2版』(Chris Pine 著、長尾 高弘 訳、オライリー・ジャパン、2010年、ISBN978-4-87311-469-9)の10章(章全部で復習), 10.3(練習問題)シャッフルを解いてみる。

その他参考書籍

シャッフル

再帰を使ったもの。

コード(TextWrangler)

#!/usr/bin/env ruby
#encoding: utf-8

def shuffle some_array
  recursive_shuffle some_array, []
end
def recursive_shuffle some_array, shuffled_array
  return shuffled_array if some_array.length == 0
  l = some_array.length
  r = rand(l)
  tmp_array = []
  (0..(l-1)).each do |i|
    if r == i
      shuffled_array.push some_array[i]
    else
      tmp_array.push some_array[i]
    end
  end
  recursive_shuffle tmp_array, shuffled_array
end

array = [0,1,2,3,4,5,6,7,8,9]
puts array
5.times do
  puts '再帰でシャッフル'
  puts shuffle array
end

入出力結果(Terminal)

$ ./ruby_program.rb
0
1
2
3
4
5
6
7
8
9
再帰でシャッフル
4
2
1
6
7
5
8
0
3
9
再帰でシャッフル
1
6
0
2
3
8
9
5
4
7
再帰でシャッフル
9
3
5
1
7
6
8
2
0
4
再帰でシャッフル
2
0
5
7
1
8
6
4
9
3
再帰でシャッフル
1
5
8
6
7
4
3
9
0
2
$

再帰を使わないバージョン。

コード(TextWrangler)

#!/usr/bin/env ruby
#encoding: utf-8

def shuffle some_array
  shuffled_array = []
  while some_array.length > 0
    l = some_array.length
    r = rand(l)
    tmp_array = []
    (0..(l-1)).each do |i|
      if r == i
        shuffled_array.push some_array[i]
      else
        tmp_array.push some_array[i]
      end
    end
    some_array = tmp_array
  end
  shuffled_array
end

array = [0,1,2,3,4,5,6,7,8,9]
puts array
5.times do
  puts 'シャッフル'
  puts shuffle array
end

もちろん入出力結果は再帰のバージョンと同じ。

入出力結果(Terminal)

 ./ruby_program.rb
0
1
2
3
4
5
6
7
8
9
シャッフル
2
3
9
8
5
7
0
4
1
6
シャッフル
0
6
2
1
5
4
3
9
8
7
シャッフル
5
9
3
1
7
6
2
0
8
4
シャッフル
9
7
5
4
6
1
3
2
8
0
シャッフル
8
4
5
6
0
2
1
9
7
3
$

本書を続けつつ、上記の本を入手したらそっちに切り替え。

0 コメント:

コメントを投稿