代码如下:
# quiz2.rb
#LCD Numbers
def init_digit_number_data
#初始化一个LCD灯,假设灯是这样的:
# |_|
# |_|
# |_|
# 从左到右,从上到下依次为第0、1、2、3、4、5、6、7、8号位置。其中第0号和第2号永远不会亮。
#并且整个LCD灯是一个“3”x“3”(“3”行“3”列)的图形
number_hash = {}
#用"_"表示第1、4、7号位置,用"|"表示其它位置。
#而当位置不亮时,用空格" "表示。
space = " "
underline = "_"
vertical = "|"
# 这样就可以排出0~9对应的数组,数组的每一个位置中的值分别表示该位置应该显示什么
number_hash[0] = [space,underline,space,vertical,space,vertical,vertical,underline,vertical]
number_hash[1] = [space,space,space,space,space,vertical,space,space,vertical]
number_hash[2] = [space,underline,space,space,underline,vertical,vertical,underline,space]
number_hash[3] = [space,underline,space,space,underline,vertical,space,underline,vertical]
number_hash[4] = [space,space,space,vertical,underline,vertical,space,space,vertical]
number_hash[5] = [space,underline,space,vertical,underline,space,space,underline,vertical]
number_hash[6] = [space,underline,space,vertical,underline,space,vertical,underline,vertical]
number_hash[7] = [space,underline,space,space,space,vertical,space,space,vertical]
number_hash[8] = [space,underline,space,vertical,underline,vertical,vertical,underline,vertical]
number_hash[9] = [space,underline,space,vertical,underline,vertical,space,underline,vertical]
number_hash
end
def lcd(number=0,s=2)
#初始化数据
s = s.to_i
number_array = number.to_s.split("").map(&:to_i)
number_hash = init_digit_number_data
hash = {}
number_array.each {|ele| hash[ele] = number_hash[ele]}
#只能按行从上到下显示,因此只能先把每一行所有数字对应位置的值打印显示出来。
0.step(2) do |row|
#每一个数字只有3“行”,但每一行可能因为s的不同.每一个数字会有3*s小行
sub_row = 0
while sub_row != s
number_array.each_with_index do |ele,index|
#每一个数字只有3“列”,但每一列可能因为s的不同.每一个数字的每一行会有1+s+1列
#第一列是坚线,所以每一行只显示1列
print number_hash[ele][3*row]
#第二列是横线,所以每一行显示s列
#但不是每一行都显示横线,只有在每一“大行”的最后一个“小行”才显示横线,否则显示空格。
if sub_row == s - 1
s.times {print number_hash[ele][1+3*row]}
else
s.times {print " "}
end
#第三列是坚线,所以每一三行只显示1列
print number_hash[ele][2+3*row]
#当显示完最后一个数字的第三列后,才打印回车,从下一行的第一个数字的第一列开始显示。否则打印空格来隔开每一个数字。
print index == number_array.size-1 ? "\n" : " "*(s/10+1)
end
sub_row += 1
end
end
end
if $*.size == 1
if !($*[0] =~ /[^\d]+/)
lcd($*[0])
else
puts "must be number"
end
elsif $*.size == 3
if $*[0] == "-s" && !($*[1] =~ /[^\d]+/)
if !($*[2] =~ /[^\d]+/)
lcd($*[2], $*[1])
else
puts "must be number"
end
else
puts "wrong format"
end
else
puts "wrong args"
end
ruby lcd_number.rb -s 2 1234567890
__ __ __ __ __ __ __ __
| | | | | | | | | | | | | |
| __| __| |__| |__ |__ | |__| |__| | |
| | | | | | | | | | | | |
| |__ __| | __| |__| | |__| __| |__|
肯定还有更优方案,有时间在网上找找。