ながめも

競技プログラミングについて

2023年の振り返り

去年の振り返り記事はこちら。

coonevo.hatenablog.com

2023年も大晦日となりましたので、簡単に今年を振り返ります。

仕事

2023年は仕事としてはソフトウェアの私としては大きめな部分の責任を負ったり、初めて海外出張したり、障害対応が当社比でできるようになったり、小さめのプロジェクトのマネジメント(?)に挑戦したり、など、挑戦と挫折、成長それぞれできたと思える一年でした。

海外出張ではその意義を理解でき、来年も別の機会で連れていってもらえるように仕事を作ろうとポジティブな影響を受けることができました。

障害対応は苦手意識があったのですが、開発経験を積んだこと、メンバーに質問して仕様を理解することに努めたことで、得意とは言わないまでも苦手意識を持つことはなくなったかなと思っています。やっぱり作って壊しまくるのが大事だと思いました。

プロジェクトマネジメントは挑戦する機会をいただいたのにも関わらず、挫折しました。他人を上手に動かす方法、数年単位の先を見据えてタスクを処理する方法がわかりませんでした。わからなかったので外してもらうという、チームや上司には迷惑なこともしてしまい申し訳ない気持ちもありますが、マネジメントするほどの開発経験が足りてないと判断しソースコードと対峙する時間を持つという別の目的を持っていて、その通りに過ごせた結果別の面で成長することもできたので、結果的にはいい判断だったと思っています。来年はマネジメントに再度挑戦します。一度挫折したことで何が大切なのかを意識することもできたので、次は逃げ出さないようにしたいです。

生活

体調を崩す日々も多く、通院の機会が増えました。通院すると体に気を遣えるようになるので、いい傾向だとは思います。これからも健康に気を遣って生きていきたいです。

まとめ

2024年は技術的な成長と人間的な成長という2つの柱で走っていこうと思います。

仕事以外のところで技術的な学びが少なすぎるので、幅を広げるために読書を習慣化します。競技プログラミングは・・・AHCにもっと参加したいなあ。

2024年もよろしくお願いします。

2022年の振り返り

まずは去年の目標を振り返ります。お酒飲んでるので変なこと書いてあっても許してください。

2022年の目標は、以下の記事にある通り coonevo.hatenablog.com

コンピュータサイエンス全般、競技プログラミング、英語、読書

とありました。

コンピュータサイエンス全般については、勉強する時間を取れなかったので、来年は意識します。積読すごいので...

競技プログラミングは、

というように、レートは上がっていたみたいです。

英語は、オンライン英会話の退会に成功(?)しました...。仕事で話す機会も増えてきた、これからも増える、ようなので、再開しようかな...。オンライン英会話をしていた効果は多少あって、臆せず話せるようにはなってる感覚はありますが、語彙力不足を雰囲気でカバーする、リスニングもダメダメ、みたいな感じだったので、先行きが不安です。

読書は、積読が増えるばかりでしたが、仕事術というか、仕事論みたいな部分ですごく感銘を受けた本が二冊、印象に残っています。

どちらの本も、私の所属する組織で自然と、当たり前のように行われていることが、なぜ行われるようになったのか、どういう意味があるのか、ということを明確に言語化されており、読んだことで仕事がしやすくなりました。おすすめです。


2022年は、社会人2年目であり、結婚したりと、変化に富んだ一年でした。

会社員としては、ありがたいことに、大きな仕事の小さくない部分を任せていただき、この業界で生きていく上で礎となるであろうことを学びました。失敗もありましたし、成功もありました。考えすぎてしまったこともありましたが、深く考え続けてよかったこともありました。何より、ユーザーの喜びが何にも変えがたいほど嬉しかったです。感謝の声が人づてに届いたときの気持ちは一生忘れない気がします。これからも、私の持っている技術で、誰かを喜ばせられるような仕事を探していきたいものです。

生活面としては、結婚しましたが、元から同棲していたので、ほぼ生活に変化はないです。郊外の広めの部屋に住んでいますが、自炊もしやすいですし、物価も安いですし、必要なときに人混みにいく程度が自分にはあってるような気もします。移動にかかる時間は無視できないくらい大きいので、たまにうーんとなりますが、大きめの洗濯機と冷蔵庫で家事の負担軽減をしてなんとか耐えています。いつまで耐えられるかな、という感じなので、そのうち引っ越すとは思います。東京の家賃高すぎるよ...


