LCD Numbers

代码如下:

# 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


      __   __        __   __   __   __   __   __
   |    |    | |  | |    |       | |  | |  | |  |
   |  __|  __| |__| |__  |__     | |__| |__| |  |
   | |       |    |    | |  |    | |  |    | |  |
   | |__   __|    |  __| |__|    | |__|  __| |__|

肯定还有更优方案,有时间在网上找找。

你可能感兴趣的:(LCD Numbers)