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)