これは番外編になりますが、たまにキャリアに悩んでTwitterに真面目なことを書くと反応してくれる優しいフォロワーさんに、この場を借りて深く感謝申し上げます。仕事ばかりしてると気づかない新しい視点に立つことができています。いつもありがとうございます...

2023年の目標については年明け時間があるときにまた考えます。皆様よいお年を。

AHC011に参加しました

173位でした。

gitのコミットを見て時系列で振り返っていきます。

5/28(1日目)

問題文を読む。グリッドで操作も簡単な好みな問題だと感じ、力を入れて参加することを決意。

コミットを読むに、タイルクラスを追加したり、ジャッジを実装してた。 深夜まで実装してます、この人。

5/29(2日目)

ツイートにも履歴がないため何もしてないですね。昼まで寝てた気がします。移動が多かったかな?

5/30(3日目)

だそうです。

5/31(4日目)

かわいそう。でも腰が痛いのに取り組んでますね、えらい。

この日の夜は、最終状態を何かしらの方法で探したいと思っていました。 dfsで探そうとしたんですが、何を思ったのか、一本道を構成するdfsを書いていました。疲れていたんでしょうね。「dfs ダメ」と残したままmasterブランチを捨てています。

6/1(5日目)

通勤電車の中で考察してました。

前日に謎のDFSを書いていた私ですが、朝になって冷静になり、みんなのseed=0の共有画像を見比べながら、多様だしランダムにやっても意外と枝刈りのおかげで木ができるんじゃないか?と妄想してました。

夜になったので実装しようとします

6/2(6日目)

寝落ちしたそうです。大変そうですね。

仕事の後は空を眺めてました。

この日も疲れて何もできてなさそうです。

6/3(7日目)

この日も仕事です。

6/4(8日目)

土曜日なのでお休みです。お昼ごろから取り組みます。

ねてたそうです

頑張ってください

残り2日しかないので頑張って実装します。

木の構築

まずは2点swapの山登りで木を構築しました。 それなりに強めの枝刈りを入れると100 msくらいで見つかったりもするみたいです。運が悪いと1.5 secでも見つからなかったりしますが、諦めました。

行ごとに揃える

右の2列と下の2行以外を揃えるコードを書きました。動かしていいところがこれだけあると直感的な操作でマスを自在に動かせることを確認しました。

残ったところは山登りして、この時点で1.9M。結構いい。

6/5(9日目)

よく考えると最右端を残して揃えられるんじゃ?と思い実装したらできました。

列ごとに揃えていくと、最後2行は残ってしまうので、やっぱり手軽なランダム山登り。2.3Mに伸びました。

この後はREが起きたときにファイルに出力するようにしてデバッグを早くしてました。本当は最後の2行も解くための方法は思いついていたんですが、実装が重すぎて間に合わず。

皆さんの解法を見て、ビームサーチやchokudaiサーチも試してみたい気持ちになってます。

これが最終解答の動画です。

最後に

前回のマラソンの解説放送のときにwataさんが天才発想を披露していて、そんなの問題固有の話じゃ・・・とか思っていた私ですが、そのときの話を応用して今回楽しめたので、意外とこういうアドホックな部分が大事なんだろうなー思ったりしました。アドホックアドホックとして終わらせないというか・・・

いかがでしたか?マラソンは楽しいので、みんなもやろう!

codingame:Spring Challenge 2022 ローカル対戦のための環境構築

Codingame、通称コドゲは、開発したゲームAIの強さを競うコンペを主催している会社のサイトです。先日Spring Challenge 2022が始まったばかりですね。

本記事では、Spring Challenge 2022でローカルで対戦する環境を構築するための方法について紹介します。 今回は最低限ローカルで動くところを目的としているため、便利なスクリプトを使った実行などについては触れません。最後に参考記事を載せておいたのでそちらを参考にしていただけたらと思います。また筆者の環境であるmacOS以外についても触れません。ご了承ください。

必要なもの

  • Java8
$ ls /Library/Java/JavaVirtualMachines/
jdk1.8.0_331.jdk

jdk-12.0.1.jdkなどでは動作確認してません。どれがいいのかわからないけど、とりあえず進めます。 Javaのinstall方法については他記事に任せてしまいますが、私はOracleの公式からダウンロードしました。

mavenって何?

Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information.

なるほど。インストールします。

$  brew install mvn

バージョンは、、

