この記事はtraP Advent Calendar 2019 3月25日の記事です。
2回目の投稿になります。owlです。
今回は自分が春にしたプログラミングの進捗について話していきたいと思います。
プログラミングに関してまだ初心者なので、ざっくりとしか話せませんが最後まで内容を見ていただければ嬉しいです。
プログラミング環境の実装について
まずプログラミング環境の実装について話したいと思います。
自分はpythonでコードを書いているのでpythonの環境での実装について書いていきたいと思います。
自分はProgateという記事を参考にして行いました。
(Windowsの方向けの記事がこちらでMacの方向けの記事がこちらになっています。)
また、テキストエディタとターミナルに関してなのですが、ここではAtomとコマンドプロンプトを使用しているのですが、個人的にはVSCodeが元々ターミナルがついており、便利だなぁと感じたのでそちらを使用しています。VSCodeのダウンロードに関してはこちらのサイトが適切ではないかと思います。
赤線で囲われた部分がターミナル部分となっています。
Progateでの学習
自分が先ほど述べたProgateについてなのですが、既知の方もいらっしゃるとは思いますが、一応説明します。
Progateとはプログラミングの基礎についてパソコンで実際に体感して学習できることができるもので、課題のヒントを見るそれを参考に実際に課題を解くという2段階で分けられていてどのようにコードを書いていけばという導入部分を理解することができます。(このような感じで学習することができます。図を2枚添付しましたので参考に)
また、現在の段階ではありますが、traPではProgateをチーム単位で登録しているので実質部費さえ払えばタダで使用できます。Progateの長所は実際に紙でなく、パソコンを使用して自学習できることだと思っています。自分もこれでpythonについて学習しました。気になった人は試しにログインしてやってみるといいと思います。
ちなみにProgateのURLはこちらです
At Coderについて
自分はまだAtCoderについて過去問しか解いていない段階ですがほんの少しだけ触れて終わりにしたいと思います。
AtCoderとはプログラミングのコンテストを行っているサイトで、リアルタイムでコンテストを行っていたり、以前に行われた過去問などに取り組むことができます。(僕はまだコンテストに参加したことはありませんが…)
AtCoderに登録したけど、何をするべきかについて分からないという方は @drken さんが書いた AtCoderに登録したら次にやること~これだけ解けば十分闘える!過去問精選10問~ を参考にするといいと思います。
自分は現時点でこの過去問の中からpythonで最初から5題ほど解いてみたのでどういう風に行ったのかを説明したいと思います。(どちらかといえば自分がどのように考えたかを纏めたいという意図が強いですがどうかご付き合い下さい。)
第 1 問:ABC086A Product
[問題概要]
2つの正の整数、, の積が偶数か奇数かを判断してください。
[制約]
- は正の整数
[解法]
- 倍数判定の問題です。
- a と b をかけた数値を 2 でわった余りを判断すれば、偶数か奇数の判断ができます。
- 1行目のa, b = map(int, input().split()) というコードはよく似た形で使用されるので、'python 入力メソッド'といった検索をかければいくつかでてくると思います。
a, b = map(int, input().split())
if a*b % 2 == 1:
print('Odd')
else:
print('Even')
第 2 問:ABC081A Placing Marbles
[問題概要]
0 と 1 のみから成る 3 桁の番号 s が与えられます。1 が何個含まれるかを求めてください。
[制約]
は '1' 、あるいは '0'
[解法]
- s の配列をstr(文字)の型で入力してその中にある'1'を判断するコードを書きました。
- s.countといったstring型を使用したものは良く出てくるので、問題をいくつか解いてみるといいと思います。
s = input()
print(s.count('1'))
第 3 問:ABC081B Shift Only
[問題概要]
黒板に 個の正の整数 が書かれています。
すぬけ君は,黒板に書かれている整数がすべて偶数であるとき,次の操作を行うことができます。
- 黒板に書かれている整数すべてを, で割ったものに置き換える。
すぬけ君は最大で何回操作を行うことができるかを求めてください。
[制約]
[解法]
- forを用いて全探索を行い、whileで偶奇の判定を行った後に、全体の要素を 2 でわる操作と 2 でわった回数に 1 足すという操作を行いました。
- ここではfor文のカウントを行うときにtmp = 0を用いていますが、置く位置には気を付けましょう。( 0 か 1 でしか出力されない場合があったら置く位置が間違っている可能性があります。)
N = int(input())
A = list(map(int,input().split()))
c = 1000000
for i in range(len(A)):
tmp = 0
while A[i]%2 == 0:
tmp += 1
A[i] //= 2
c = min(c,tmp)
print(c)
第 4 問:ABC087B Coins
[問題概要]
500 円玉を 枚、100 円玉を 枚、50 円玉を 枚持っています。これらの硬貨の中から何枚かを選び、合計金額をちょうど 円にする方法は何通りあるでしょうか?
[制約]
- は整数である。
- は50の倍数である。
[解法]
- 全探索を複数回用いる手法が使用されています。
- 制約の関係で0~Aとなっていますが、 0 から A までの数値の個数は A+1 個であることは引っ掛かりがちです。
A = int(input())
B = int(input())
C = int(input())
X = int(input())
tmp = 0
for a in range(0,(A+1)):
for b in range(0,(B+1)):
for c in range(0,(C+1)):
total = 500*a + 100*b + 50*c
if total == X:
tmp += 1
print(tmp)
第 5 問:ABC083B Some Sums
[問題概要]
1 以上 以下の整数のうち、10 進法での各桁の和が 以上 以下であるものの総和を求めてください。
[制約]
- 入力は全て整数である
[解法]
- 各桁の和の数値はsum([int(i) for i in str(i)])なので、この値が A 以上 B 以下になる時に数値が足されるようにプログラムを組みました。
N, A, B = map(int, input().split())
ans = 0
for i in range(N+1):
if A <= sum([int(i) for i in str(i)]) <= B:
ans += i
print(ans)
最後に
自分は春休みにプログラミングを始めましたが、プログラムというともっと難いイメージがあったのですが、意外とパズル感覚で解けて楽しいですし(勿論まだABCのA問題しか十分に解けていないだけであるからかもしれませんが)、コンテストなどに参加せずゆっくり過去問を解いて勉強するのもアリだと思います。自分は元々生物の勉強に飽きた時に何か遊べそうなものはないかという感じで始めた人なので変に意気込まずに趣味の範囲内でゆるりとやっていきたいと思います。
明日はtyoxuさんの記事です。お楽しみに。