Python を、身につけるため、練習を。
EX1 - コードテストと出力の練習
こんにちは AtCoder
と出力せよ。
考えたこと
出力する
解答例
print("こんにちは") print("AtCoder")
EX2 - エラーの修正
例示されているコード (C++) が
いつも2525 AtCoderくん
と出力するように修正せよ。
考えたこと
今回は Python でやるので Python でそのまま出力していく。
解答例
print("いつも2525") print("AtCoderくん")
EX3 - 計算問題
12×100×(100+1)
の計算結果を出力せよ。
考えたこと
その式をそのまま print する。ただし注意点として、Python では整数型 (int 型) の割り算は「//」という演算子を用いる。
- 「/」: これは浮動小数点型 (float 型) の演算として扱われる
- 「//」: 整数型 (int 型) の割り算はこっち
C++ ではどちらも「/」を使うので注意。
解答例
print(100 * (100 + 1) // 2)
EX4 - ◯年は何秒?
- 1年は何秒か
- 2年は何秒か
- 5年は何秒か
- 10年は何秒か
を出力せよ。
考えたこと
この問題は、「変数」を使えるようになろうという趣旨になっている。
seconds = 365 * 24 * 60 * 60
という変数 seconds を宣言して、それを使って出力していく。
解答例
seconds = 365 * 24 * 60 * 60 print(seconds) print(seconds * 2) print(seconds * 5) print(seconds * 10)
EX5 - A足すB問題
入力として 2 つの整数 A, B を受け取り、A + B を計算した結果を出力せよ。
考えたこと
いよいよ「入力」が登場。ここでは input() を使うことにする。
- input(): 一行を文字列 (str 型) として読み込む ( "5 4" という感じに読み込まれる)
- input().split(): これを split() する (["5", "4"] という感じに分かれる)
- map(int, input().split()): それぞれを整数型 (int 型) にする ([5, 4] となる)
という流れで行う。まとめると
A, B = map(int, input().split())
という風に書くことができる。全部まとめると、次のような感じ。
解答例
A, B = map(int, input().split()) print(A + B)
EX6 - 電卓をつくろう
1 + 2
のように、整数 A、演算子 op、整数 B を入力として受け取って、計算結果を出力せよ。演算子 op の種類は「+」「-」「*」「/」「?」「=」「!」である。ラスト 3 つに対しては "error" と出力せよ。
考えたこと
この問題の趣旨は「if 文」を使いこなすこと。ラスト 3 つについてはまとめて「else」で処理してしまうと良さそう。
あと、A / B については注意点が 2 つ。。
- 整数型演算なので、A // B にする
- B = 0 のときも error に回す
解答例
A, op, B = input().split() A = int(A) B = int(B) if op == "+": print(A + B) elif op == "-": print(A - B) elif op == "*": print(A * B) elif op == "/" and B != 0: print(A // B) else: print("error")
EX7 - bool値パズル
3 つの変数 a, b, c には True / False のいずれかを代入したい。その結果、次のようなコード (C++) を用いると、"AtCoder" と出力されるようにせよ。
if (a) { cout << "At"; } else { cout << "Yo"; } if (!a && b) { cout << "Bo"; } else if (!b || c) { cout << "Co"; } if (a && b && c) { cout << "foo!"; } else if (true && false) { cout << "yeah!"; } else if (!a || c) { cout << "der"; }
考えたこと
論理値の and や or の挙動について理解する練習問題。
- a = True
- b = False
- c = True
となるようにすればよい。
解答例
a = True b = False c = True res = "" if a: res += "At" else: res += "Yo" if not a and b: res += "Bo" elif not b or c: res += "Co" if a and b and c: res += "foo!" elif True and False: res += "yeah!" elif not a or c: res += "der" print(res)
EX8 - たこ焼きセット
最初に 2 タイプのクエリのうちのいずれかが投げられる。
- type 1 のとき: 整数 price と整数 N を受け取って、合計金額 price * N を出力せよ
- type 2 のとき: 文字列 text と、整数 price と整数 N を受け取って、text に "!" を付け加えた文字列と、合計金額 price * N とを、一行ずつ出力せよ
考えたこと
変数のスコープについてのテーマの問題。type 2 の方の出力では、formatter を使ってみることにした。
"str{}str".format(変数)
という風に書くと、{} の部分に変数の値が埋め込まれるイメージ。
解答例
type = input() if type == "1": price = int(input()) N = int(input()) print(price * N) elif type == "2": text = input() price = int(input()) N = int(input()) print("{}!".format(text)) print(price * N)
EX9 - 複合代入演算子を使おう
整数 x, a, b が入力として与えられる。
- x に 1 を足した値
- (1 で求めた値) に (a + b) を掛けた値
- (2 で求めた値) に (2 で求めた値) を掛けた値
- (3 で求めた値) から 1 を引いた値
をそれぞれ出力せよ。
考えたこと
この問題の趣旨は「+=」や「*=」といった複合代入演算子を使いこなすこと。あと、「a++」といったインクリメント演算子の練習も兼ねているのだが、Python にはそれがないため素直に「a += 1」という感じにする。
解答例
x, a, b = map(int, input().split()) x += 1 print(x) x *= a + b print(x) x *= x print(x) x -= 1 print(x)
EX10 - 棒グラフの出力
2 つの整数 A, B が与えられる。たとえば A = 3, B = 5 のとき、次のように出力せよ。
A:]]] B:]]]]]
考えたこと
この問題、while 文の練習なんだけど...python ならめっちゃ楽に書けるよね。それはそうと、問題の趣旨に沿って while 文で書いてみる。
たとえば 100 回何らかの操作を繰り返す処理は次のように書ける。
i = 0 while i < 100: (何かの処理) i += 1
この仕組みを利用して問題を解いてみよう。
解答例
A, B = map(int, input().split()) strA = "A:" i = 0 while i < A: strA += "]" i += 1 strB = "B:" i = 0 while i < B: strB += "]" i += 1 print(strA) print(strB)
EX11 - 電卓をつくろう2
こんな感じの入力が与えられる。最初の整数 N は、命令の個数を表す。次の行の整数 A は初期値を表す。A に命令の処理を行って得られる結果を求めよ。
3 2 + 1 * 3 / 2
ただし、ゼロ割が発生する箇所では "error" を出力し、処理を打ち切るようにせよ。
考えたこと
今回は「for 文」の練習。N 回の命令を順に処理するのを for 文で書くことができる。
解答例
N = int(input()) A = int(input()) for i in range(N): op, B = input().split() B = int(B) if op == "+": A += B elif op == "-": A -= B elif op == "*": A *= B elif op == "/": if B == 0: print("error") break A = int(A / B) print("{}:{}".format(i + 1, A))
EX12 - 足したり引いたり
文字列 S が与えられる。S は
1+1+1-1-1+1-1+1-1-1-1+1
といったように、「1」が両端にあって、「1」と「+ または -」を繰り返したものとなっている。この計算結果を出力せよ。
考えたこと
今度は「文字列型」の扱い方の練習。ここでは、1 と +- しかないことがわかっているので、+ と - だけ読み取れば OK。APG4b 的には
for i in range(len(S)): c = S[i] (処理)
という感じの処理を書く趣旨だと思われる。でもこれは Python らしくない。ここでは Python らしく、
for c in S: (処理)
という書き方をすることにする。このように、index を指定するのではなく、S の各文字を順に見ていく書き方の方が Python っぽい。
解答例
S = input() res = 1 for c in S: if c == '+': res += 1 elif c == '-': res -= 1 print(res)
EX13 - 平均との差
N 人のテストの点数の結果 A[0], A[1], ..., A[N-1] が与えられる。これらの平均点を B とする (小数点以下は切り捨て)。
N 人それぞれについて、平均点 B との差分を求めよ。
考えたこと
今度は「配列」の練習!
C++ では std::vector を用いるが、Python では標準組み込み型である list 型を有効に用いることができる。入力受け取りでは、いつもの map(int, input().split()) を list に入れる。
list 型も str 型と同様に、range-based for を用いることができる。そして重大な注意点として、
x Python の list は、連結リスト
o Python の list は、可変長配列
ということ。名前がものすごく紛らわしいけど、list は連結リストではない。よってランダムアクセス (a[ i ] といった具合に index i を指定してアクセスすること) ができる。
解答例
N = int(input()) A = list(map(int, input().split())) B = 0 for a in A: B += a B = B // N for a in A: print(abs(a - B))
EX14 - 三人兄弟の身長差
3 つの整数 A, B, C が与えられる。A, B, C の最大値と、A, B, C の最小値との差を求めよ。
考えたこと
max とか min といった組み込み関数を使う練習問題。
解答例
A, B, C = map(int, input().split()) print(max(A, B, C) - min(A, B, C))
EX15 - 三人兄弟へのプレゼント
N 個の整数の組
- A[0], A[1], ..., A[N-1]
- B[0], B[1], ..., B[N-1]
- C[0], C[1], ..., C[N-1]
が与えられる。それぞれの組について合計値をとり、それらの積を求めよ。
考えたこと
問題の趣旨は「関数」の練習。ここでは、「数列の合計値を求める関数」を作ることにしよう。こんな感じ。
def func(A): res = 0 for v in A: res += v return res
これを使って、次のように実装できる。
解答例
def func(A): res = 0 for v in A: res += v return res N = int(input()) A = list(map(int, input().split())) B = list(map(int, input().split())) C = list(map(int, input().split())) print(func(A) * func(B) * func(C))
Python なら
ただし Python なら、sum という組み込み関数があるので...もっと簡単に書ける。
N = int(input()) A = list(map(int, input().split())) B = list(map(int, input().split())) C = list(map(int, input().split())) print(sum(A) * sum(B) * sum(C))