「Python で文字図形を描く」のコードを考えてみた
はじめに
大森武さんの「Python で文字図形を描く」のコードを考えてみました。
図形1 四角形
◯◯◯◯◯
◯◯◯◯◯
◯◯◯◯◯
◯◯◯◯◯
◯◯◯◯◯
for _ in range(5):
print("◯" * 5)
「 "◯" * 5 」の利用は、出題の意図と違うと思いますが。
print(("◯"*5 + "\n") * 5)
for も使っていません。「 "\n" 」で改行します。
図形2 三角形
◇
◇◇
◇◇◇
◇◇◇◇
◇◇◇◇◇
for i in range(1, 6):
print("◇" * i)
図形3 三角形+三角形で四角形
☆☆☆☆☆◯
☆☆☆☆◯◯
☆☆☆◯◯◯
☆☆◯◯◯◯
☆◯◯◯◯◯
for i in range(1,6):
print('☆'*(6 - i) + '◯'*i)
図形4 ばかばかばか
ばかばかば
かばかばか
ばかばかば
かばかばか
ばかばかば
for i in range(5):
print(("ばか" * 3)[i%2:i%2 + 5])
"ばかばかばか" から、スライス「 [i%2:i%2 + 5] 」を用いて抽出しています。
i%2 は
i = 0, 2, 4 のとき 0
i = 1, 3 のとき 1
よって、[i%2:i%2 + 5] は
i = 0, 2, 4 のとき [0:5]
i = 1, 3 のとき [1:6]
図形5 数値を順に
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
for i in range(1,26):
print(f'{i:>2d}', end=" ")
# print('{:>2d}'.format(i), end=" ")
if i % 5 ==0:
print()
Python3.6 から導入された「f 文字列」という仕組みを使っています。
Python3.6 より前では、コメントアウトしている「文字列メソッド format()」の方を使います。
図形6 数値を行ったり来たり
1 2 3 4 5
10 9 8 7 6
11 12 13 14 15
20 19 18 17 16
21 22 23 24 25
for i in range(5):
for j in range(5):
k = i%2 * (10*i + 6) + (-1)**i * (5*i + j + 1)
print(f'{k:>2d}', end=" ")
print()
強引に「 k = i%2 * (10*i + 6) + (-1)**i * (5*i + j + 1) 」を導き出しました。
図形7 数値の渦巻き
25 24 23 22 21
10 9 8 7 20
11 2 1 6 19
12 3 4 5 18
13 14 15 16 17
「深さ優先探索」を応用しました。もっとうまい方法があると思いますが。
# 5×5 の行列を作る。数値を記録するのに利用
m = [[0] * 5 for _ in range(5)]
# 数値を記録していく方向
# 右 下 左 上
dy = [0, 1, 0, -1]
dx = [1, 0, -1, 0]
# 25 から記録していく
y ,x = 0, -1 # スタート位置、dy[0], dx[0] を足したときに 0, 0 になるように
i = 0 # カウンターの初期値
j = 0 # 方向の番号
while i < 25:
ny, nx = y + dy[j], x + dx[j] # 次の位置
if 0<=ny<5 and 0<=nx<5 and m[ny][nx] == 0: # 範囲内でまだ記録していないなら
y, x = ny, nx # 次の位置に移動し
m[y][x] = 25 - i # 数値を記録
i += 1 # カウンターに 1 足す
else:
j = (j + 1) % 4 # 方向転換する
# 出力
for i in range(5):
for j in range(5):
print(f'{m[i][j]:>2d}', end=" ")
print()