東大理三生のプログラミング奮闘記

初心者プログラマーが半年間でどれだけ成長するか!についてのブログです。勉強方法とか使った本とかについて書いていくと思います!プログラミングをもっと身近に感じてもらえたら嬉しいです!毎日更新を目指します!

ARC #068 を python で解いてみた!

python の練習に、AtCoder #068を解きました〜
arc068.contest.atcoder.jp


少しコツがつかめて来たのか、問題が簡単だったのか分かりませんが、C, D, E 問題が解けました!
F問題は時間の都合(Djangoを勉強しないといけない...)でやめました。

解答を貼っていきます。
おかしいとか、もっとこうすればよくなるとかあれば、ぜひ教えてください!


問題 C
愚直にやるとかなり工数がかかったので、「出る目は6 or 5」と割り切ってやるとうまくいきました。
最初はどうしても愚直に全部パソコンにやらせるクセ?があります。

x = int(input())

set_num = int(x / 11)
remainder = x - set_num * x

if remainder == 0:
    print(set_num * 2)
elif 1 <= remainder <= 6:
    print(set_num * 2 + 1)
else:
    print(set_num * 2 + 2)


問題 D
最初、これも愚直にやらそうとしていましたが、「任意の3枚が全て異なる」のだと勘違いしていたことも相まって、「工数が半端ない and 実現できない」ことになり、しばらく詰まりました。
「任意の3枚が全部違っていい」ことに気づいてからはすっとできた気がします。勘違いって怖いですね...
あとは、関数の中に破壊的メソッドを使ったら、returnで返してもその関数を使った時に引数のオブジェクトが壊れることを知らず、最後の結果がうまくいかなかったので少し調べました。deepcopy()を使えばうまくいくのだとか(以下のリンクを参照しました)。
8.10. copy — Shallow and deep copy operations — Python 3.6.0 documentation

from copy import deepcopy

def remove_repeat(list1,list2):
    for n in list2:
        list1.remove(n)
    return list1

N = int(input())

card = [int(a) for a in input().split()]
card_copy = deepcopy(card)
card_no_repeat = list(set(card))
card_repeat = remove_repeat(card_copy, card_no_repeat)

repeat_num = len(card) - len(card_no_repeat)

if repeat_num == 0:
    print(len(card))
elif repeat_num % 2 == 1:
    print(len(card_no_repeat) - 1)
elif repeat_num % 2 == 0:
    if len(set(card_repeat)) == 2:
        if card_repeat[0] == card_repeat[1] + 1 or card_repeat[0] == card_repeat[1] - 1:
            print(len(card_no_repeat) - 2)
        else:
            print(len(card_no_repeat))
    else:
        print(len(card_no_repeat))


問題 E
これも少し最後調整しました。
「一番下のifの中にbreakを入れていなかったので、重複して数えていて答えがおかしくなっていたこと」と、「なぜが列車は駅をぐるぐる循環すると思っていたので、真ん中ぐらいの内包表記内の if i*m <= M を書いていなかったこと」の2点でした。

N, M = [int(n) for n in input().split()]

# お土産が買える範囲
souvenir_range = []
for i in range(N):
    l, r = [int(n) for n in input().split()]
    souvenir_range.append(list(range(l, r+1)))
print(souvenir_range)

# それぞれの電車が止まる駅の種類
stop_list_each_train = []
for i in range(1, M+1):
    stop_list_each_train.append(list(set([(i*m) % (M+1) for m in range(M+1) if i*m <= M])))
print(stop_list_each_train)

for stop_list in stop_list_each_train:
    counter = 0
    for souvenir in souvenir_range:
        for stop in stop_list:
            if stop in souvenir:
                counter += 1
                break
    print(counter)

Record of study 〜2、3週間経過〜

2、3週間経った頃の話です。

3週間目は業務が結構忙しくて、あまりプログラミングの勉強ができない週でした。

なので、AtCoderの問題をチラッと解いたり、その過程でわからないことが出て来たら本でチェックしたり、人に聞いたりっていう感じでした。


一旦まとめに入った週って感じですね〜


ここまでで大体pythonの(超)基礎は習得したと思います。

とはいえ自分で何ができるかと言われても、「ん〜」という感じです。笑



とりあえず次は、Webアプリケーションが作れるように、Djangoの勉強に移っていこう!ということで、3週間たった頃からDjango Documentを読み始めました。

まだ日本語訳がそんなに進んでいないので、一部は英語でやっています。

英語はそんなにできるわけではないので大変ですが、AI関連で留学してみたいなあ〜という思いもなくはないので、その練習として英語で頑張ってみたいと思います。


