Tsuna lab

国の端っこで動物の研究しながら競技プログラミングなるものをしてみます

AtCoder Beginner Contest 203(Sponsored by Panasonic)の感想

AtCoder Beginner Contest 203(Sponsored by Panasonic)に参加してきました!結果はABCの3完(perf:937)でレートが44上がりました。以下簡単にコメントしていきます。

 

A - Chinchirorin

atcoder.jp

3つのサイコロを投げて、出目が全て揃ったらその値、出目が2つ被ったら残りの一つの出目、出目が揃わなかったら0を出力せよという問題。

前回に引き続きサイコロ問題。if文を使って出目が2つ被ったら残りの一つの出目を出力し、それ以外は0を出力するようにしました。こうすれば3つの出目が同じ場合もカバーできるのでコード長が短くて済んで衛生的です。

ここまでで1分38秒。なかなかいいペースで解けたと思います。 

B - AtCoder Condominium

atcoder.jp

N階建てのマンションの各階にK部屋ある。i階のj部屋目の部屋番号をi0jとするとき、すべての部屋番号の総和を求めよという問題。

つまるところiとjは別々に考えてよいので、3桁目と1桁目で別々に計算して最後に和を取ることを考えました。注意すべきは1-indexにすることと、iの成分は3桁目なので100倍してから加えることぐらいですかね。

ここで5分18秒。悪くないペースだと思います。

C - Friends and Travel costs

atcoder.jp

所持金K円で村番号0の村からスタートして、なるべく番号が大きい村へ移動することを考えます。i村からi+1村へは1円のコストで移動することができ、訪れた村に友達がいる場合はB円もらうことができます。最終的にたどり着ける村を出力せよという問題。

問題文を見た瞬間この問題を思い出しました。

ABC185 B - Smartphone Addiction

atcoder.jp

今回の位置AでB円もらえるという条件は、この問題は時刻Tでバッテリーが(B-A)回復するのと同じように見ることができます。この問題ではすべての時刻でバッテリーをチェックするのではなく、バッテリーの充電タイミングでバッテリーが切れるかどうかのチェックをしていました。

そこで今回もお金を貰えるタイミングにその村にたどり着けるかのチェックを行い、

  • すべての友人からお金をもらう
  • 途中で所持金が0になる

タイミングで最終的な到達点を計算して出力しました。

ここまでで19分55秒。少し早いだけでパフォがかなり伸びたようなのでちょっと悔しいです。ただ類題にすぐに気づけたのは精進の成果がでたということなのでよかったと思います。

D - Pond

atcoder.jp

各マスに高さが与えられたN×Nマスのグリッド内に自由にK×Kの区画を取るとき、この区画内の最小の中央値を出力せよという問題。

中央値の扱い方が難しいなぁと思い初手でGoogle検索。「AtCoder 中央値」でggrと決め打ち二部探索法が出てきました。

決め打ち二部探索法は、競プロ典型90問やZONeコンに出題されていたのでかなり記憶に新しいですね。

 

atcoder.jp

 そこで「中央値がX以下になることがあるか」という判定条件で二分探索を行うことを考えました。この判定は各マスの値がXより大きいか否かで-1,1に変換して区画内の和を取れば出来そうです。ここで区画の和は二次元imos法か二次元累積和を使えば高速化できるとTwitterで見たことがあったので、今回は二次元累積和を採用することにしました。

 つまり流れとしては、

  1. 解をxと仮定して、各マスの高さとxを比較して-1と1に変換
  2. K×Kの区画内の和を二次元累積和を取り、中央値がX以下になるものが存在するかをチェックする。
  3. これを二分探索で知らべて条件を満たす境界の右側の値を出力

を実装しようと思っていました。

結局、二次元累積和の実装で失敗してしまい解けませんでした。

まとめ

