MySQLのこと。

MySQLのことについてまとめているブログ。他人に見せる用でもなく、自分の勉強備忘録。検索インデックスも外してるので、辿りついた方・・・ようこそ。そんな大した情報ないですよ?!たまにアルゴリズムの練習も

記号を交互に出力する

問題

奇数のインデックスでは-を、偶数のインデックスでは/を交互に出力するという問題。余剰の練習問題。

実装1

これまでも使っている余剰を使って組み立てる。この実装では、繰り返す回数分、if文の判定が行われるので効率が良くない。


def print_line(n: int):
    for i in range(n):
        if i % 2 == 0:
            print('/', end='')
        else:
            print('-', end='')


if __name__ == '__main__':
    print_line(10)
    print()
    print_line(15)

/-/-/-/-/-
/-/-/-/-/-/-/-/

実装2

nが偶数の場合、/-となって-で終わり、nが奇数の場合、/-/となって/で終わることがわかる。ということは、最後の部分以外はブロックで表示し、nが奇数の場合、お尻に/を付与すれば同じことができる。こうすることで、if文の判定は1回に減らすことができる。


def print_line2(n: int):
    t = n // 2
    print('/-'*t, end='')

    if n % 2 != 0:
        print('/', end='')


if __name__ == '__main__':
    print_line(10)
    print()
    print_line2(10)
    print()
    print_line(15)
    print()
    print_line2(15)

/-/-/-/-/-
/-/-/-/-/-
/-/-/-/-/-/-/-/
/-/-/-/-/-/-/-/

剰余

剰余演算は、ある数値を別の数値で除算し、余りを取得する計算のことで、非常に便利。例えば、0から1ずつ増えるループのインデックスでi % 3とすると、下記のように余りは0~2を繰り返すようになるので、そのあまりを使って様々な表現ができる。


def print_mod(n: int):
    for i in range(n):
        print('i={}'.format(i), end=' ')
        mod = i % 3
        print('mod={}'.format(mod), end=' ')
        if mod == 0:
            print("○")
        elif mod == 1:
            print("△")
        # elseで良いがあえて書く
        elif mod == 2:
            print("☓")
        else:
            pass


if __name__ == '__main__':
    print_mod(10)

i=0 mod=0 ○
i=1 mod=1 △
i=2 mod=2 ☓
i=3 mod=0 ○
i=4 mod=1 △
i=5 mod=2 ☓
i=6 mod=0 ○
i=7 mod=1 △
i=8 mod=2 ☓
i=9 mod=0 ○

他にも秒数を分秒に変換する際にも剰余は使えるので、規則があるものを表現する際に相性が良い。


def cal_time(seconds: int) -> str:
    m = seconds // 60
    s = seconds % 60
    print(str(m) + ' min ' + str(s) + ' sec')


if __name__ == '__main__':
    import random
    time = [random.randint(1, 1000) for _ in range(10)]
    for i in time:
        print('sec= {}'.format(i), end=' ')
        cal_time(i)

sec= 808 13 min 28 sec
sec= 262 4 min 22 sec
sec= 64 1 min 4 sec
sec= 608 10 min 8 sec
sec= 777 12 min 57 sec
sec= 595 9 min 55 sec
sec= 36 0 min 36 sec
sec= 146 2 min 26 sec
sec= 691 11 min 31 sec
sec= 453 7 min 33 sec