yakataの情報奮闘記

競技プログラミングの話やVRや背景の話をします。

FCNの論文読んだよ

ようやく論文の実装部分が読み終わり、実装フェーズに入れます。長かった。 英語が苦手なのもありますが、時間かけ過ぎ感。次からは目標時間定めよう。

この方→www.mathgram.xyzの実装を参考にしつつやっていこうと思います。パット見た感じ、論文にあったDropLayerをまるごと消しているっぽいんですけれど、この層は消していいみたいな判断はどうやってするんでしょう?それがわかるようになったら初心者マーク外れそうな気がします。

modelに関してはとりあえず変数xを伝播させていって、skipconnectionする必要があるものだけ別の変数に値渡しする実装がきれいだったので、そんな方針にしようかと。

今日のDL勉強はお終い。

【日記】UnityのShader触ってます。

生存報告

いわゆる3日坊主でしたが、生存報告と称して毎日ラフイラストをあげようとしていた時期が自分にも有りました。ただ、かかる時間からして現実的でなく、生存報告は途絶えていました。今回はブログなら(イラストよりは)コストが低いので続けられるんじゃない??ってことで生存報告を始めていきます。こちらには情報関連のことを書きます。コンテンツ周りはdaily-yakataの方に書いていきます。

今日やったこと

Unity

UnityのShaderをこちらのブログをお借りして触っております。昨日も少し触って、今6記事目です。全33記事なので、1weekで終われば御の字、という感じでやっております。

Keras

Kerasを使ってモデルを書こうとしています(未来系, これからやる)。SkipConnectionがあるので、TutorialにあるSequentialでは出来ず、深堀りしている次第。Kerasの目標であるところの拡張性という点では申し分ないのですが、そのやり方を見つけるところが意外と難しそう???(先人の実装は見つかるのだが、Tutorialにモデルの書き方が見つかっていない)

Pythonで新しいライブラリに触れたときとかに役立つTips

今日、2019/07/17も僕は生きていたんだよっていう記録を残したくて。

エンジニア界隈ではWordは使うんじゃない、Markdownこそ至高みたいな風潮があったりなかったり。とにかく、中身が複雑すぎるツールを嫌う傾向にあると思います。とはいえ、Wordさんはおそらく一番使われているドキュメント作成ツール。そこから逃げるわけには行きません。自分が書くならともかく、他人がWordファイルで共有してくることを止めることは出来ません。

そのときにとりあえず構造化したいなぁと思って、ネットの海をプカプカしていたらPython-docxというライブラリを見つけました。これを使うとPythonでdocxファイルをいじって、好きな形式でoutput出来るらしい。今回はcsvで表示することにしました。

さて、本題は新しいライブラリでとりあえず成果を出す方法です。 まずはドキュメントのTutorial的なものをよみこみましょう。そのうえで登場人物となるものたちのクラスを調べます。

print(new_concept.__class__)

それらのクラスがわかったら、何が出来るのかを調べます。

def examine_new_concept(new_concept):
    print("Usage: new_concept\nthis concept have several items. ↓\n")
    for key, value in new_concept.__class__.__dict__.items():
        print('{0}, {1}'.format(key, value))
    print()

    print("new concept have several functions. ↓\n")
    for x in dir(new_concept):
        print(x)

    print()

関数名と簡単な説明が表示されるコードです。大体これだけで何が出来るのかわかります。
出来たら、各クラス間の関係性を書いていきます。これは全て必要なわけでなく、今出したいアウトプットに必要な項目だけでとりあえず大丈夫です。

この上で必要な関数の詳細はドキュメントを読んだり個別で行うとして、概ねの必要な概念のマッピングはできたんじゃないでしょうか。

AtCoder Beginner Contest 133に参加するだけ

ABC113をやります。使用言語はC++(とRuby)です。 配信はこちら (一部ボイチェンあり)

A問題

問題はこちら

方針

A円/人かかる電車をN人分払うのと、タクシーB円を1回払うものの比較

必要な知識

  • 標準入力
  • if文
  • 標準出力

B問題

問題はこちら

方針

N<=10なので、愚直にすべてのパターンを調べても間に合う。 累乗や平方根を求めるのにint型とfloat型を変換する必要がある点に注意

整数になるかの判定は、小数部分を切り落としても同じ値を示すかで判断させた

