プログラム言語の文法を覚えても
どうやって書いたら良いか
まだまだ解らないよーって人多いと思います。

そんな方のためのプログラミング上達講座です。
考えたい方は動画を止めて
プログラムを考えてみてください。

解説動画はこちら



今回のテーマは「星を書いてみる」です。
次のような星を描く関数を作成してみましょう。

条件:
n = 行数
def star(n):
    処理

※星や口は全角

初級の問題:
n段目にn個の星を描く

例えば
star(5)
と実行したら、次のように感じに
表示されるような関数を作りましょう。


★★
★★★
★★★★
★★★★★


中級の問題:
n段に三角形になるように星を描く

star(5)

口口口口★口口口口
口口口★★★口口口
口口★★★★★口口
口★★★★★★★口
★★★★★★★★★


上級の問題:
n段にダイヤを描くように星を描く

star(9)

口口口口★口口口口
口口口★口★口口口
口口★口口口★口口
口★口口口口口★口
★口口口口口口口★
口★口口口口口★口
口口★口口口★口口
口口口★口★口口口
口口口口★口口口口

star(10)

口口口口★★口口口口
口口口★口口★口口口
口口★口口口口★口口
口★口口口口口口★口
★口口口口口口口口★
★口口口口口口口口★
口★口口口口口口★口
口口★口口口口★口口
口口口★口口★口口口
口口口口★★口口口口

※偶数個と奇数個の時で処理が変わり
真ん中からは折り返す


さあ、考えてみましょう。





----回答----




さて回答編です。

初級編:

まずprint関数で文字を出力できます。

n段目にn個の星ということで
毎回個数が変わりますので

このような繰り返しを行うには
for文を用います。

def star(n):
    for i in range(n):
        print('★'*(i+1))
star(5)

range関数を用いると
数値の代わりになるものを
生成できます。

数値は0から始まるので
1を足してあげます。

Pythonでは文字に関しては
*で繰り返しを表現できるので
print関数で文字をn段分だけ
表示するようにすれば完成です。




中級編:

まず、引数で入力された行数で
総量を求めておきます。
ピラミッド型に星を出力する個数は
行数 x 2 -1 個になります。

次に出力を

星の左側の口

星の右側の口

というように3分割し
それぞれの個数を計算します。

星の個数が決まれば
全体から引いて2で割れば
外側の口の個数になります。

このような関数になりました。
def star(n):
    tmp = n*2-1
    for i in range(n):
        s = ((i+1)*2-1)
        k = (tmp - s)//2
        res = '口'*k + '★'*s + '口'*k
        print(res)
        
star(5)


上級編:

上級は解くのに時間がかかると思います。

まず入力された行数が奇数の時と
偶数の時で処理が変わります。
ひし形の上部と下部では
処理が変わることに注意が必要です。

・ひし形の左の口
・ひし形に描くための★の外枠と口
・ひし形の右の口

と分けて考えて
各部分の個数を計算して繋げれば
正解にたどり着けます。

if文の条件分岐で個数を先に考え
出力する1行分の文字を考えます。

コードはこうなりました。

def star(n):
    for i in range(n):
        s = (i+1)*2-1        
        k = (i-n//2) if (i+1>n//2) else (n - s)//2
        w = (n-(k*2)-2) if (i+1>n//2) else (i*2 if n%2==0 else i*2-1) 
        res = '口'*k
        if (i+1)==1 or (i+1)==n:
            res += '★★' if n%2==0 else '★'
        else:
            res += '★' + '口'*w + '★'
        res +='口'*k
        print(res)

参考例なので
結果があっていれば正解です。

さていかがだったでしょうか?

プログラミングの考え方が
身についてきましたでしょうか。

引き続きやっていきたいと思いますので
プログラミングを上達したい方は
解いてみてください。

それでは。