最近精進はあまりできていませんでしたが、コンテストの復習と典型90を毎日考えることをしていたおかげか、問題文を見たときにあれ使えそうかな?みたいな発想が出やすくなった気がします。今回もD問題は解けませんでしたが解法は大きく外していなかったのでもう一息だと思います!(そう思いたいです)

 

エイシングプログラミングコンテスト2021(AtCoder Beginner Contest 202)の感想

エイシンプログラミングコンテスト2021に参加してきました!結果はA,B,Cの3完でしたが、低難易度の問題に時間をかけてしまいパフォーマンスは449。再び借金生活に逆戻りです;;以下簡単にコメントしていきます。

f:id:naturence:20210522230947p:plain

A - Three Dice

atcoder.jp

3つのサイコロを投げたとき、サイコロの裏面の数の総和を求めよという問題。

サイコロには対面の数の和が常に7になる性質があるので、サイコロの目をa,b,cとすると、(7-a)+(7-b)+(7-b)を計算して終了。

特に詰まることはなく1分ちょいで提出。いい感じ。

B - 180°

atcoder.jp

与えられる文字列を180度反転させよという問題。

入力される数字を後ろから順に選んできて、操作に書いてある通りの変換をif文で行って終了。

基本的な文法が分かっているかのチェック問題に5分かけるのはちょっとダメかも。

C - Made Up

atcoder.jp

長さNの数列A,B,Cが与えられたとき、Ai=BCjを満たす( i , j )の組を求めよという問題。

まずiとjを全探索する方針が簡単そうだけど制約が10^5なので間に合わなそう(O(N^2)となるため)。これは工夫して全探索のパターンだと思い典型90問を思い出してみると、変数が複数存在するように見えても実は1つの変数に注目するだけで解けるケースがあったなーと気づいた。そこで今回はiに対して全探索を行う方針を取ることにした。

今回は条件が複雑そうな数列Bに注目してみた。iが定まると

  • B[i]の数
  • 数列Cのうち、i (index)を指定する項数(=C[j]の項数)
  • 数列Aのうち、B[i]を指定する項数(=A[i]の項数)

の3つを得ることができる。下2つはそれぞれA.count(B[i]) C.count( i )で求められるのでこの積をとってAC!!

f:id:naturence:20210522235634p:plain

 ???????????????????????????????????????????????????????????????????????????????

O(N)なのでTLEにはならないと思ってたんだけどこの方針間違ってた???なんて思って迷走していたら、

f:id:naturence:20210523000344p:plain

 for文の内側でのカウントが原因でした。for文の外側で collectionsのCounterを用いて前もって計算を済ませて置き、for文の中では掛け算するだけに変更したら無事AC。

ここまで46分。PythonとPyPyでそれぞれ誤答を投げてしまったので計2ペナで合計56分です・・・。

D - aab aba baa

atcoder.jp

A個のaとB個のbを並び替えてできる文字列のうち、辞書順でK番目のものを求めよという問題。

制約が小さければ中高の入試で出題されてもおかしくない重複順列の典型問題。基本方針は文字列を左から決めていき、一番左の文字がaの時に後ろに来る文字列のパターン数がKより大きければaで確定される。そうでなければbが一番左の文字となる。これを文末まで繰り返していけば解けそう。

問題に取り組んで5分ほどでこの方針に行きついてサンプル1は合わせられたものの、サンプル2が全く合わせられずにコンテスト終了。

公式解説はDPによる実装でしたが、ユーザー解説は同じ方針を取っていたのであとは実装力ですね。

blog.hamayanhamayan.com

まとめ

前回のようなD問題で手も足もでないような状況ではなかったので、あまり感触は悪くありませんでした!(パフォはあまり出ていませんが💦)それにしても今回のC問題はあまりに多くの人が解いててびっくりしましたね。Bまではそこそこのペースで解けていたせいもあり、やっとのことでCをACしたもののほとんど順位が上がらなくてちょっと悲しかったです・・・。

マイナビプログラミングコンテスト2021(AtCoder Beginner Contest 201)の感想