$ mvn --version
Apache Maven 3.8.5 (3599d3414f046de2324203b78ddcf9b5e4388aa0)
Maven home: /usr/local/Cellar/maven/3.8.5/libexec
Java version: 18, vendor: Homebrew, runtime: /usr/local/Cellar/openjdk/18/libexec/openjdk.jdk/Contents/Home
Default locale: en_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.15.7", arch: "x86_64", family: "mac"

最新です。これもどれがいいのかよくわからないけど動くのでよし!

学生さんは有料版(IntelliJ IDEA Ultimate) が無料で使えますが、 無料版(Community Edition)でも今回は特に問題ないです。

  • git

githubから公式が提供してる環境をダウンロードするのにあると便利です。

実行手順

  1. ローカルにプロジェクトをダウンロードする
  2. IntelliJでプロジェクトを読み込む
  3. 実行する

1. ローカルにプロジェクトをダウンロードする

こちらのrepositoryにあります。

github.com

任意の場所にcloneします。

$ git clone https://github.com/CodinGame/SpringChallenge2022.git
Cloning into 'SpringChallenge2022'...
remote: Enumerating objects: 124, done.
remote: Counting objects: 100% (124/124), done.
remote: Compressing objects: 100% (95/95), done.
remote: Total 124 (delta 20), reused 120 (delta 17), pack-reused 0
Receiving objects: 100% (124/124), 2.12 MiB | 6.79 MiB/s, done.
Resolving deltas: 100% (20/20), done.
$ ls
SpringChallenge2022

2. IntelliJでプロジェクトを読み込む

IntelliJを起動して右上のOpenからの先程のSpringChallenge2022フォルダを選択して開きます。

こんな画面になればOKです。

2.5 描画moduleにも手を加える

このまま3. に進むと実行はできるけど真っ暗となってしまいます。SpringChallenge2022では描画のリソースにも手を加える必要があるみたいです。npmを使います。

参考: github.com

$ npm --version
6.14.4
$ cd SpringChallenge2022/src/main/resources/view/ && npm ci && npm run start

[8:46:25 PM] File change detected. Starting incremental compilation...

[8:46:25 PM] Found 0 errors. Watching for file changes.

これでOKです。

3. IntelliJで実行する

実行のエントリポイントとなるファイルsrc/test/java/Main.javaを開きます。 compileJavaという関数を呼んでますが、ここのbashスクリプトの実行でこけると悲しいので、Player twoと同じくpythonのスターターに置き換えちゃいましょう。

これでpython vs pythonになりました。