必要な知識

  • 型変換
  • (計算量の概算)

C問題

問題はこちら

方針

R-L+1(=範囲内の個数)が2019以上ならば0(mod2019)があるはずなので、答えは0

そうでないならば全探索しても10**6程度で間に合う

必要な知識

  • modについて
  • 計算量の概算

D問題

問題はこちら

方針

まず例を使って手計算してみると、全部のダムを足すと振った雨の量がわかります。また、2番め、4番目………と一つおきに足して2倍すると、1つ目の山に降った以外の雨の量がわかります。これを用いてすべての山に降った雨の量が計算できます。

必要な知識

  • 算数
  • for文

EF問題はちから及ばすわかりませんでした。解説読んで理解出来たらまた記事にすると思います。

応用情報技術者試験受かったよって話

今しか書けないだろうし、とりあえず受けて身についた知識くらいだけでも書いておこうかなと。もう忘れているところも多くて駄文だけれど。 後著者は基本情報技術者試験は受けていないので、それだけなら基本情報技術者試験でいいじゃんってことも書いてあるかもしれません。

プログラミングしていると忘れるけど、パソコンっていうのはハードウェア、つまりは物質の制限を受けたものを使って作っているわけで、プログラミング言語というものはあるいはデータ構造というものはこの構造によって強く縛られている。逆に言うと、ここがわかると、値渡しはコピーが発生するから遅くなるとかの話が理解できるようになる。 Progateとかドットインストールとかで複数言語を初学者のうちに学んだ人ならわかってもらえると思うが、どうして言語が違うのにこんなに似ているのだろうという感覚がCやC++を学び、高レベル言語はCで書かれている話とかを聞いて、プログラミング言語C言語に強く縛られているというような理解をしていたりするじゃない? それが、C言語はパソコンのハードウェアが可能なloopと配列とかの構造に縛られている。だからプログラミング言語はハードウェアに縛られているんだよみたいなハードとソフトのつながる場所みたいなことが体感できたりする。

別の話題としてはIT沼にいるとIPv6とかの言葉は聞くけどそもそもネットワークの歩き方わからんとかいう人には、応用情報の教科書の1章を読むととりあえず必要な単語がわかる。

何も考えずにウイルス対策ソフトを入れているけど、どんな攻撃手段があるのとかもわかったりする。(お気持ち程度)

ソートの話に触れると先代の頭いい方々の頭いい部分だけが凝集された知識が得られる。 今こうやってブログ書いているのはネットワークがあって、サーバーとクライアントの関係があって出来ていることだけれど、じゃあネットワークってどうやって管理されているの?とかもお気持ち程度はわかるようになる。

一言で言ってしまえばソフトウェア周辺の教科書のような立ち位置として必要十分にまとまっているように感じた。 歩き方というかキーワードというかがわかるようになるので、その後好きな情報の分野に手を伸ばしやすくなっている。 IT系万人受けるべきとは言わないけれど、ある程度独学でプログラミングなり何なりをしてきた人が知識の偏りを正すものとしてはまぁいいものなんじゃないかなぁと。

ABC130

所感

ABCD: 簡単 E: DP? 何を状態としてもたせればいいのかわからなかった F: わからん。

解説のようなもの

A

全探索すれば間に合うので割愛

B

同上

C

exampleでテストしてみると、中心を通れば綺麗に半分になることがわかる
よって指定された点が長方形の中心ならば無限に線を引けて、そうでなければ1本のみ引ける
個人的には200点問題だと思う。ココらへんからいつも以上に早解きが重要になると感じる

D

累積和でsumを取っておくだけだと始点と終点を指定しなければいけないのでO(N2)だけ必要になるが、始点を決めた上で最短の終点が決まればそれより長いものはすべて条件を満たすのでO(1)でできる。この最短の終点は二分探索でできるのでO(logN)でできる。よって始点ぎめO(N)*終点ぎめO(logN)で間に合う

(以下通せてない)

E

N<2*103ってO(N2)間に合うし、O(NM)が間に合う。ある写像i→jにおいて、i-1番目の文字までの場合の数に依存している(その中身には興味がない)ためにDPでできそうってところまでわかって、遷移図が書けなかった

F

わからん。1次元にしか動けないので、固定値があることはわかった。そのうえで時間ごとの関数を定義してmax、minになる点が変わるごとに探索?