けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder APG4b EX 1〜15 (in Python)

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 が入力として与えられる。

  1. x に 1 を足した値
  2. (1 で求めた値) に (a + b) を掛けた値
  3. (2 で求めた値) に (2 で求めた値) を掛けた値
  4. (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))