読者です 読者をやめる 読者になる 読者になる

simanのブログ

ゆるふわプログラマー。競技プログラミングやってます。Ruby好き

rubyで掛け算九九の表示

rubyで掛け算九九を書いてみました。

puts "+--+--+--+--+--+--+--+--+--+--+"
puts "|  | 1| 2| 3| 4| 5| 6| 7| 8| 9|"
puts "+--+--+--+--+--+--+--+--+--+--+"
puts "| 1| 1| 2| 3| 4| 5| 6| 7| 8| 9|"
puts "+--+--+--+--+--+--+--+--+--+--+"
puts "| 2| 2| 4| 6| 8|10|12|14|16|18|"
puts "+--+--+--+--+--+--+--+--+--+--+"
puts "| 3| 3| 6| 9|12|15|18|21|24|27|"
puts "+--+--+--+--+--+--+--+--+--+--+"
puts "| 4| 4| 8|12|16|20|24|28|32|36|"
puts "+--+--+--+--+--+--+--+--+--+--+"
puts "| 5| 5|10|15|20|25|30|35|40|45|"
puts "+--+--+--+--+--+--+--+--+--+--+"
puts "| 6| 6|12|18|24|30|36|42|48|54|"
puts "+--+--+--+--+--+--+--+--+--+--+"
puts "| 7| 7|14|21|28|35|42|49|56|63|"
puts "+--+--+--+--+--+--+--+--+--+--+"
puts "| 8| 8|16|24|32|40|48|56|64|72|"
puts "+--+--+--+--+--+--+--+--+--+--+"
puts "| 9| 9|18|27|36|45|54|63|72|81|"
puts "+--+--+--+--+--+--+--+--+--+--+"
+--+--+--+--+--+--+--+--+--+--+
|  | 1| 2| 3| 4| 5| 6| 7| 8| 9|
+--+--+--+--+--+--+--+--+--+--+
| 1| 1| 2| 3| 4| 5| 6| 7| 8| 9|
+--+--+--+--+--+--+--+--+--+--+
| 2| 2| 4| 6| 8|10|12|14|16|18|
+--+--+--+--+--+--+--+--+--+--+
| 3| 3| 6| 9|12|15|18|21|24|27|
+--+--+--+--+--+--+--+--+--+--+
| 4| 4| 8|12|16|20|24|28|32|36|
+--+--+--+--+--+--+--+--+--+--+
| 5| 5|10|15|20|25|30|35|40|45|
+--+--+--+--+--+--+--+--+--+--+
| 6| 6|12|18|24|30|36|42|48|54|
+--+--+--+--+--+--+--+--+--+--+
| 7| 7|14|21|28|35|42|49|56|63|
+--+--+--+--+--+--+--+--+--+--+
| 8| 8|16|24|32|40|48|56|64|72|
+--+--+--+--+--+--+--+--+--+--+
| 9| 9|18|27|36|45|54|63|72|81|
+--+--+--+--+--+--+--+--+--+--+

何の工夫もありません。「クソコード」です。例えば「4*4の表を作ってよ」とか言われたら書きなおす手間が半端ではありません。
 

変数を使う

プログラミングでは上記の用に数字を直接記述するのはあまり好まれません。なぜなら、先ほどのように「4*4」の表を作るみたいなことになると。大幅な変更が発生します。これでは「楽をしたいために書いた」プログラムが「変更に苦痛を伴う」プログラムに変化してしまい、良くないです。


なので、改良案では2つの変数a,bて用意して「a*b」の表を作成することにします。

a = 9
b = 9
size = (a*b).to_s.size

puts ('+'+'-'*size)*(b+1)+"+"
print '|'+' '*size
1.upto(b) do |m|
  print "|%#{size}d" % [m]
end

puts '|'
puts ('+'+'-'*size)*(b+1)+"+"
1.upto(a) do |n|
  print "|%#{size}d" % [n]
  1.upto(b) do |m|
    print "|%#{size}d" % [n*m]
  end
  puts '|'
  puts ('+'+'-'*size)*(b+1)+"+"
end
+--+--+--+--+--+--+--+--+--+--+
|  | 1| 2| 3| 4| 5| 6| 7| 8| 9|
+--+--+--+--+--+--+--+--+--+--+
| 1| 1| 2| 3| 4| 5| 6| 7| 8| 9|
+--+--+--+--+--+--+--+--+--+--+
| 2| 2| 4| 6| 8|10|12|14|16|18|
+--+--+--+--+--+--+--+--+--+--+
| 3| 3| 6| 9|12|15|18|21|24|27|
+--+--+--+--+--+--+--+--+--+--+
| 4| 4| 8|12|16|20|24|28|32|36|
+--+--+--+--+--+--+--+--+--+--+
| 5| 5|10|15|20|25|30|35|40|45|
+--+--+--+--+--+--+--+--+--+--+
| 6| 6|12|18|24|30|36|42|48|54|
+--+--+--+--+--+--+--+--+--+--+
| 7| 7|14|21|28|35|42|49|56|63|
+--+--+--+--+--+--+--+--+--+--+
| 8| 8|16|24|32|40|48|56|64|72|
+--+--+--+--+--+--+--+--+--+--+
| 9| 9|18|27|36|45|54|63|72|81|
+--+--+--+--+--+--+--+--+--+--+

正直な話、これはこれでクソコードです(読みにくい)。しかし、前回より格段に良くなった点はaとbの値を変更するだけで、好きな掛け算表が生成できることです!


a=4, b=4の場合

+--+--+--+--+--+
|  | 1| 2| 3| 4|
+--+--+--+--+--+
| 1| 1| 2| 3| 4|
+--+--+--+--+--+
| 2| 2| 4| 6| 8|
+--+--+--+--+--+
| 3| 3| 6| 9|12|
+--+--+--+--+--+
| 4| 4| 8|12|16|
+--+--+--+--+--+

a = 10, b = 2の場合

+--+--+--+
|  | 1| 2|
+--+--+--+
| 1| 1| 2|
+--+--+--+
| 2| 2| 4|
+--+--+--+
| 3| 3| 6|
+--+--+--+
| 4| 4| 8|
+--+--+--+
| 5| 5|10|
+--+--+--+
| 6| 6|12|
+--+--+--+
| 7| 7|14|
+--+--+--+
| 8| 8|16|
+--+--+--+
| 9| 9|18|
+--+--+--+
|10|10|20|
+--+--+--+

これでどのような要求が来ても「aとbの値を変更するだけ」で表が作成できるようになりました。

このようにプログラミングでは、変更が容易」なコードが重視されます。上記の改良したコードもまだまだ変更点がいっぱいあると思うので、自分なりに改良してみたり、書籍を漁ってダメなところをどんどん修正していって下さい。いっそのこと「こんなクソコードなんて捨ててしまえ」と思うのもありです。(僕が上のコードを使うことはないでしょう)