「挫折した本」と「読み切った本」
数学と物理の勉強は楽しく、そのおかげでいくらでも外出自粛ができそうです。ライフイベントが停滞しないか心配になるほど。
その中で気づいたことは、私はあまり賢い人間ではなさそう、ということです。いろいろ興味のある本を買ってみたのですが、わからないところ多々あり、読みきれなかった本がたくさんあります。
「これを読んだよ!」という情報は巷にあふれていますが「これは読みきれなかった」という情報は秘匿されがちです。うまくいかなかった研究結果が論文にならないのと同じです。そういう失敗事例こそ、公にして共有してほしいと思っています。
と、いうわけで、私の最近の「挫折した本」と「読み切った本」を書いていきます。
自分の知識レベルがはっきりと現れてしまう恐ろしい記事です……!
挫折した本
「数値流体力学」
部署異動に伴って、流体を取り扱い始めました。仕事をする中で、流体の理解には、かなりマニアックな数値解析やモデリング知識が必要と感じて手に取った本です。
大学で流体を専攻していた同期の「乱流には手を出さない方がいい」という忠告を押し切っての挑戦でしたが、案の定乱流のモデリングでつまづきました。乱流怖い……輸送方程式ってなに……?
もっとわかりやすい副読書を探し中です。
流行りに乗って始めたものの飽きた、という駄目なパターンです。これも50ページくらいまでで止まっていたかも……確か購入したのは去年でしたでしょうか。
ただ、「事後確率」「事前確率」「メールのソート」について、機械学習の初歩の初歩はぼんやりと頭に残っているので、読んだ意味はあったかなと思います。繰り返し挑戦したい一冊です。
ただ、実利を考えるならKaggleでデータ分析をごりごりやったほうが良さそうなので、手を付けるならそっちからかな、とも思っています(kaggleスタートブックも買って積んでいます)。
「オペレーティングシステム」「Webを支える技術」
有名なGoogleのお医者さんに触発されて買ってしまった本です。あのブログでは、さらっと読みこなしてしまった感じがありますが、初学者にはなかなか頭に入ってきません。
すぐに読み切るのは難しそうなので、目下競プロを楽しくやりながら、きっかけを見つけて再挑戦したいです。
これも50〜100ページくらいで止まった記憶があります。そのあたりに「死の谷」的な何かがありそうです。
「大学教養 線形代数」
線形代数はいまだに面白さがよくわかっていません……FFTとかを実装する段になればわかってくるのかも。理工系大学卒で線形代数をよくわかっていないのはお恥ずかしい限りです……ただ、今後数学を勉強していく上で必ず参照したいところが出てくると感じています。手元において繰り返し読んでいきます。
読み切った本
「高校数学でわかる流体力学」
安定のブルーバックスシリーズです。完全流体についての議論は、この本のお陰でかなり自信を持ってわかったと言えるようになりました。
「流れの数値解析入門」
こちらは少々実践的な本。「渦法」のアルゴリズムについて知りたいと思って購入し、実際に圧力場を求めるプログラムを組んでみたりしました。
が、最後までエラーを修正しきれませんでした……実用的なコードを組むためには、知識だけでなく、忍耐力と根気が必要だと痛感しました。
自分の「実装力」の低さを痛感させられ、いろいろ学びのある本でした。何かを作るために必要なのは、何よりもまず強い意思です。
なんとか読めそうな本
「道具としてのフーリエ解析」
直感的なイメージを重視した、とてもわかりやすい本です、この本のお陰で、式を見ながらですがフーリエ級数展開からDFTまでの計算ができるようになりました。
前半の半分でフーリエ級数~DFT・ラプラス変換を、後半では応用編としてFFTを取り扱います。
前半は読み終わったので、これから応用編に取り掛かります。以前競プロで挫折したFFT問題にリベンジできそう。とても読むのが楽しみな本です。
「『集合と位相』をなぜ学ぶのか」
理論としての数学には馴染みがなかったので、その足がかりとなる知識がほしいと購入しました。SNS情報によると、ストーリー仕立てで易しい読み物、とのことで油断していました。実際に読んでみると、定理の証明の議論についていけなかったり、見慣れない定義に戸惑ったりと思うように進みません。
ただ、ゆっくりと読んでいけば十分理解できる内容なので、気長に読んでいこうと思います。
微積の基礎も復習していって、最終的には「無限級数の足し算と積分の入れ替え」や「フーリエ級数の収束」といった議論を丁寧に追えるようにしたいと思っています。
まとめ
あれこれ手を出しましたが、そのうちのひとつだけでもものにするのは大変です。こういう雑多な勉強が許されるのは学生の頃だけだよなあ、とは思いながら、趣味だからとちょこちょこ続けています。
ただ、もしも仕事として役立てるなら、分野を絞って注力しないとどれも中途半端に終わりそうです。もう少し自分の興味を絞りながら、かつ楽しんでできるようなところを模索していきます。ストイックにいくのも良いですが、なによりも続けることが大事かなと思っています。
AtCoder Beginner Contest 161に参加しました。
[今回の戦績]
Rate404の茶パフォ、A〜Cの三完でした。
[所感]
A〜Cについてはかなり安定的に回答ができるようになってきました。ようやく、D問題からのアルゴリズム知識と実装力を問われる問題にも挑戦できる準備が整ってきたと感じます。
今回のD問題は、以前も見たことのある桁DPのようです。
以前見かけたことのと類似の問題なので、解けるようになっておきたかったですが、初見ですぐ理解して使いこなせるようになることはやはり難しいです。
[今後やること]
直近のABCのD問題を復習します。
パナコン以降も全コンテストに参加してきましたが、自力で回答できたD問題はまだありません。解説動画を見ながらコーディングして、アルゴリズムとその実装力を身に着けていきます。以前とやることは変わっていません。
劇的に学習スピードが上がるような手法があれば、そっちを採用していきたいですが。
目下、ABC-157/160のグラフ問題、ABC-161の桁DP問題を、解説を見ながら実装していきます。
[その他]
プログラミング学習を2019年11月から始めて5ヶ月経ちました。ようやく、当初の自分が想像していた「アルゴリズムの実装」に取り掛かれるくらいの知識を身につけられました。
またひとステップ高い壁と思いますが、楽しんで継続していこうと思います。
パナソニックプログラミングコンテスト2020に参加しました。
初めての緑パフォでした……!
そのおかげで、レートは+68と過去一番の伸びとなりました。
ABCは、そこそこ安定的にC問題まで解けるようになってきました。
【今回の結果】
A〜Cの三完です。D問題は問題文の意味さえ理解できず未着手でした。
解説動画を見てみると再帰を使ったDFSのよう。コードは短くシンプルですが、私には読めません……D問題の読解を今週の課題としたいと思います。
再帰わからん……!
【所感】
簡単な問題を正確に解けるようになり、一発AC(もちろんテストケースは試す)が出せるようになりました。以前より慣れてきたと感じます。時間をかけたのだから当然ですけど……
やるべきことは今までと変わらないはず、と思っています。
問題を解き、できなかったところの復習を繰り返します。目的はコーディング慣れとアルゴリズムの知識習得です。「これはワーシャルフロイド……!」などと言えるようになりたいと思います。いつだったか、グラフをマスターしたいと言っていましたが手をつけていませんね……
昨年から少しずつ勉強を初めて気づいたこととして、私は新しいことをその場で理解して使いこなせるようなふうには生まれついてないようです。何度か繰り返し同じ課題にあたり、抜けていたところを補填し、しばらく経って苦労を忘れたころにはいつのまにか解けるようになっている、そんな傾向があります。
自分の成長特性(自作用語)をモニタリングする機会として、AtCoderはちょうどいいかもしれません。
【その他】
もっと実応用に近いプログラミングに関心があります。
例えばkaggleのデータ分析、openform(つづりが違う気がする)なんかを利用した流体の数値解析、あとは何だったっけ……? ともかく興味の先はいろいろあるので、時間の許す限りいろいろつまみ食いしていこうと思います。
数学関連で「集合と位相をなぜ学ぶのか」が面白そうでした。導入に熱伝導方程式の解法が来ているあたり、私の理解度とぴったり一致しています。これ大学の一年生向けの本としておすすめされている……大学数学難しいです。
ブログはサボっていましたが、競プロは続けています。年内茶色コーダー(あわよくば緑)を目指して頑張ります。
あ、あと全く関係ない話ですけど、婚活もしないと……でも婚活という用語と、あのハートマークとキラキラエフェクトだらけの広告がとても苦手であまり踏み入むのをためらっています。なんといいますか、真面目に勉強しているふりをして、人生のメイン課題をサボっているのかも……と思うことがよくあります。
ぼちぼちやっていきます。
AtCoder Beginner Contest 154に参加しました。
今回の戦績
ようやく茶色ラインが見えました……!
先週は、ABCの過去問を144くらいまで辿って解いていました。そのおかげか、A〜Cがさくっと解け、TLEしながらもDまで余裕を持って解くことができました。
できなかった問題
https://atcoder.jp/contests/abc154/tasks/abc154_e
E問題です。「桁DP」と呼ばれる問題だそう。E問題になるととたんに解答の検討もつかなくなります。解説動画をみても理解ができなかったので、その前知識をきちんと付けることが今週の課題です。
今後の目標
AtCoderエスティメーターによると、茶色コーダーになるには1300程度のパフォーマンスを出す必要があるようです。1300がどの程度かを過去のコンテスト記録から見てみると、だいたい6000人中2000〜1000番目程度、難易度的にはDPが実装できる程度のよう。
DPを使いこなせると次の一歩が踏み出せるかなと感じていて、今週はDPの問題を集中的に解いていきます。
https://atcoder.jp/contests/dp
AtCoder Beginner Contest 153に参加しました。
今回は無念の三完でした……!
5500人中5000人がD問題まで解くという比較的簡単なコンテストだったようです。
レート変化
パフォーマンスは前回170→今回90と非常に落ちていました。絶対評価でなく「周りの人が解けない問題を、周りの人より早く解ける」ということで評価されます。
自分が参加しているのは「競技」プログラミングなんだ、ということにようやく思い至った感じです。スピードと技術……! 私はスピードよりもデータ処理手法の概念と実装に関心があるので、早く解くことよりも、他の人が解けない問題を多く、という方向に注力していきたいです。「いもす法」とか「FFT」とか使いこなしたいぜ、という願望があります。
ざらっと全部の問題を見てみると、E問題は正解者が1000人ほどしかいません。DPを使えるかどうかが一つの区切りようです。ということで、DPへの関心が非常に高まったコンテストでした。
パフォーマンスは落ちましたが、ひとまずレートは+3されました。
今回解けなかった問題
https://atcoder.jp/contests/abc153/tasks/abc153_e
D問題です。頑張ればできたかもしれないけどC問題に時間をかけすぎました……!
再帰を利用する典型的な問題だったようです。解説を見たらとても短くシンプルに解答していてすごいなと思いました。
類似の問題に当たったときは、数字の小さなほうから具体例を調べ、答えが再帰関数fを使った漸化式で表せないかチェックしたほうが良さそうです。
Atcoderの講座では難しくて飛ばしていた再帰ですが、今読むと役に立つツールとして利用できるかも、と思えるので、多少はコーディング慣れしてきた感じはあります。
また、D問題が簡単だったのでE問題もやってみました。こちらは方針も立たないので、動画解説を見ながら解答しました。理解できていない部分はありますが、DPは各種束縛条件に対して最小値or最大値をテーブルに記録していく手法だというところまではわかりました
DP表を埋めていく過程をイメージしながら実装できるようになりたいですね……!
まとめ
競技プログラミングは相対評価の厳しい世界です(当たり前でした)。
私としては、FFTやDPといった手法を自由自在に使いこなしたい欲求があるので、ひとまず早問きは意識せず、自分に解けない問題に挑んで新しい武器を手に入れることに主眼をおいていきたいです。
AtCoder Beginner Contest 152に参加しました。
開催頻度が高くて嬉しいです。
今回は、ratedのコンテストで初めてC問題をACしました……!
ちょっとだけステップアップしました。
◎レートの変化
C問題を解けたおかげか、ちょっとだけ傾きが大きくなっています。400点ごとに色が変わるそうですが、茶色コーダーにはまたまだ遠そう……50点/月ごとレベルアップしていくと仮定すると(大変雑な仮定ですが)、だいたいあと半年強くらいで次のランクに上がれそうです。学習を続けていけば、年内茶色コーダーは達成できそう。
◎今回解けなかった問題
https://atcoder.jp/contests/abc152/tasks/abc152_d
D問題。条件にあった数字を集計していく問題です。私が詰まったところは「ある整数の先頭の桁を取り出す操作」です。
stringで文字数を数えてから、intに戻して10×文字数で割るか……? そんな計算を埋め込んだら途中でコードがぐちゃぐちゃになるなと焦っていました。
また、集計の段階ではpairとmapが使えそうだなあとぼんやり考えつつ、pairのpも打ち込むことなくコンテストを終えました。
コンテストを終えたあとはまず、youtubeを見ながらコーディングしてD問題をACしました。youtubeを見れば理解できるくらいには慣れてきました。
◎今回学んだこと
①やっかいな操作は関数として取り扱うこと
今回は、「ある整数を入れたときに、先頭の数と最後尾の数を吐き出してくれる関数」を作ることがひとつめのポイントでした。
変数 f (引数){
操作
return 変数に入れて返す数
}
という形を迷わず使えるようにしたいです。
あと「;」忘れはいい加減直さないと駄目だと思います……
②先頭の桁の取り出し方
while文を使ってこんなに簡単に取り出せるんだ……! と、実は今回一番感動したポイントです。nを10で割り続けてwhile(0)でストップをかける、という考え方。今までfor文のループばかり使ってきましたが、whileもこんな風に使えるのですね。
③pairとmap
機能はぼんやりとわかっていても書く段階になると文法がわからなくなってしまうので、ここは繰り返し練習して身につけたいところ。
◎総括
情報処理の方法はぼんやり頭に思い浮かびますが、それを実装するための機能が思いつかなかったり、頭にぼんやりと浮かんでも文法が曖昧で使えなかったりという感じです。
繰り返しコードを書いて動作確認をしてC++の機能を覚え、機能を利用するために正しい文法で記載をできるようにし、また先頭桁の取り出し方など数字いじりの典型的なテクニックを集めていく。それが今からやることです。
テクニックや機能を覚えていくことは時間さえかければできることなので(それはそれで大変ですが……)、今は努力に対してそこそこ成長が見える時期と思っています。
発展的な思考が求められるレベルはまだまだ先。そういう境地までたどり着けると相当楽しそうですが。
まあ、ぼちぼちやっていきます。
あ、あともうちょっとブログ見やすくしたいな……横線入れるとかいい感じにhtmlをいじっていきたい(いつやるかは決めてないのでずっとぐだぐだしそう)。
AtCoder Beginner Contest 151に参加しました。
今年の目標は、「ABCを欠席しない」ということで、今のところは誓いを守れています。(5回…! うち2回はunratedでした)
◎今回の結果
A問題とB問題の二完です。
C問題の壁がなかなか超えられないことが現状です。
ですが何度か参加して、レートはちょっとずつ上がっています。これはアルゴリズム力というよりも、参加回数補正のおかげでしょう。
◎今回解けなかった問題
https://atcoder.jp/contests/abc151/tasks/abc151_c
数字と文字のペアの中から、ACとWAの数量をカウントしていく問題です。
「すでにACが出ていればカウントしない」ことや「WAはACが出た時点でペナルティとしてカウントする」と言った条件がつきます。この条件のところで私はこんがらがりました……
この問題を解決するポイントは、「すでにACが出たかどうか」をbool関数を使って保持しておくことでした。とても基本的な考え方だと思いますが、いざ問題を目にすると思いつけないみたいです……
今の私の実力としては、アルゴリズムやデータ構造と言ったことを学ぶ前の、「実行したい処理をどうやってプログラムに落とすか」という、計算機上での処理の仕方に慣れる前の段階です。
きっとプログラマの方が目にしたら「あ、この人はとても時間がかかるタイプの人だ」と判断されること間違いないでしょう……
自転車に乗れるようになる前の子供の状態なのかなと思っていて、大変悔しいですが、かなりレベルとしては低いところ。(私はたいていのことがそうなのですが……)
本来は、具体的にやることに落としてひとつひとつ潰していくのが理想ですが、そういうことを考える以前の状態にいると感じています。
今やることは、とにかく処理慣れすること、人が直感でさらっとこなしてしまうような部分を、手を動かして体に覚え込ませることです。
「こういうふうに学ぶ!」ということをもっと具体的に考え始められるレベルに、まずは到達したいと思っています。
Atcoderの提出状況を見ると(電子データが残るっていいですね……!)
学習し始めは「2019-11-17 16:55:37」でした。もう二ヶ月……!
なかなか学習が早いほうではありませんが、着実に一歩ずつ前進していきたいです。
ひとまずは、C問題を埋めまくろう、と思っています。今年中には茶色になれるといいなあ…
個人目標はAtcoderと小説。気長に続けていきます。