マイナビプログラミングコンテスト2021に参加してきました。B問題でWAが出た瞬間、プログラミング自体が2週間ぶりだったことを言い訳にしようとかアホなことを考えていましたが気合で3完。以下簡単にコメントしていきます。

A - Tiny Arithmetic Sequence

atcoder.jp

長さ3の数列を等差数列にできますかという問題。等差数列は後ろの項の方が大きいので、まず小さい順にソート。そして1項目と3項目の和が2項目の2倍に等しいかで等差数列かどうかの判定をしました。

 

最初は問題文の「数列を並びかえて」の部分を読み飛ばしており、ソートを忘れて少し時間をロスしてしまいました。急がば~って感じです。

 

B - Do you know the second highest mountain?

atcoder.jp

二次元配列のうち、2つ目の要素が二番目に大きい要素を出力せよという問題。2次元配列を2つ目の要素で小さい順にソート(pythonではkeyとlambda式)して後ろから2番目の要素を出力しました。

 

コンテスト開始5分で提出したところまさかのWA。原因が全く分からなかったので一旦C問題を先に取り掛かりました。どうやら数字を文字列として受け取ってソートしたことが原因だったみたいです。

 

C - Secret Number

atcoder.jp

4桁の暗証番号を作成する。0-9までの数字がそれぞれ「絶対に使う数字」「使わない数字」「使ってもよい数字」に分類されているとき、4桁の暗証番号のパターン数を求めよという問題。

最初は「絶対に使う数字」を先に配置し、その後に「使ってもよい数字」を残った場所に並び替える方法を考えました。しかし、どうやっても1個目のサンプルが合わず数学で求めるのを諦めました。

今回の問題のポイントは「暗証番号が4桁」というところで、全パターンを試しても10^4通りしかないんですよね。そこで全パターンを試して、

  1. 「絶対に使う数字」の集合が「暗証番号に使った数字」の集合に包含されるか
  2. 上の2つの差集合が「使ってもよい数字」の集合に含まれるか

の2つの条件を満したパターンを数えました。Pythonのsetを使うと集合の管理が楽でした。

D - Game in Momotetsu World

atcoder.jp

+マスと-マスが設置してある2次元平面上のコマを2人で交互に最善手で操作するとき、どっちが勝つか求めよという問題。ただし、コマは左上からスタートし、右or下にしか移動できない。

最善手をどうやって求めるのかがわからず終了。こういった問題にも対応できるようになりたい。

まとめ 

 今回はCの全探索に気づくのに時間がかかってしまいパフォーマンスがあまり伸びませんでしたが、気づいてからはノーペナで実装できたのはよかったと思います。もう少し自分の使える手法を増やしていくともっと対応できる範囲が増えそうだなーと感じたABCでした。

【随時更新】AtCoderで過去に詰まった発想・知識集

コンテストや精進中に使えそうな知見を得る度に追加していきます。正確性は保証しません。

文字列操作

・反転操作→反転している状態かどうかだけを記録し、実際には反転を行わない

・文頭, 文末に対する追加削除操作→listではなくdequeを用いると早い

・辞書順でK番目のものを求める→左の文字から決めていく

グリッド

・はみ出るか否かの処理→S[max(0,i-1) : min(W,i+2)]で if 文の省略

 

数列

・A-BがKの倍数→AをKで割ったあまりとBをKで割った余りが同じ

区間の和→累積和orいもす法

グラフ

・AからBにいけるか(無向グラフ)→UnionFindが使える

・2回の移動で~→真ん中の街を基準に考える

〇〇探索

・操作が難しいけど制約が小さい→全探索

・3変数の全探索だと間に合わない→式変形して2変数の全探索(整数条件に持ち込む)

・調べたいデータに単調性(昇順or降順)がある→二分探索

・二分探索したいデータがリストで与えられている→bisectの利用

・最大値の最小化→決め打ち二分探索

全般

・AからBを作れるか判定せよ→Bから逆の操作をしてAに出来るか考えてみる。

