見出し画像

「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()

いいなと思ったら応援しよう!