AtCoder Programming Guide for beginners(APG4b) EX1 ~ EX15の回答
~ AtCoder 300台の貧弱プログラマが脳筋コードでとくAPG4b
概要
- AtCoder rate 300台の貧弱プログラマがAPG4bのEX1 ~ 15(第1章)の内容をPythonで解いていくだけ
前回後輩に頼まれて第2章から解いていったが、どうせなら第1章も解こうじゃないかというただの自己満
今回もさっさと解いていく
- AtCoder Programming Guide for beginners(APG4b) EX1 ~ EX15の回答
EX1 ~ コードテストと出力の練習 ~
この問題を解いていく
print("こんにちは") print("AtCoder")
EX1の補足
まぁこれはprintで指定された文字列を出力するだけなので補足事項はなし
EX2 ~ エラーの修正
この問題を解いていく
※今回はエラーの修正ということで、問題のコードも載せるが、Pythonでは再現不可のコードがあったため、別のコードで代用した
問題のコード(Python仕様に変更後)
print("いつも2525) print(”AtCoderくん")
エラーコード
File "Main.py", line 1 print("いつも2525) ^ SyntaxError: unterminated string literal (detected at line 1) File "Main.py", line 2 print(”AtCoderくん") ^ SyntaxError: invalid character '”' (U+201D)
解答
print("いつも2525") print("AtCoderくん")
EX2の補足
Pythonはインタプリタ(1行ずつエラーを確認する)なので、最初の文でエラーが出るとそれ以降の行は正しい処理をしているのかはわからないため注意が必要(今回は分かりやすくするため全てのエラーを列挙した)
今回のエラー内容として、1行目は"
で閉じていないことが原因であり、2行目は"
が全角になっていたことが原因である
EX3 ~ 計算問題 ~
この問題を解いていく
print(100 * (100 + 1) // 2)
EX3の補足
最初、
print(100 * (100 + 1) / 2)
としたが、WAが出た
この原因として、pythonは割り算を行うと割り切れたとしてもintではなく、floatで返す(ex 100 / 2 => 50.0
)ことが挙げられる
そのため、intにキャスト(ex int(100 / 2)
)にするか、//
を使って整数にすることでこの問題を解決できる
EX4 ~ ⚪︎年は何秒? ~
この問題を解いていく
year_second = 365 * 24 * 60 * 60 # 1年の秒数 print(year_second * 1) # 2年の秒数 print(year_second * 2) # 5年の秒数 print(year_second * 5) # 10年の秒数 print(year_second * 10)
EX4の補足
今回の問題は1年の秒数を変数に格納しておいて、必要な年数分をかけたものを出力すればいいだけなので補足することはないだろう
EX5 ~ A足すB問題 ~
この問題を解いていく
a, b = map(int, input().split()) print(a + b)
EX5の補足
a + bを行うコードはもっと短く書くことができる
print(sum(map(int, input().split()))
EX6 ~ 電卓をつくろう ~
この問題を解いていく
f = list(input().split()) a, b = int(f[0]), int(f[2]) op = f[1] if op == '+': print(a + b) elif op == '-': print(a - b) elif op == '*': print(a * b) elif op == '/': if b == 0: print("error") else: print(a // b) else: print("error")
EX6の補足
今回の問題はif文をそれぞれの条件に合わせて分岐させるだけなので補足することはないだろう
EX7 ~ bool値パズル ~
この問題を解いていく
a = True b = False c = True if a: print("At", end='') else: print("Yo", end='') if not a and b: print("Bo", end='') elif not b or c: print("Co", end='') if a and b and c: print("foo!", end='') elif True and False: print("yeah!", end='') elif not a or c: print("der", end='') print()
EX7の補足
論理積(and)と論理和(or)の仕組みを覚えておくと良い
and -> どちらもTrueの場合のみTrueを返す
or -> どちらか片方がTrueの場合Trueを返す
EX8 ~ たこ焼きセット ~
この問題を解いていく
pattern = int(input()) if pattern == 2: text = input() print(text + "!") price = int(input()) count = int(input()) print(price * count)
EX8の補足
この問題はpatternが2の時だけ、テキストを入力して出力する動作が追加されるため、if文で分岐させ、テキストを受け取り、出力してから、値段と個数を受け取り、合計金額を出力している
EX9 ~複合代入演算子を使おう ~
この問題を解いていく
x, a, b = map(int, input().split()) # 出力1. xに1を足した値 x += 1 print(x) # 出力2. (1.で出力した値)に(a+b)を掛けた値 x *= (a + b) print(x) # 出力3. (2.で出力した値)に(2.で出力した値)を掛けた値 x *= x print(x) # 出力4. (3.で出力した値)から1を引いた値 x -= 1 print(x)
EX9の補足
出力1で x += 1
と書いているが、x = x + 1
と同じ挙動を示す
同じ変数に演算を行う場合は、x += 1
や x *= 2
などx 演算子= 何らかの値
を使うことで、x = x 演算子 何らかの値
を省略することができる
EX10 ~ 棒グラフの出力 ~
この問題を解いていく
a, b = map(int, input().split()) A = "A:" + "]" * a B = "B:" + "]" * b print(A) print(B)
EX10の補足
文字列は演算子を使うことで文字列同士を繋げることができる
例えば、定義 : A = ""
にA += "AtCoder"
を行うとAの中身は"AtCoder"
となる
掛け算を使う場合 -> 定義 : A = "AtCoder"
に A *= 2
を行うとAの中身は"AtCoderAtCoder"
となる
EX11 ~ 電卓を作ろう2 ~
この問題を解いていく
N = int(input()) A = int(input()) for i in range(N): op, B = input().split() B = int(B) if op == '+': A += B print(f"{i+1}:{A}") elif op == '-': A -= B print(f"{i+1}:{A}") elif op == '*': A *= B print(f"{i+1}:{A}") elif op == '/': if B == 0: print("error") exit() else: A = int(A / B) print(f"{i+1}:{A}")
EX11の補足
Pythonは文字列と整数型を一緒に出力することができないので、整数型の変数を文字列型に変換する必要がある
それを回避するために、formatを使い、整数型を文字列型に変換せずに出力させている
print文のところで使われているf
だが、これはformatを使っている
formatの詳しい使い方はPython, formatで書式変換(0埋め、指数表記、16進数など)を参考にすると良いだろう
EX12 ~ 足したり引いたり ~
この問題を解いていく
S = list(input()) N = 1 plus = S.count('+') minus = S.count('-') print(N + plus - minus)
EX12の補足
リスト、文字列には特定の文字の出現回数を数える.count()
というメソッドがある
そのため、今回書いたコードは
S = input() N = 1 plus = S.count('+') minus = S.count('-') print(N + plus - minus)
と書いてもACを取ることができる
EX13 ~ 平均との差 ~
この問題を解いていく
N = int(input()) A = list(map(int, input().split())) mean = sum(A) // N ans = list(map(lambda x: abs(mean - x), A)) print(*ans, sep='\n')
EX13の補足
print()
の第2引数で指定されているsep='\n'
は区切り文字(デフォルトは,
)を'\n'(改行文字)
として扱ってほしいとプログラムに指定してるのである
なので、リストA = [1, 2, 3]
があるとしたら、sep='\n'
は、A = [1'\n'2'\n'3'\n']
となっている
また、リストの前に*
がついているが、これはリストを1つ1つ渡す作業を一括で行ってくれる機能になっている
なので、リストA = [1, 2, 3]
があるとしたら、*A
は、1 2 3
となっている
これら2つを組み合わせることで、for文を使わずに計算結果を1行ごとに出力することができる
※今回のリストを半角空白ごとに出力する(1 2 3
のような出力結果にしたい)場合は、sep
のところを削除すると良い
EX14 ~ 三人兄弟の身長差 ~
この問題を解いていく
A, B, C = map(int, input().split()) minimum = min(A, B, C) maximum = max(A, B, C) print(maximum - minimum)
EX14の補足
Pythonには元々最大値・最小値を求める関数があるので、それを使うことで今回の問題は簡単に解くことができる
max()
: ()内に指定された変数・リストの中の最大値を返してくれる
min()
: ()内に指定された変数・リストの中の最小値を返してくれる
EX15 ~ 三人兄弟へのプレゼント ~
この問題を解いていく
N = int(input()) A = sum(list(map(int, input().split()))) B = sum(list(map(int, input().split()))) C = sum(list(map(int, input().split()))) print(A * B * C)
EX15の補足
Pythonには元々合計を求める関数があるので、それを使うことで今回の問題は簡単に解くことができる
sum()
: ()内に指定された変数・リストの合計を返してくれる