・2択(ある・なし)で管理がしたいとき→bitで管理

・bit管理下で複数の要素が条件を満たしているか調べたい→AND/ORの利用

・問題を解くのに不必要な情報の簡略化→bitでの管理/座標圧縮

・for文のループが遅い→前計算の検討

 

ZONeエナジー プログラミングコンテスト “HELLO SPACE” の感想

ZONeエナジー プログラミングコンテスト “HELLO SPACE”に参加してきました;;このコンテストは新発売の"ZONe mad_hacker Ver.1.0.0"の広報も兼ねているということで、ちゃんと近所のセイコーマートで購入して参加しました。結果はA,B問題の2完で少しレートが上がりましたが、残念ながら前回失った分の借金は返せませんでした;;

f:id:naturence:20210501233819p:plain

A - UFO襲来

ストーリー:UFOのせいでコンテスト中止→ZONeを買いに行く

atcoder.jp

与えられる文字列の中に"ZONe"という文字列が何個含まれるか出力せよという問題。pythonではcountという関数で特定の文字列が何個含まれるか調べることができるので秒殺。(1分38秒) やっぱりpythonしかかたん。

B - 友好の印

 ストーリー:UFOの操縦プログラムをKARATEで破壊する

atcoder.jp

 自分とUFOの間に障害物が何もなくなるように自分の高度を変えるとき、その高さの最小値を出力せよという問題。自分のいる位置は一番高い障害物とUFOの位置によって定まるため、すべての障害物とUFOを結ぶ線分のうち一番大きいy切片を出力。二点を通る直線の傾きを(xの増加量)/(yの増加量)と書いていることに気づかず時間を溶かしてしまいました。ここまでで12分5秒。もうすこし縮められたはず・・・!

C - MAD TEAM

ストーリー:MADな仲間が欲しい→AtCoder上の競プロer

atcoder.jp

5つのパラメータが与えられたN人から3人選んでチームを作る。チームの能力は各パラメータの最大値で定義され、チームの能力のうち最小のパラメータが最大値を出力せよという問題。最小値の最大化は決め打ち二分探索だと競プロ典型 90 問の1問目でやったので実装しようとするも、二分探索のcheck関数で各能力をどう評価するかのところで詰まってしまい、D問題へ移動しました。二分探索だと気づけただけでも成長できてると思います!

D - 宇宙人からのメッセージ

ストーリー:メンバーがそろった(揃えられませんでした)→暗号解読しよう

atcoder.jp

今回の戦犯

与えられる文字列に従って操作を行い、得られる文字列を出力せよという問題。今回の操作は、文字が"R"だった場合は文字列の反転、そうでない場合はそのまま追加。ただし、生成した文字列に連続する文字があればそこを削除する。

 文字列の反転する操作がある場合は、実際に反転はせずに反転しているかの記録だけ行うと早く計算できるやつだと気づきとりあえず実装。(先週のABCでもでてた)連続する2文字を消す操作は問題文通り文字列の生成を行った後に行いました。300点問題ならこれで通るだろうと思って投げるもTLE。

文字列での操作が遅いのかと思いリストに変更してもう一回投げる。これもTLE。これはどこかのパートが根本的におかしいと思ったので、文字列の生成のパートを見直し始める。ここで、与えられる文字列を"R"で分割して配列に入れ、その配列のサイズの偶奇によって文字の削除前の配列が簡単に生成できることに気づく。この生成した文字列を元にさっきと同じ削除の操作を行って投げてみる。ちょっとだけ早くなるも結局TLE。

TLEの原因が削除操作だと気づき文字列の生成する操作と同時に削除する操作も行うことを考えるも、時間がたりずにコンテスト終了。ちなみにこの回答もTLEでした。

正解するためには

  • 文字が連続するときは文字を追加する代わりに削除(これは気づいた)
  • 反転操作は実際に行わずに追加位置を変更する(これも気づいた)
  • dequeで生成する文字列を管理することで文頭文末の操作を高速化(全く気づけなかった)