public class Main {の行の左にある実行ボタン押してRun Main.main()を選択すると色々走って(依存関係の解決とかbuildとか?)実行されます。※

実行されました。http://localhost:8888/test.htmlにブラウザからアクセスしてみましょう!

うおー。

最後に

いかがでしたか?ローカル実行環境でAIを育てて、ライバルに差をつけよう! 筆者はまだルールすら把握してません。対戦よろしくお願いします。

以下、過去の記事で参考にさせていただいたものです。わからないことなどあればこちらも参照ください。

koyumeishi.hatenablog.com

w.atwiki.jp


※ 環境によっては以下のようなエラーが出ます。Javaのバージョンが新しいもので実行されてしまってるということなので、設定を変えます。左下の設定ボタンからJava8で実行されるように変更し、Applyボタンを押してOKで閉じて実行しなおしてください。

わからないことから一旦離れる勇気

わからないこと、知らないこと、できないことというのは、この世に無限にある。 知っていることの方が少ない。人間誰しもそういうものだ。

わからないことは恥ずかしいことではない。わかっていないことを、わかってふりをしていることが恥ずかしいのだ。

わからないことがあっても、前に進め。 わからないことを明確にする必要はない。ただ、わからないことを明確にしないなら、せめて、わかっていることを確実に知ろうとすることだ。

わからないことは、つまり、わかっていることではないことだ。 どこまでわかっているのかが明確になれば、わからないことをつぶす手がかりになる。

わからないこともわからないなら、とりあえず、進め。無視しろ。まだ早いのかもしれない。 いつか気づくから、その時まで待てばいい。

新卒で入社した私の場合、わからないことが多すぎた。でも、わからないからと、手を止める暇はなかった。

ある程度の理解で、とりあえず進んでみると、何かが見えてくる。 見えてきたタイミングで、理解を始めればいい。 その時でも遅くない。わからない人が、わかろうとしているなら、他人は待ってくれる。

一番やってはいけないのは、わからないことを、情報をとりにいけるのに、無視することだ。

2022年の目標

2021年は修論を泣きながら書いてなんとか院卒の称号(価値があるのか不明)を手にし、新卒入社後はソフトウェアの開発をしていたらあっという間に終わっていました。

2022年は、業務の全体像がうっすら見えてきている今だからこそできることに注力していこうと思います。あくまで業務をベースにして、個人的なキャリアを積み上げるために必要な自己研鑽はadditionalなものとします。

自己研鑽は、以下のようにします。

コンピュータサイエンス全般

入社後やろうと思っていましたが、ドメイン知識の習得で手一杯だったので、今年から取り組むべき内容もわかってきたので取り組みます。 基本情報、応用情報を取得し、AWSの資格を目指して勉強します。

競技プログラミング

昨年はコンテスト以外で問題を解かなくなってしまったのもあり、レートが下がりました。上げるモチベーションがあまり湧いてこないので、楽しみながら続けていこうと思います。マラソンは好きなので、積極的に参加します。

英語

入社後いつか求められるだろうと、昨年初頭にオンライン英会話に取り組んでいましたが、業務が忙しくなり、日本語で勤務できることがわかってからやめてしまいました。一度だけ社内でプレゼンを英語で行ったときには効果を感じましたし、レジュメにかけるレベルのTOEICの点数があると嬉しいので、取り組む予定です。

読書

日本語がもっと読み書きできるようにならないといけないので、読みます。

もう少し達成可能な目標設定を1/3までにするので、編集予定です。

大学が私に与えた影響

大学は、私の人生にどのような影響を及ぼしたのか、卒業してからよく考えている。世間では就業機会や生涯年収といった実利的な側面についての言及が多いが、それらはあくまで社会構造に起因するものであり、今回私が考えたいのは、人格や考え方に対する、より個人的で抽象的な側面である。

大学にいくと何が変わるのかを考えるには、変わる前、すなわち大学入学前から振り返る必要がある。自分語りが多く含まれる可能性が高いが、個人のブログなので、ある程度はお許し願いたい。自分語りが好きな方に読み進めていただけたらと思う。

小中高

埼玉県に生まれ、公立の小中学校と私立の高校に通っていた私は、とにかく丸暗記が得意で、中学に上がってからは常に学年で成績トップだった。テストの数週間前から教科書とノートを丸覚えし、得点率は90%を越えていた。教科書の本文の穴埋め問題なども、一言一句すべて覚えているため、考える必要もなかった。

学校の「勉強」が得意だった私には、その時は小さかったものの、確かにコンプレックスがあった。文章が読めなかったのだ。文字を追うのが億劫で、すぐに眠たくなってしまい、最後まで読めた本は数えるほどしかなかった。中学校には「勉強」はそこそこだが、文章を読める・書ける同級生がいた。彼は休み時間にはいつも本を読んでいて、数学より国語が得意だった。私の最も苦手で、親に代筆してもらっていた夏休みの読書感想文で、彼はいつも表彰されていた。私は彼に対するコンプレックスに気づかないように、内心彼を馬鹿にしていた。あんなに本が好きなのに、本が読めない自分より国語の成績が低かったのだ。本なんて読まなくても、「勉強」はできる。そう思い込んで、本が読めない自分を正当化していた。本が読めないことが、いつか大きな足枷になると薄々気づいていたがゆえの歪みだった。

高校に上がってからも、持ち前の丸暗記力で学年トップの座を守っていた。丸暗記がさらに得意になっていたのか、テスト前の勉強をサボっても成績はそこまで下がらなかった。丸暗記に最適化された知識格納方法を無意識のうちに習得していたのかもしれない。

経験した人には共感してもらえると思うが、大学受験では、中学・高校受験のときと比べ、頭の良さがそのまま成績に直結するわけではなくなる。つまり、地頭不足を努力で補えるようになる。教科数も範囲も膨大になるからだ。例えば数学では天才的発想よりは、典型的手法をパズルのように組み合わせる能力が求められる。このパズルゲームは、引き出しを大量に正確に格納できる私向けだった。

いくら丸暗記とはいえ、続けていると、いやでも暗記した内容の中に含まれる論理構造も習得していくようで、「文章は読めないのに現代文の読解は得意」という異常な人間が誕生していた。大学にはギリギリ合格した。

大学/院

皆さんの予想通り、小中高の勉強をすべて丸暗記で突破した私と、大学での学問の相性は最悪である。入学した東京大学には、私のように「勉強」それ自体に四苦八苦した人間もいるが、「勉強」は片手間で学問や課外活動に注力していた人間も無視できないほど存在していた。後者の人間の多くはもちろん読書好きで、私が一生かかっても読めないような分厚い本を数日で読破し楽しんでいた。

大学での学問は、文章をなんなく読めることが大前提である。与えられた問題を正確に解けるのは当たり前、様々な文章を読んだ上で、自分で問題を作るのだ。私には太刀打ちできないと知るまでにそうかからなかった。

挫折した私は、微かな希望を持っていた学問への道を完全に諦め、単位を取るだけの勉強にシフトした(今思えば学問分野は多いため、他人との比較は諦める理由にならないのだが)。

学問を理解していない人間の進路決定理由は悲惨で、生き物が好き、という理由だけで理学部生物学科に進んだ。配属後すぐ、生き物は好きだが、生き物の謎を科学的に解明することにはほとんど興味がないことに気づいた。生体からとった目に見えない分子を手順通り薬品にかけ、データを取り、再現性を担保し、口頭発表や論文として公開する作業は、生き物が好きだけでは耐えられない。特に細かい作業が苦手で、失敗の原因が自分の手の悪さなのか、作業のミスなのか不明な実験のストレスは想像を絶するものだった。結局、実験で一度も成功体験を得られないまま配属希望研究室を決める時期になった。

学部の実習でRというプログラミング言語を使ったのが楽しかったので、その実習を主催していた研究室に入った。卒業研究は実験をせずRでお茶を濁していた。

こんなに研究が嫌いなのに、大学院の研究室選択では迷っていた。学部と同じ多少興味のある基礎研究か、就職に強そうな医学系の研究室という二択だった。この頃、指導教員との面談で、過去のコンプレックスを強く意識させられることになった。

私「興味のある分野がわからないです」

指「子供の頃、本棚にどんなジャンルの本があった?そこに原体験があるかもしれないよ」

私は子供の頃の本棚を思い浮かべたが、ジャンルと呼ばれるようなものは思い当たらなかった。読まなかったのだから当然である。この質問にうまく答えられなかったことで、本を読めなかったがために意思決定の機会をも失っていたと気づいた。

読んできた本から小さい頃の興味を類推できないなら、経験から考えるしかなかった。学部3年のRの実習でプログラミングが性に合っていると思ったのは、生物のリアルの実験と違い、簡単なプログラムならバグってもすぐに治せるからだった。大学受験の頃は物理でモノが動くのを想像するのが好きだったし、パソコンでそれを模倣できるならきっと楽しいのではという思いもあり、B4の夏に生物学を半ば捨ててプログラムを書く方に舵を切った。安易に選んだ進学先で実験のストレスに晒されたおかげで、本当に触りたいことを知ることができた。学部1-3年の頃はプログラミングを毛嫌いしていたのだから、人生何が起こるかわからないものである。

進路は、東京に近い方がいろんな情報を得られるだろうというのもあり、学部と同じ研究室を選択した。プログラミングは独学すればいいし、就職はなんとかなるという楽観的な選択だった。

この頃、たまたま競技プログラミングを勧められ、そのゲーム性に魅了されハマってしまった。競技プログラミングで扱うアルゴリズムの有用性は、すぐに理解できた。生物学でゲノムのマッピングツールで応用されていることを知っていたからである。アルゴリズムを扱うゲームに自分の人生をベットしても悪い方向にはいかないと信じられたのは、あのときの安易な進路選択のおかげだった。

大学院では、論文指導を受けたことであんなに書けなかった文章がすらすら書けるようになった(まだまだ拙いところもあるが、これでも成長している)。自分で構成を考えて書いてみると、書いている人の気持ちに寄り添えるようになり、本を手に取る機会も増えた。

まとめ

大学に入って変わったことは、具体的には優秀な友人やプログラミング能力だが、もっと抽象的で大事なことがある。それは、あらゆる活動は普段目に見えないだけで、全て生身の人間が行っているという実感が得られたことである。書店に並んでいる本も、書いているのは私と同じ人間で、それぞれの人生がある。そう考えると、無味乾燥としているように見えた本も、その先に想像力を働かせれば、メッセージを読み取りたいという気持ちになる。

大学について何も知らず、興味のある分野・業界もなかった私に、6年間で様々な試行錯誤をさせてくれたというだけで、大学にはとても感謝している。今後は、私のように、刺激があれば動ける人に、気付くための機会を少しでも増やすことを大きな目標として精進していきたい。

ポエムで、すみませんでした。