🐥

Codejam2022 QR: Punched Cards

2022/05/14に公開

問題

次の様なAscii Art(Punched Cards)を作成したい。左上を除く(RxC)-1個のセルは、真ん中にperiod、上下はdash、左右はpipeで、コーナーはplusとして表す。RとCが与えられた時のPunched Cardsを出力する。

..+-+-+-+
..|.|.|.|
+-+-+-+-+
|.|.|.|.|
+-+-+-+-+
|.|.|.|.|
+-+-+-+-+

https://codingcompetitions.withgoogle.com/codejam/round/0000000000876ff1/0000000000a4621b

実装

Ascii Artにした時の行数と列数は2R+1と2C+1。それぞれの位置に現れる記号は決まっているので、条件に合うものを描画する(drawの中)。最後に、各列を連結して、行単位で出力する。

def draw(r, c):
    if r <= 1 and c <= 1:
        return '.'
    elif r % 2 == 0 and c % 2 == 0:
        return '+'
    elif r % 2 != 0 and c % 2 == 0:
        return '|'
    elif r % 2 == 0 and c % 2 != 0:
        return '-'
    else:
        return '.'


T = int(input())
for t in range(1, T + 1):
    R, C = list(map(int, input().split()))
    ret = [[''] * (2*C + 1) for _ in range(2*R+1)]
    for r in range(2*R+1):
        for c in range(2*C+1):
            ret[r][c] = draw(r, c)
    print('Case #{}:'.format(t))
    for r in range(2*R+1):
        print(''.join(ret[r]))

Discussion