の3つが必要だったみたいです。dequeは何度か見かけたことはあったのですが、いまいちその恩恵が分からず使う発想に至りませんでした…。これで次回から使える武器が増えたので儲けものです!

まとめ

ウッキウキでZONeの新商品まで買いに行ったのに2問しか解けなくて若干恥ずかしいですね。今回は数学的な考察が出来なかったわけではなく、単純な知識不足だったので精進していけば全然克服できると思うのであまり負の感情は湧いていません。知識を定着するためにもコンテストで得られた知見もブログにまとめていこうかなぁと思っています。

 

おまけ

コンテスト中、隙あらばエナジードリンクってカフェイン と一緒にアルギニンが入ってるけど、どんな作用機序で覚醒作用につながるんだろうと考えてたんですが、アルギニンによって産生されたNO(一酸化窒素)が1.脳の血管を拡張して血流改善2.神経伝達物質として働くことが原因と考えるのが今のところ妥当っぽいですね。(そんなんでいいのか)ちょっと調べたかぎりでは、カフェインと一緒に加える理由としてはカフェインがアルギニンの分解を抑制することでアルギニンがちゃんと働けるようにするためって感じでした。この論文、2009年のものだけど現在は作用機序がちゃんと解明されているんでしょうか?(そもそもそんな状態で製品化ってできるんですかね?)

アルギニンとカフェインを一緒に加えるとNOの量が増えるよという論文↓

pubmed.ncbi.nlm.nih.gov

アルギニンとカフェインを一緒に加えるとアルギニン分解酵素の活性が落ちるよという論文↓

pubmed.ncbi.nlm.nih.gov

AtCoderでしかプログラミングを知らない生物学徒がハッカソンに挑戦してみた話

4月24日-4月25日で開催された技育CAMP(ハッカソン)に参加してきたので振り返りをしようと思います。プログラミング初心者目線でハッカソンがどのようなものだったかお伝えできれば幸いです。

 

ことのはじまり

AtCoderの社長であるchokudaiさんがライブコーディングをするということで、技育祭に参加してみたのがきっかけです。オンライン開催だしどうせなら他の講演も聞きに行くか~ということで適当にいくつかのブースを聞いて廻っていました。中でも芸者東京株式会社CEOの田中さんがゲームに注ぐ熱い気持ちに強く心を動かされてしまい、話が終わるころにはすっかり自分でも何か作ってみたいと思うようになっていました。

note.com

ちょうど同時期にAtCoder Heuristic Contest 001でコードをコツコツ改善する喜びを知ってしまったこともあって、モノづくり欲が異常に高まっていたそんな時にサポーターズさん(技育祭の主催)からハッカソンの開催通知メールが来ました。こういうのってほんとよくできてますよね。秒で申込みしました。

開催二週間前

 ハッカソン用のslackワークスペースに招待されました。僕は野良参加だったので、同じ野良の民とチームを組むか、個人開発をするかの2つの選択肢がありました。野良でチームを組んだら他の参加者の足を引っ張る気しかしませんでしたが、野良の人がみんなチーム開発希望だったので僕もそうしました。(日本人の鑑)

さすがに周りのレベルが分からないのは怖かったので前回のハッカソンで使ったチャンネルを覗きにいったのですが、ここでかなりの衝撃を受けました。とにもかくにも成果物のクオリティが高い。えらいところに足を踏み入れてしまったなぁと若干後悔しつつさらにチャンネルを遡っているとこんな文面を見つけました。

自己紹介(呼び名、使える技術、etc)をしましょう!

うーーーーん。これはまずい。超まずい。ハッカソンに申し込んでおいておかしな話なのですが、まともに使える技術なんて一つもないんです。しいて挙げるならばB1の情報の授業の時にHTMLとCSSでWebページを作ったことがありますが、所詮2時間の授業とその課題だけだし、そもそも何年前の話だって感じなのであてにできません。チームの初顔合わせまでになんとかしなくては…。

