数字の24は2x2x2x3です。2の3乗掛ける3です。これを書き表すのに2,2,2,3と書いてもいいし、[2,3], [3,1]と書いてもいいし、2^3x3と書いてもいい。過去の自分の記事をみると、[2, 2, 2, 3]というように配列に入れている場合と、{2 => 3, 3 = 1}の二通りがありました。[ [2,3], [3,1] ]というのはなかった。さて、プログラムのアウトプットとしては、2x2x2x3もしくは2^3x3と書く必要があると思います。けさ思いついたのは以下の3つの関数です。
hash2facts #{2 => 3, 3 = 1}というような表記を[2, 2, 2, 3]というような表記に変換
facts2hash #逆に[2, 2, 2, 3]を{2 => 3, 3 = 1}に変換
facts2string #[2, 2, 2, 3]を"2x2x2x3"という文字列に変換
次にテストを作りました。はじめは枠組みだけ作って、テスト内容は順次足しながら、プログラムを作りながらで、しばらくしたら出来上がり。
# test_pfacts.rb require 'test/unit' require 'pfacts' class Tests < Test::Unit::TestCase def test_hash2facts assert_equal([], hash2facts({})) assert_equal([2], hash2facts({2 => 1})) assert_equal([], hash2facts({2 => 0})) assert_equal([2, 2, 2, 3], hash2facts({2 => 3, 3 => 1})) end def test_facts2hash assert_equal({}, facts2hash([])) assert_equal({2 => 1}, facts2hash([2])) assert_equal({2 => 3, 3 => 1}, facts2hash([2, 2, 3, 2])) end def test_facts2string assert_equal("", facts2string([])) assert_equal("2", facts2string([2])) assert_equal("2x2x2x3", facts2string([2, 2, 2, 3])) end end
不思議なのが、出来上がってエラーがないということは誰か(自分)がプログラムしたに違いないのですが、あたまがからっぽ。思い出せない。これでいいのか。これではつみあがらないのではないか? いや、そんなことはない。プログラムを書き続ければ、人類は無限に進化する。どちらが正しいのだろうか。
とりあえず書いた回答を載せておきます。
def hash2facts(hash) ary = [] hash.each{ |key, num| while num > 0 ary.push(key) num = num - 1 end } return ary end def facts2hash(factsarray) hash = {} factsarray.each { |num| hash[num] ? hash[num] = hash[num] + 1 : hash[num] = 1 } return hash end def facts2string(factsarray) factsstring = "" (factsarray.size - 1).times { |i| factsstring = factsstring + factsarray[i].to_s + "x" } factsstring = factsstring + factsarray[-1].to_s end