forとwhileの合わせ技

下記のような表を作れ、といった問題がどこかのサイトにありました。 少し考えて分からなかったので、答えをみよう、と解答ページを探したのですが、 その解答がどこにあるのか判りませんでした。仕方がないので、自分で考えて導き出したのが下記↓

思考訓練にちょうど良いかと思いましたので、載せておきます。

多分これよりも良い方法はいっぱいあると思うのですが参考までに載せておきます。 私の方法を見る前に、一度、自分で考えてプログラムを書いてみると勉強になると思います。

  1   2   3   4   5   6   7   8   9  10  11  12
  2   4   6   8  10  12  14  16  18  20  22  24
  3   6   9  12  15  18  21  24  27  30  33  36
  4   8  12  16  20  24  28  32  36  40  44  48
  5  10  15  20  25  30  35  40  45  50  55  60
  6  12  18  24  30  36  42  48  54  60  66  72
  7  14  21  28  35  42  49  56  63  70  77  84
  8  16  24  32  40  48  56  64  72  80  88  96
  9  18  27  36  45  54  63  72  81  90  99 108
 10  20  30  40  50  60  70  80  90 100 110 120
 11  22  33  44  55  66  77  88  99 110 121 132
 12  24  36  48  60  72  84  96 108 120 132 144
						
#!/usr/bin/env python
# coding=utf-8 #今回の場合はこの表記はいりません。一気に書いてしまうクセです (^_^;)

cntr = 1

while cntr < 13:
    for i in range(1, 13):
        print str(i * cntr).rjust(3),
    print
    i = 0
    cntr += 1
						

python3だと↓

#!/usr/bin/env python
# coding=utf-8

cntr = 1

while cntr <=12:
    for i in range(1, 13):
        print(str(i * cntr).rjust(4), end="")
    print()
    i = 0
    cntr += 1
						

javaだとこんな感じでしょうか?↓

package multiplication.rogmicart.rogmic;

public class MultiplicationTable {

	public static void main(String[] args) {
		int counter = 1;
		while (counter < 13) {
			for (int i = 1; i < 13; i++) {
				int tempAnswer = i*counter;
				System.out.print(String.format("%1$4d", tempAnswer));
			}
			System.out.println();
			counter++;
		}
	}

}
						

お題 その1

こんな表を作ってみよう!

 0 1 2 3 4 5 6 7 8 9
   0 1 2 3 4 5 6 7 8
     0 1 2 3 4 5 6 7
       0 1 2 3 4 5 6
         0 1 2 3 4 5
           0 1 2 3 4
             0 1 2 3
               0 1 2
                 0 1
                   0
						
cntr = 10
space = 0
range(cntr)

while space < 10:
    print "  " * space, #スペース2つ
    for i in range(cntr):
        print i,
    cntr  -= 1
    space += 1
    print
						

print " " * space,のスペースを1つにすると下記のようになります (上の表を作ろうと思って偶然出来ました)。

 0 1 2 3 4 5 6 7 8 9
  0 1 2 3 4 5 6 7 8
   0 1 2 3 4 5 6 7
    0 1 2 3 4 5 6
     0 1 2 3 4 5
      0 1 2 3 4
       0 1 2 3
        0 1 2
         0 1
          0
						

ljust(), rjust(), center()

文字列の見た目を良くしてくれるありがたいメソッドです。例えば、ljust(10)だと、 10文字分の空間を確保して左詰めでその中に指定した文字列を表示してくれます。

center()なら中央、rjust()は右詰め、といった具合です。

>>> a = "ham"
>>> a.center(10)
'   ham    '
>>> a.rjust(10)
'       ham'
>>> a.ljust(10)
'ham       '
						

ですから下記のとおりような使い方をすると、とても綺麗に表示されます

>>> a = "Ham"
>>> b = "Spam"
>>> c = "Egg"
>>> a.rjust(10)
'       Ham'
>>> b.rjust(10)
'      Spam'
>>> c.rjust(10)
'       Egg'
						

ですが日本語になると、こんな感じ↓

#!/usr/bin/env python
# coding=utf-8

a = "日本語"
b = "英語"
c = "スペイン語"
d = u"日本語"
e = u"英語"
f = u"スペイン語"
g = "Japanese"
h = "English"
i = "Spanish"

print a.rjust(10)
print b.rjust(10)
print c.rjust(10)
print d.rjust(10)
print e.rjust(10)
print f.rjust(10)
print g.rjust(10)
print h.rjust(10)
print i.rjust(10)

# 実行結果

 日本語
    英語
スペイン語
       日本語
        英語
     スペイン語
  Japanese
   English
   Spanish