「でもお前、競プロでPythonを使っているじゃん」と突っ込んでくれる人がいたら嬉しいのですが、僕はPythonの環境構築ですら2回挫折していまだにコードテストで書いてます。さらに、競プロ用途でしか使ったことがなかったため、クラスや継承というものすら知りませんでした。

 ~開催一週間前(勉強開始)

 まず最初に触れたことのあるHTMLとCSSの復習をしました。復習といってもタグの付け方みたいな文法事項を学んだところで即戦力にはならないと思ったので、実際にWebサイトを作るチュートリアルのうち、自分がおしゃれだと思ったものをやりました。結局やったのはこの本↓

www.shoeisha.co.jp

次点でなにかWeb系のプログラミング言語が使えるようにしたかったのでJavaScriptに手を出しました。これも同様に何か作ってみないと身につかないと思ったのでよさげなチュートリアルを見つけてオセロを作りました。単純な機能でもコーナーケース(?)が多くてめちゃめちゃ苦労しました。ゲーム作れる人みんなすごい。

(文法の基礎的な話ならそれこそAtCoderが使えるんじゃないかと思いましたが、Node.jsとかわけわからんことが書かれていたのでやめました。まぢでPythonしか勝たん💢)

f:id:naturence:20210427181602j:plain

作ったオセロ(白丸の作り方が分からなかった)

 最後に余った時間でPHPの基本的な文法とHTMLとどう絡めるかだけ勉強して一週間前になりました。朝から夜までは普通に大学で研究をしていたので正直かなりきつかったですが、成果が目に見えるのはなかなか楽しかったです。 

開催一週間前(チーム初顔合わせ)

Zoomで顔合わせをしました。チームメンバーは付け焼きの刃皆無スキル編の僕(M1)、情報系の数強†Pythonista†JD(M1)、学生兼デザイン会社のWeb系プログラマ(B3)の3人でした。3人ともハッカソンは初参加だったみたいです。初回は適当に雑談を挟みつつ、みんなの手持ちスキルを眺めてフロントとバックで何の技術を使うか?みたいな話をしました。

この時に話に上がったのは、

あたりだったと思います。僕はいまだに違いがわかりません。

チーム名はかわいい系にしたいと言ったらじゃがりこになりました。特に深い意味はないです。

 

環境構築すらままならないのにうっかりPythonは少し触ったことがあるなどと口走ってしまったため、僕はDjangoがどんな感じか調べる担当になりました。

 いろんなブログを彷徨った結果、結局公式テキストのおかげでPythonの環境構築を完成させて、いざDjangoを使おうというところで無限にエラーが発生。結局"Hello World"にすら至りませんでした。なんか僕の知ってるPythonと違うんだけど?

開催6日前(ミーティング2回目)

何を作るのか

しばらく真面目に考えたものの、なかなかいい案が思いつかなかったのでほとんど雑談タイムになってました。しかし、意外なことに雑談してる時の方がホイホイ案が出てくるもので最終的には、

  • オンライン版相席居酒屋

を作ろうという話に落ち着きました。

話の流れは、 コミュ力の話→飲み会の盛り上がりが必ずしもコミュ力に依存しない話→私大の体育会系の飲み会が地獄な件→オンライン飲み会ってあんまりコールないよね(画面越しだから煽りにくいとか?)→そういえばオンライン匿名の飲みサービスってないよね みたいな感じだったと思います

内容をつめる

各ユーザーはホストor参加者を選ぶことができ、ホスト側は好きに部屋名・テーマを設定することができる。参加者側は部屋一覧から好きな部屋を選んでその飲み会に参加することができる。ホストは人が集まったら募集を締め切って飲み会をする。(ビデオ通話)

必要な技術をつめる

ユーザー登録機能:Vue.js+Laravelによる実装

