軽くRubyを触ってみた。

触りついでに会社にあるOJT用の問題を解いてみた。
エラーハンドリングなどは漏れ漏れだけどまぁ暇つぶしなのでご容赦を。*1

階乗

#!/usr/bin/ruby
=begin
入力した数値の階乗を計算して出力するプログラムを作成する。
※ただしfor文やwhile文を使用してはいけない。
=end

## 階乗処理
def calc_factorial(i)
	if i == 1
		return i
	end
	
	return i * calc_factorial((i - 1))
end

## main
# 引数チェック
unless $*.length == 1
	puts "usage: ./factorial1.rb integer number"
	exit 0
end

# 階乗処理
rslt = calc_factorial($*[0].to_i)

# 出力処理
printf("%sの階乗は%dです。\n", $*[0], rslt)

ピラミッド

#!/usr/bin/ruby
=begin
正の整数nが与えられたときに、高さnのピラミッドを出力するプログラムを作ってください。
=end

## 出力処理
def printf_pyramid(length_max, length_now)
	if length_now > length_max
		return
	end
	
	#ピラミッド部分
	pyramid = Array.new((length_now * 2 - 1), '*')
	#出力
	printf("%*s%s\n", (length_max - length_now), "", pyramid)

	printf_pyramid(length_max, (length_now + 1))
end

## main
# 引数チェック
unless $*.length == 1
	puts "usage: ./pyramid.rb integer number"
	exit 0
end

# 出力処理
printf_pyramid($*[0].to_i, 1)

星座判定

#!/usr/bin/ruby
=begin
入力された誕生日に対応する星座の名前(英語表記)を出力して終了するプログラムを作成してください。
=end

## 星座クラス
class Zodiac
	def initialize(name_jp, name_eng, date_begin, date_end)
		@name_jp = name_jp
		@name_eng = name_eng
		@date_begin = date_begin
		@date_end = date_end
	end
	
	def get_name_jp
		return @name_jp
	end
	
	def get_name_eng
		return @name_eng
	end
	
	def is_MyZodiac(date)
		if date < @date_begin.to_i
			return false
		elsif @date_end.to_i < date
			return false
		end
		
		return true
	end
end

## main
# 引数チェック
unless $*.length == 1
	puts "usage: ./zodiac MMDD"
	exit 1
end
unless $*[0].length == 4
	puts "usage: ./zodiac MMDD"
	exit 1
end

# 星座情報初期化
# 山羊座は年をまたぐので二つに分ける。
zodiac_info = Array.new(14, 0)
zodiac_info[0]  = Zodiac.new("おひつじ座",	"Aries"			, "0321", "0419")
zodiac_info[1]  = Zodiac.new("おうし座",	"Taurus"		, "0420", "0520")
zodiac_info[2]  = Zodiac.new("ふたご座",	"Gemini"		, "0521", "0621")
zodiac_info[3]  = Zodiac.new("かに座",		"Cancer"		, "0622", "0722")
zodiac_info[4]  = Zodiac.new("しし座",		"Leo"			, "0723", "0822")
zodiac_info[5]  = Zodiac.new("おとめ座",	"Virgo"			, "0823", "0922")
zodiac_info[6]  = Zodiac.new("てんびん座",	"Libra"			, "0923", "1023")
zodiac_info[7]  = Zodiac.new("さそり座",	"Scorpius"		, "1024", "1121")
zodiac_info[8]  = Zodiac.new("いて座",		"Sagittarius"	, "1122", "1221")
zodiac_info[9]  = Zodiac.new("やぎ座",		"Capricornus"	, "1222", "1231")
zodiac_info[10] = Zodiac.new("やぎ座",		"Capricornus"	, "0101", "0119")
zodiac_info[11] = Zodiac.new("みずがめ座",	"Aquarius"		, "0120", "0218")
zodiac_info[12] = Zodiac.new("うお座",		"Pisces"		, "0219", "0320")
zodiac_info[13] = Zodiac.new("星座なし",	"no Zodiac"		, "0000", "9999")

# 星座情報取得
for zodiac_info_now in zodiac_info
	if zodiac_info_now.is_MyZodiac($*[0].to_i) == true
		break
	end
end

# 出力
printf("%s's zodiac is %s.\n", $*[0], zodiac_info_now.get_name_eng)

触った感じ

bashC++あたりを混ぜて使い勝手のいいところを合わせた感じ。
知識として知らない所ももちろんあったけど概ねネットで検索したら分かるレベル。
まぁ組んだ問題レベルが問題レベルってのもあるけどね。

うーん、Ruby面白いかも。

*1:とはいえ公開してる以上不備や改善点は大歓迎です。