samayotta.show()

好きな映画は『たまこラブストーリー』です。

【スターティングGo言語雑感】ARC83[C][D]

 

スターティングGo言語 (CodeZine BOOKS)

スターティングGo言語 (CodeZine BOOKS)

 

 GO言語を競技プログラミングに使用できないか検討している。

動機はC++の挙動や言語仕様、STLの使い勝手の悪さにイライラさせられたから。いろいろマクロを試したりしたが、根本的な言語仕様で限界を感じたし、何より理不尽なエラーメッセージには消耗させられた。もうあの赤い文字を見たくなく、それだけで競プロから離れる理由になりかねなかった。

代替言語の候補はJava / scala / GO / rustの4つ。GO以外では、インターンでお世話になった企業/部署で実戦投入されていたので是非scalaを使ってみたい気持ちがあり、GOとの間で揺れた。最終的には評判の良い入門書『スターティングGO』の存在で決めた。

 

GOの所感

  • エラーメッセージがわかりやすい

少なくとも自分が何を間違えたのか、はっきりとした英語として教えてくれる。ので、エラーメッセージにひとつひとつ対応していけば、自然に正しいプログラムが完成するようになっている。

  •  fmt.Println()の使い勝手が良い

 すなわちプリントデバッグが快適。

  • リスト/連想配列が(それなりに使い勝手の良い仕様で)実装されている

ただしリストにあたる配列/スライスはやや複雑な仕様になっていて、自分もまだ挙動を把握しきれていないところがある。基本的にはC++vectorコンテナなどよりはずっと良いが、Python / Rubyのリストよりは使い勝手で劣る。

  • 競プロ的な関数は充実していない

標準入力、max、min等の簡単な計算関数が[競プロに使いやすい仕方で]入っていない。これらは特に難しくなく自作できるが、まえもって準備をしておく必要はある。

  • ループがややだるい。

range based forの使い勝手はC++11やBoostよりはずっとマシ。とはいえ、range based for以外も使うことが多い競プロでは、Cのfor文とほぼ同等のループを書かなければいけないGOはややだるい。REPマクロは正直なところGOでも欲しいと思った。マクロが定義できるのかは知らないが。

  • 型が厳しい

これは賛否両論。例外なく一切の暗黙型変換を許さない仕様なので、たとえばfloatとintの間でも容赦なく型エラーを吐く。ライブラリ関数も厳密に引数の型を指定しており、勝手に融通を効かせてはくれない。しかしC++のようにそれでバグったりしないので筋道がはっきりしており、その意味で安心感はある。必要に応じてやはり適切な関数を自作する必要がある。

  • 学習コストが非常に小さい

よく言われていることだがこれは本当。C++Pythonを使ったことのあるプログラマにとってはGOは非常に敷居が低い。言語仕様がコンパクトなことに加え、文法や予約語に?がつくようなことがない。実際、僕は一日半程度である程度GOプログラムが書けるようになったので、興味のある人はまず使ってみるのがよい。[プログラミングに慣れていない人がGOをどう思うかはよくわからない。C++よりは確実に良いとは思うが]

 

以下は先日のARC083[C][D]のGO解答。これをみてもらえば、GOがどのような雰囲気なのかざっとつかめるはず。

続きを読む

AtCoder ABC001-002[D]

できるだけ早く朝におき、出社し(研究室に出現して)、夜五時か六時に退勤するようなシステムで生活すると精神衛生上良い。生活に余裕が出てきたのでふたたび夜時間をatcoderに使うようにする。

目標としては、2ヶ月くらいでARC2完(=ABC全完)取れるところまでいきたい。[C]は1ヶ月で安定するようになったので、多めに見て2ヶ月くらいかけて問題演習をすると取れるようになるのでは、という希望的観測ですすめていく。

codefesの予選抜けられたらいいなあ。

続きを読む

AtCoder ABC041-043[C]

 この周辺は簡単すぎでは?

C: 背の順 - AtCoder Beginner Contest 041 | AtCoder

gist408a6135b1dc885a599b049bd803ccbc

一言コメント:pythonのタプルソートとかで瞬殺できる。

C: こだわり者いろはちゃん / Iroha's Obsession - AtCoder Beginner Contest 042 | AtCoder

gist675528bed26b30ffc12c2ca5e7430c3b

一言コメント:律儀にループを回す。

C: いっしょ / Be Together - AtCoder Beginner Contest 043 | AtCoder

gistda99bb00ba79f409a05218ccdef541dd

一言コメント:これも総当たりで良い。

AtCoder ABC038-040[C]

C: 単調増加 - AtCoder Beginner Contest 038 | AtCoder

gist10da5eaabcb42bb3216c6cac68776a79

一言コメント:これ、『ドワンゴからの挑戦状』で出てた「ニコニコ文字列」の類題ですよね?

C: ピアニスト高橋君 - AtCoder Beginner Contest 039 | AtCoder

gistcefa8c381c49f4dc53456ae77b422ce8

一言コメント:これをバグらせてしまって大変につらかった。パターンマッチングでは、断片ではなく全体のほうを拡大しておくのが重要だということを学ぶ。

C: 柱柱柱柱柱 - AtCoder Beginner Contest 040 | AtCoder

gist3211822cea95e7cadc290f1476d9471e

一言コメント:動的計画法というか数列ですね。