部屋を立てて募集:??????

ビデオ通話:Zoom APIの利用(PHPによる実装)

チーム開発用:Docker, Gitの利用(運営による勉強会に参加)

 

いろいろあって僕はLaravelとVue.jsの勉強をすることになりましたあれ?Pythonは?

~開催1日前

 ここでも何か作らないことには技術を身に着けるのは難しいと考え、LaravelとVue.jsでSNSをつくるチュートリアルを3周しました。(定着のために3周したわけではなく、エラーを解決しようと色々とファイルをいじっているうちに復元できなくなって最初からやり直しただけです(泣))

f:id:naturence:20210427232908p:plain

チュートリアルMac用に書かれていたため、Windowsと仕様が異なる部分でエラーにひたすら苦しめられました。さらに、Dockerで環境構築をしていたのですが、完全にブラックボックスな状態で使っていた上にコマンド操作自体も初めてだったので、とにかく進行が遅かったです。

本番1日目

以下、リアルタイムでつけてたメモ

9:00 -チーム集合

Gitでファイル管理しながら3人で開発を進める予定だったけど、僕以外のlaradockの環境構築がうまくいかず、Laravel-Vue.jsによる実装パートを一人で請け負うことになった…。責任重大すぎて手汗がやばい。これ僕の環境が壊れたらどうしようかな?

11:00-開会式

思ってたよりはハッカソン初参加の人が多いみたい。とりあえず完走して参加賞が欲しい!あと、せっかくバーチャル背景作ったのに自己紹介時にカメラオフをする流れに負けて結局使えなかった;;

 14:00-

ユーザー登録機能の実装が出来た!レスポンシブとか考えるのが面倒なのでBootstrapに任せたけど、細かいこと気にしないならこれで十分な気がする。

15:00-

ユーザーのログイン・アウトの機能の実装も終わった。ここまではチュートリアルとほぼ同じなのでさくっとできてよかった。

16:00-

飲み会の部屋を立てる=記事の投稿として、ZoomのURLを貼ればいいのでは?だとすればあとはZoomのリンクの自動生成と、そのリンクを記事に載せられれば作れそう…!

18:30-

エラー地獄になって15:00の状態まで戻した。とりあえず復帰できてよかった・・・

20:00-締め会

前回からの進捗0。この集まり忘れてる人多いな?

22:00-

 Zoomには飛べないけど部屋の作成画面ができた!最悪これにZoomのリンクを手動で貼れば使えるしエラーさえ起きなければ参加賞はもらえそう

26:00-

タグ検索を実装した!寝る!

本番2日目

 7:00-

メンバーが徹夜でZoomのAPIまわりの実装をやってくれたのでくっつけようとするも環境が違うせいか上手くいかない。localでやっていたものをDocker上で動かそうとしてるから?

11:00-

どうしようもないので技術メンターさんに頼る。ファイルが多すぎて全く管理できてないので状況説明もろくにできない。

13:00-

よくわからないけどZoomに飛ばせるようになったからヨシ!

15:00-コードフリーズ

多分ZoomのURLを新しく生成できていないみたい。時間が来てしまったのでスライドづくりに移る。

16:00-プレゼン開始

アンケートで進捗ヤバイと答えていたチームが過半数だったのに、みんなしっかり仕上げていてすごい。どのチームもAPIやらアルゴリズムやら機械学習を使ってて自分よりも一つステップが上って感じがする。

f:id:naturence:20210428012553p:plain

発表時のコメント

18:15-結果発表

最初に努力賞→最優秀賞という流れみたい。 明らかにまわりのクオリティが段違いだったので参加賞で納得だ~とか思ってたらなんと努力賞を頂きました!!?なぜ?
今回のハッカソンのテーマが「初めてのハッカソン」ということで、他のチームよりも乏しい初期のスキルセットからなんとか形にできた点を評価していただいたようです…!なんて教育的なんだ…!!

 18:30-懇談会