目安としては3月中旬までには一通り理解して、そこから自分で何かアプリを作りたいと思っています。

twitterとか何かのSNSAPIを使ったりできたら面白いなあと思うんですが...まあ考え中です。笑



それではこの辺で〜

2017年東大理系数学をpythonで解いてみた!

昨日、今日で東大入試がありましたね!

受験生の方、受験お疲れ様でした。


せっかくなので、数学の問題をpythonで解いてみよう!ということで解いてみました!


pythonの機能(ライブラリ)がまだ全然使いこなせないので、今回は第2問(確率)だけを解いてみました。


(問題)
f:id:gragragrao:20170226144148p:plain

(解答)

# 2017年 東大数学 理系

# 第2問

import itertools
from fractions import Fraction

move_pattern = ["a", "b", "c", "d"]
move_command = list(itertools.product(move_pattern, repeat=6))

whole_event = 4 ** 6
counter_1 = 0
counter_2 = 0

for command in move_command:
    coordinate = [0, 0]
    for s in command:
        if s == "a":
            coordinate[0] += 1
        if s == "b":
            coordinate[0] -= 1
        if s == "c":
            coordinate[1] += 1
        if s == "d":
            coordinate[1] -= 1
    if coordinate[0] == coordinate[1]:
        counter_1 += 1

prob_1 = Fraction(counter_1, whole_event)
print("the answer of (1) is {}".format(prob_1))


for command in move_command:
    coordinate = [0, 0]
    for s in command:
        if s == "a":
            coordinate[0] += 1
        if s == "b":
            coordinate[0] -= 1
        if s == "c":
            coordinate[1] += 1
        if s == "d":
            coordinate[1] -= 1
    if coordinate[0] == 0 and coordinate[1] == 0:
        counter_2 += 1

prob_2 = Fraction(counter_2, whole_event)
print("the answer of (2) is {}".format(prob_2))

見やすいように、同じ処理を設問ごとに書いているので少し冗長になっていますが、ちゃんと動きます。

4048個のループが2回、全部で10000回ぐらいの処理なので工夫なしでやっても計算の時間は全然早いです。
(最初のitertoolsでcommand_listを作った時の処理も入れたら15000回ぐらい??)


計算結果はこれです

f:id:gragragrao:20170226144205p:plain


解答速報と照らし合わせてもあっていますね!


こうやって実際にpythonが使えるのを見ると面白いですよね〜

気が向いたら他の問題もやって見ます。


それでは〜〜

Record of study 〜2週間後前後〜

2週間ぐらいで、前にも紹介した教科書(下のやつ↓)を読み終えました。


本で書いてるサンプルコードを理解しながら、自分の手で書いていけば結構実力がつくんじゃないかと思います!

最後の方にはNumpy使ったり、簡単な機械学習のコードもサンプルコードとして乗っているので面白かったです。


初心者の人でも読めるようになっていると思いますが、やはり近くに誰かプログラミングガチ勢の人を見つけて、わからなくなったら聞いた方がいいかもしれないですね!


この本が終わったあとは、「各データ型ごとにどんなメソッドがあったか」を中心に第4章までをしっかり読み返して、破壊的メソッドとそうでないメソッドを区別して覚えました。


それからはAtCoderのBeginner問題をちょくちょくやり始めた感じです!


pythonはしっかりやれば完全な初心者でも2週間ぐらいでなんとなく書けるようになります!(書きやすいらしいです)


みんなpythonを始めよう!笑


それでは〜

Record of Study 〜開始から10日〜

勉強開始から10日後ぐらいについてです。


この辺りの時期に、インターン先のエンジニアの方に「インフラ勉強会」をしてもらいました。


その会社のネットワーク周りの環境を解説してもらって、ネットワークの全体的な基礎を勉強しました〜

f:id:gragragrao:20170224173242g:plain

こんな感じのやつですね!

インフラ周りのこともすごく興味を持ったので、勉強したいな〜って思いました。


AWSの資格なんかが取れたらいいな〜

やりたいことがどんどん出てきます。


まあ、一歩一歩ですね。




この頃Pythonの方は、

第7章:クラスの継承と高度なオブジェクト指向機能
第8章:モジュール
第9章:スコープとオブジェクト

あたりをさらっと読んでる感じです!





時系列が無茶苦茶ですが、初めから3週間強経った今はDjangoの勉強をしています。

日本語のドキュメントが充実していないので英語でやらざるを得ない部分はありますが、英語の勉強が同時にできると思って精進したいと思います。

この人の解説を聞きながらドキュメントを読んでいます。

「動画でざっと」→「文章を読みながら手を動かす」の流れです。

気張らずぼちぼちやります。笑

それでは〜

