【スターティングGo言語雑感】ARC83[C][D]
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 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
一言コメント:動的計画法というか数列ですね。
AtCoder ABC035-037[C]
二日分一気に更新。
続きを読むAtCoder ABC027-029[C]
ひどい暑さになってきました。
続きを読む