1部屋に6人ほど入って自由におしゃべりするスタイルでした。周りはほとんど情報系の学生さんだったので自分にとっては目新しい話ばかりでめちゃめちゃ面白かったです。結局二次会まで参加しました。

 

まとめ

反省点

技術的な反省点はここでは省きます。

  • チーム開発をするのであればお互いの環境を合わせることは必須であるのに、その確認を当日まで後回しにしてしまったこと。
  • 何を作るか、それを実現するためにはどのような技術が必要となるか、という点を曖昧なまま言語(フレームワーク)の学習に移ってしまったこと。
  • 互いの進捗管理をおろそかにしてしまったこと。
感想

完全に勢いで申し込んでしまい、本番が近づくにつれて完全に場違いだったらどうしようと不安に思いながらの参加でしたが、運営スタッフさんのサポートが手厚くかつ参加者も暖かいコメントをくれたため、とても安心して開発に取り組めました。僕は完全に基礎研究に興味がある人間なのでモノづくりとは縁がないだろうなあと思っていましたが、人生何があるかわからないものですね。自分は○○側の人間だと短絡的に決めることなく、もっと視野を広げて様々なものにチャレンジしていけばもっと面白い世界が見えそうだと思いました。最後に他の参加者の皆さん、運営の皆さん、本当にありがとうございました!! 

第二回日本最強プログラマー学生選手権の感想

第二回日本最強プログラマー学生選手権に参加しました!結果はA,B問題の2完で見事レートを下げました!勉強代と思えば-25なんて安いものです(泣)以下簡単にコメントしていきます。

A - Competition

初見:A問題だしちゃちゃっと片付けちゃおう

atcoder.jp

与えられるお肉の価格設定より少しだけ安い値段設定をしろという問題。与えられるお肉の価格設定を元に自分が価格設定するパックの価格を計算して、

  1. その値が小数だったら切り捨て
  2. 整数だったら「その値 - 1」

を出力しました。小数怖いなぁと思いつつ工夫せずに通ってくれました。A問題にしては若干考えることが多い問題でしたが、8分は少し手間取りすぎましたね。

B - Xor of Sequences

初見:Xor!?うっ、頭が・・・!

atcoder.jp

2つの数列が与えられるので、どちらか一方のみに含まれる数字(対称差集合というらしい)を出力する問題。集合の計算はpythonのsetを使えば簡単にできることを知っていたので秒殺できました。

C - Max GCD 2

初見:最大公約数の問題はここ↓でたくさんやったし今回も3完は堅いな!()

AtCoder 版!マスター・オブ・整数 (最大公約数編) - Qiita

atcoder.jp

A以上B以下の数字から選んだ2つの数字の最大公約数のうち最大なものを求める問題。まず初めに考えたのは考えたのはBから1に向かって答えを決め打ちして、その数で割り切れる数が2つ以上いればその値を出力するというもの。しかし、ここの実装でA以上B以下のすべての数に対して割り切れるかのチェックをしてTLE。ここで、答えを決め打つ方針は間違ってると思い、愚直に問題文通りに素直に実装してみた。つまり、2数の組み合わせを全パターン調べて最大公約数を更新していく方法。でもこれってO(N^2)なので今回の制約では間に合うはずがないですね;;

結局決め打ちの方法で工夫する発想には至らず、用事のため1時間強で撤退しました。一回切り捨てた解法に戻れなかったのは頭が固すぎましたね。きちんと計算量に則った解法の選択を心掛けます!

D - Nowhere P

初見:C解けないけどわんちゃんある?

atcoder.jp

問題文もあまり読み込めていませんでした。入力が10^9と大きいこと、同じ倍数、約数系の問題ならCを先に解くべきだと思いC問題に戻りました。

全体の感想

 順位表を見る限り、ABCまでは大半が解かれていたので、せめてここまではおさえておきたかったな~というのが正直な気持ちです。解けない問題は格好の成長材料なのでありがたく復習させていただきます!