ABC #35 を python で解いてみた!

今日は勉強記録はお休みです!


そろそろD問題にもチャレンジしたいなあということで頑張って見ましたが、AtCoderのBegginnerコースでもかなり手こずりますね〜


数学は得意だったので、アルゴリズムを考えるのは楽しいのですが、パソコン初心者ということで、「どこまで自分で考えて」、「どこからパソコンに任せるのか」の見極めがなかなかに大変です。

問題 A:決められた比かどうか。

W, H = [int(n) for n in input().split()]

if W/H == 4/3:
    print("4:3")
elif W/H == 16/9:
    print("16:9")


問題 B:ドローン問題(要約が思いつきませんでした...)

import math
S = input()
T = int(input())

N = len(S)
p = [0, 0]
?_conter = 0
for n in range(N):
    if S[n] =  "?":
        ?_counter += 1
    if S[n] =  "L":
        p[0] -= 1
    if S[n] =  "R":
        p[0] += 1
    if S[n] =  "U":
        p[1] += 1
    if S[n] =  "D":
        p[1] -= 1

if T == 1:
    print(math.fabs(p[0]) + math.fabs(p[1]) + ?_counter)

elif T ==2:
    judge1 = math.fabs(p[0]) + math.fabs(p[1]) - ?_counter
    judge2 = math.fabs(p[0]) + math.fabs(p[1]) + ?_counter
    if judge1 >= 0:
        print(judge1)
    elif judge1 < 0 and judge2 % 2 == 0:
        print(0)
    elif judge1 < 0 and judge2 % 2 == 1:
        print(1)


A, Bは確かめをしていないので、あってるか分かりません笑


あっているかは別として、BegginerのA~Cは簡単に解けるようになりました。


普通のエンジニアさんたちには当たり前だと思いますが、成長を感じて嬉しいです〜笑

問題 C:一列オセロ、区間指定してひっくり返すのを繰り返すした後の配列を求める

# "0"は黒、"1"は白
N, Q = [int(n) for n in input().split()]
range_list = []
for i in range(Q):
    l, r = [int(n) for n in input().split()]
    range_list.append(list(range(l-1, r)))

final_seq = ""

for i in range(N):
    counter = 0
    for each_range in range_list:
        if i in each_range:
            counter += 1
    if counter % 2 == 1:
        final_seq += "1"
    elif counter % 2 == 0:
        final_seq += "0"

print(final_seq)


問題 D

高橋君が住む国には N 箇所の町と町同士をつなぐ一方通行の道が M 本あり、それぞれの町には 1 から N の番号が割りふられています。 i 番目の道は ai 番の町から bi 番の町へ移動することが可能であり、移動に ci 分だけかかります。
所持金が 0 円の高橋君は T 分間のトレジャーハントに出かけることにしました。高橋君は開始 0 分の時点で 1 番の町にいます。また、開始から T 分の時点にも 1 番の町にいなくてはなりません。高橋君が i 番の町に 1 分間滞在すると、 Ai 円が高橋君の所持金に加算されます。
T 分間のトレジャーハントによって高橋君の所持金は最大いくらになるか求めてください。


今回はこれが難関です!



まず、そもそもMをNの関数にしなくていいのかな〜なんて思ったりします。1番の町から出ても帰ってこれないかもしれないですもんね〜
まあ、そこには触れないように考えます。





と思ってしばらく考えた末、ヒントも読みましたが、なにやら難しいぞ.....


今日はひとまず諦めます。。泣

Record of study 〜開始から5日後時点〜

今日は開始から5日後前後のお話です。


まず、前の記事で紹介した本の

第4章:組み込み型を使いこなす

でつまづきます。

f:id:gragragrao:20170222180116j:plain



関数の種類も多くなってくるし、一覧になっていても初心者には何が重要かわからないし、どうやって使えばいいのかもわからないしで、苦労しました。


最初に戦法は、「わからないところは無視して素通りする」です。笑


「後ろの方に書いてあることがなんとなく理解できたらここもわかるようになるんだろうな〜」と思ったので、完全に理解するのを諦め、とにかく読み進めることを重視しました。(1周目は半分も理解していないと思います笑)



さらに次の章に続きます。

第5章:python関数型プログラミング
第6章:クラスとオブジェクト指向開発


意味わからん


そもそも関数型とかオブジェクト指向とか言われてもよくわからないですよね〜


ってなって、ここで、そこまでの不明点を社長に説明して、教えてもらいました!


オフィスで9時ぐらいから、2時間近く教えてもらいました!
なんて優しい社長だ...!!

f:id:gragragrao:20170222180946j:plain


ってことで、なんとなくイメージで理解したので、4章から読み返しました。



