テストを思いついたら9割り完成


数字の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