pontz_rwのブログ

プログラミング等の備忘録

ITP1_6_C: Official House

公舎 | プログラミング入門 | Aizu Online Judge
配列に関する問題

多次元配列を利用します。


解答

houses = [[[0 for r in range(10)] for f in range(3)] for b in range(4)]

n = int(input())

for i in range(n):
    b, f, r, v = map(int, input().split())
    houses[b - 1][f - 1][r - 1] += v

for b in range(4):
    for f in houses[b]:
        print('', *f)
    if b != 3:
        print('#' * 20)

ITP1_6_B: Finding Missing Cards

なくなったカードの発見 | プログラミング入門 | Aizu Online Judge
不足しているカードを指定された順序で表示する問題

トランプのリストを用意しておき、指定されたカードをフラグで管理するか、取り除くかします。


解答1

# トランプの生成
cards = [
    "{} {}".format(s, r) for s in ('S', 'H', 'C', 'D') for r in range(1, 13 + 1)
]

count = int(input())

# トランプの削除
for n in range(count):
    card = input()
    cards.remove(card)

# 不足しているトランプの表示
for n in cards:
    print(n)

解答2

from collections import OrderedDict

# トランプの生成
cards = OrderedDict()  # 順序付き辞書
for s in ['S', 'H', 'C', 'D']:
    for r in range(1, 13 + 1):
        key = "{} {}".format(s, r)
        cards[key] = False

count = int(input())

# 所持しているトランプの処理
for n in range(count):
    input_key = input()
    cards[input_key] = not(cards[input_key])  # 真理値を反転 (Trueへ)

# 不足しているトランプの表示
for k, v in cards.items():
    if not v:
        print(k)

ITP1_6_A: Reversing Numbers

数列の反転 | プログラミング入門 | Aizu Online Judge
リストを逆順にする問題


解答1
reverse()を使用してリストを逆順にしています。

input()
list = input().split()
list.reverse()
print(" ".join(list))


解答2
リストに対して[::-1]を指定することで逆順にできます。

input()
print(" ".join(input().split()[::-1]))

ITP1_5_D: Structured Programming

構造化プログラミング | プログラミング入門 | Aizu Online Judge
プログラムを書き直す問題


3の倍数であるか、剰余が3か0になるまで10で割り続け、3である場合に、その数字を出力します。


解答1
*演算子を使用し、リストやタプルから引数をアンパックします。

n = int(input())
list = []
for i in range(3, n + 1):
    if i % 3 == 0:
        list.append(i)
    else:
        x = i
        while x:
            if x % 10 == 3:
                list.append(i)
                break
            else:
                x = x // 10
print("", *list)


解答2
剰余を求めていた処理を、文字列に3を含むかという処理に変更しています。

n = int(input())
for i in range(3, n + 1):
    if i % 3 == 0 or '3' in str(i):
        print('', i, end='')
print()

ITP1_5_C: Print a Chessboard

チェック柄の描画 | プログラミング入門 | Aizu Online Judge
繰り返し構文を用いて2種類の文字列を出力する問題


現在の行と列の番号の合計が奇数か偶数かで出力する文字列が変わります。


解答1

while True:
    H, W = map(int, input().split())
    if H == W == 0:
        break
    for i in range(H):
        for j in range(W):
            print('#.'[(i + j) % 2], end='')
        print()
    print()


解答2

while True:
    H, W = map(int, input().split())
    if H == 0 and W == 0:
        break
    line = ['#.' * (W // 2) + '#' * (W % 2), '.#' * (W // 2) + '.' * (W % 2)]
    for i in range(H):
        print(line[i % 2])
    print()


解答3

while True:
    H, W = map(int, input().split())
    if H == W == 0:
        break
    line = '#.' * (W // 2 + 1)
    for i in range(H):
        if i % 2:
            print(line[1:W+1])
        else:
            print(line[:W])
    print()

ITP1_5_B: Print a Frame

フレームの描画 | プログラミング入門 | Aizu Online Judge
繰り返し構文を用いて2種類の文字列を出力する問題


四角形の枠と中身とで条件分岐させます。
枠を出力するのは、最初と最後の行と、そのほかの行の最初と最後の列です。


解答1

while True:
    H, W = map(int, input().split())
    if H == 0 and W == 0:
        break
    for i in range(H):
        if i == 0 or i == H - 1:
            print('#' * W)
        else:
            print('#' + '.' * (W - 2) + '#')
    print('')


解答2
条件分岐を*演算子で代用しています。

while True:
    H, W = map(int, input().split())
    if H == 0 and W == 0:
        break
    print('#' * W + '\n' + ('#' + '.' * (W - 2) + '#' + '\n') * (H - 2) + '#' * W + '\n')

ITP1_5_A: Print a Rectangle

長方形の描画 | プログラミング入門 | Aizu Online Judge
繰り返し構文を利用した文字列の出力をする問題


指定された行列分、文字列の出力を繰り返します。
列が進むたびに'#'を出力し、行が進むたびに改行を行います。


解答1

while True:
    H, W = map(int, input().split())
    if H == 0 and W == 0:
        break
    for i in range(H):
        for j in range(W):
            print('#', end='')
        print('')
    print('')


解答2
文字列に対して*演算子を利用し、乗算が利用できます。

while True:
    H, W = map(int, input().split())
    if H == 0 and W == 0:
        break
    for i in range(H):
        print('#' * W)
    print('')


解答3
条件分岐を*演算子で代用しています。

while True:
    H, W = map(int, input().split())
    if H == 0 and W == 0:
        break
    print(('#' * W + '\n') * H)