未だになんとなくなので5、6章はそろそろ読み返しておきたいなあ〜って感じですね。


それでは!


次は「1週間後前後」について書いていこうかな〜

Record of study 〜開始から3日間〜

開始から3日間の話です!


まず、基本を知らないとダメ!ということで、簡単な文法書に取り掛かりました。

使ったのはこの本です!

ネットで色々調べていたところ、評判が良かったので即決して買いました。


450ページぐらいの割と分厚い本ですが、受験時代も「化学の新研究」という760ページぐらいの化学の参考書を4〜5周ぐらい読んで勉強していたので、それほど腰は重くなかったかなと思います〜


初めの3日間で読んだのは大体以下の範囲です。

第1章:プログラミング言語 Python
第2章: Pythonでプログラミングを始めよう
第3章: Pythonの基礎をマスターする



エディターはAtomを使っています。無料ですし、色々拡張機能もあるので使いやすいですよ!
でも最初の方は普通にターミナルに直接打ってもいいかもしれません。いちいち呼び出すのが面倒なので...


手順としては、サンプルコードを書きながら、なんとなく「こんな感じで書くんだ〜」って思いながら見ていました。


「データ型とかいっぱいあるけど用途がわからん」とか、「なんか数学チックでなじみやすい」とか考えながらやってました。


最初の3日間は結構適当にさっとやっていました。

こういう分厚い本での勉強法ですが、

1周目:ざっとでいいから理解していく
2周目:それぞれの役割をきちんと理解する
3周目:細部まで暗記する

という感じで進めればいいのかなと思っています。

受験勉強で培った勉強法が使えますね!笑


では、次は「その後の2日間」ぐらいについて書こうと思います!

ARC #03 を python で解いてみた!

ARC #03 を解いて見ました。

今回はC問題も難しくて解けなかったので A, B 問題のみになります。

「もっといい書き方があるよ」とかがあればコメントにて教えていただけると嬉しいです!!

問題 A:GPAを求める

N = int(input())
grade = input()
gpa_convert_dict = {"A": 4, "B": 3, "C": 2, "D": 1, "F": 0}
grade_gpa = []
for i in range(N):
    grade_gpa.append(gpa_convert_dict[grade[i]])

average = sum(grade_gpa) / N

print(average)

問題 B:逆文字辞書を作る

N = int(input())

word_list = []

for i in range(N):
    word = input()
    word_list.append(word)

word_list_rev = [word[::-1] for word in word_list]
word_dict = {word_list_rev[i]: word_list[i] for i in range(N)}
word_list_rev.sort()

for key in word_list_rev:
    print(word_dict[key])

Record of Study 〜始めるまで〜

全くの初心者と書きましたが、実は2016年の12月頃に一回 Rubyの勉強をしようと試みていました。


その時は周りにプログラミングを教えてくれる人も全然いなくて、「Tech::Camp」に通おうと思ったりしてたんですが.....


体験に行ったり、Tech::Camp主催のイベントとかにもいったけど、授業料高いしなあ...ということで渋っていました。。


そこで、独学で分厚い本を2冊ぐらい買って(10000円ぐらいつぎ込みました!)、RubyとかRailsとかの勉強をしていましたが、



全くできない!!


てかなんのための文法かとかもさっぱり!!



ってことで、早々に諦めました。笑


Rubyって日本人の方が作ったプログラミング言語で、日本語の記事も豊富だし、てかそもそもプログラミング言語として簡単!って聞いていたのに...みたいな感じで絶望的に(笑)


f:id:gragragrao:20170220095630j:plain


でもプログラミングやりたいなあ〜とかなんとなく思ったまま、何をやればいいかわからない状態がしばらく続きます。




そうこうしてるうちに、AI(人工知能)を使ったビジネスを展開しているベンチャー企業の社長に出会ってそこで働かせてもらえることになりました。


そこの社長とリードエンジニアの方に教えてもらいながらプログラミングの勉強が始まりました!


プログラミングの勉強の壁で一番大きいのは何と言っても「環境設定」!!


わけわからない黒い画面を開いて呪文みたいなコマンドを打っても帰ってくるのは意味不明な文字列...

f:id:gragragrao:20170220094236p:plain


ネットのページとか本とかに書いてある通りにやってもエラーが出たら、やる気が失せますよね〜


やはり、最初の設定だけはちゃんとできる人に任せた方がいいと思います!


pythonの勉強だけなら環境設定はそんなに難しくないと思いますが...)




こんな感じで python3 の勉強が始まりました!


次は、「プログラミングの勉強を始めて3日間ぐらい」についてを書いていきたいと思います。


それではまた明日〜