ABC112参加記録
久々にABCで全完できた回でした。 今回は練習もかねて初めてRubyで出ました。
A - Programming Education
1行だけ受け取って分岐して出力するだけの問題。
B - Time Limit Exceeded
時間T以内に帰れる方法でコストが最小なものを出力する問題。
入力[c, t]のペアでリストをもってT以下でフィルターをかけます。
残ったリストの中にあるcの最小値を出力して、
フィルターをかけた時にリストの長さが0であればその時はTLEを出力して完成。
C - Pyramid
ピラミッドの高さと中心座標を求める問題。
中心座標は101*101個なので全探索できます。
各候補座標に対して仮の高さを一度計算してその高さとしたときに与えられているすべての座標に矛盾がないか調べます。
矛盾がないか調べるときに候補座標から十分に距離が遠いもの(本来は高さがマイナスになるもの)を都度除外してから矛盾のチェックをしないとWAになってしまうので、その点で苦労しました。
D - Partition
個の整数の和がになるときにそれらの整数の最大公約数の最大値を求める問題。
がの倍数であるときもの倍数であるので、の候補はの約数となります。
がの約数であるとき、であれば問題の制約を満たせるので、約数を全探索すれば答えを見つけられます。約数の片方は必ず以下であるので1からまでループすれば十分間に合います。
答えの候補ですが、がの約数であるときも答えの候補になりうることがあるので、それを忘れるとWAになります。
Future Meets You Contest、ARC103/ABC111 参加記録
同日に開催されたのでまとめて書きます
Future Meets You Contest (ふみこん)
オンサイトにて参加しました。
マラソン形式のコンテストに参加するのは今回が初めてでした。そもそもマラソン形式をやるのが初めてだったので事前準備としてChokudai Contest 001だけ試しに解いて参加しました。
まず簡単な感想を述べると、アルゴリズムとは考えるべきことが違っているように感じてしまい、だいぶ苦戦しました。コンテストが始まる前までは0点を取ってしまうのではないかという不安があり、緊張してしまいましたが、本番では何とか点数を取ることができました。
通したのは適当な貪欲をランダムにした程度のものなので点数はあまり高くないですが、マラソン形式の感覚を感じることができたのよい経験になったと思います。
コンテスト終了後には懇親会と面談にも参加しました。懇親会では何度かお会いしたことある方や初めてのお会いする方含め、楽しくお話をさせていただきました。面談ではフューチャー(株)様での想定なオファー金額を提示していただけるもので(詳細は割愛します)、自社以外での一つの目線を感じることができたのでとても素晴らしい機会でした。
今回の企画をしていただいた、つかもさん、当日のスタッフをしていた社員の皆様、本当にありがとうございました。
ABC111/ARC103
こちらは言えることは何もないです。そもそも自分の参加記録を見ていたらRatedに参加したのが約1か月半ぶり、リアルタイムのコンテストに参加したのが約1か月ぶりとサボっていたのがバレバレで、結果もその通りになりました。
今回の問題は問題に対する考察はある程度あっていたものの実装がうまくいかず正解をすることができなかったパターンでした。
本当に言うことが何もないので、とにかく精進の流れを取り戻します。
Elmハンズオンに参加しました
こちらのイベントに参加しました
やったこと
こちらのスライドをなぞりながら実際にElmのコードを書きました https://gitpitch.com/ababup1192/elm-handson2
ハンズオンの後半では、同スライド内にある「Incremental Search」を自分で考えながら実装しました。 時間は1時間ほどだったのですが、発展問題の実装まで終わるには至りませんでした。ただ基本問題まではすんなりと実装することができたのでよかったと思います。(15分か20分くらい?)
ハンズオン後には4名の方によるLTを聞きました。
なんど一名スペシャルゲストで外国から来た方(!!)がLTをしていました。
やってみた感想
ハンズオン前
- elmは5分くらいちらっと見た程度
- 実際にコードは全然書いてない
- なんかわかりにくいなと思ってた
ハンズオン後
- 実際に説明を聞きながらコードを書いていたのですんなりと理解できた
- 分かりにくいと思っていたものが実際に書いてるときに見るとむしろわかりやすかった
- コード自体も本当に必要なものだけ書くのですっきりとしたコードにすることができた
この3つの中でも説明を聞きながらコードを書くというのが一番自分のElmに対する理解を深める手助けになりました。 (ハンズオンなので当然といえば当然ですが…)
Elmそのものについてもドキュメントを見てもわかる通り覚えるべきことが少なく、むしろプログラム初心者に向いているような気がしました。かといって必要なものがないかと言われるとそうでもなく、(少なくとも今自分が書いている段階での認識ですが)洗練された言語である印象を受けました。
LTについて
LTの内容はそれぞれ以下の通りでした。
Elm版StoryBook作ったよ!
https://miyamoen.github.io/bibliopola/#/Atom/Icon/Caret?direction=Right&pallet=BlueElmでユーザーストーリマッピングのツールを作ってみた
https://speakerdeck.com/jinjor/elm-deyuzasutorimatupingufalseturuwozuo-tutemitaElmで物理法則と戦う
https://unsoundscapes.com/slides/2018-09-22-fighting-the-law-of-physics-with-elm/
どれも内容は素晴らしかったです。全員に言えることですが、本当にElmが好きなんだなという気持ちが伝わってきました。
最後に
Elmは本当に書き始めたばかりなので、もう少しコードを書いて理解度を深めます。 少しだけ書いた程度ですが、とても書きやすいので楽しくWebアプリの作成ができそうです。
スライドにも書かれていることですが、もう一つ。 Webアプリを作るよりによくあると思われることですが、コンポーネントが増えたり、ページが増えたりすると、だんだん破綻してきてひどいコードになってしまうという問題があります。これはどのフロントエンドのフレームワークを触っていても気になる所です。また、実際の業務でも苦労する所です。この問題をElmではどのように解決するのかを、実際に書きながら理解することでElmの真の力を見極めていきたいです。
本日のハンズオンを企画、運営いただいたABAB↑↓BAさん、ありがとうございました!!
windowsでもかっこいいCUI環境を作りたかった
Windowsのコマンドプロンプトってよくわからないですよね? だからと言ってbash on Windowsインストールしても結局ウィンドウはWindowsのものなのでダサいですよね?
どうせなら少しでもかっこよくしようということで環境を作ったのでメモ
まずはbashを入れる
こちらの記事を参考にbashをwindowsで使えるようにします。
これだけでbashは使えるようになるのでls
コマンドとかが使えるようになります。
Cドライブは /mnt/c
にマウントされている状態なのでwindowsのファイルシステムで管理されているファイルも普通にアクセスできます。
見た目をどうにかする
一番重要な見た目ですがcmderという素晴らしいソフトウェアがあるのでこれをダウンロードして使います。 初期状態だとcmd.exeが上がるようになってるのでbashが上がるようにします。
ついでに全画面にしたときに余計な部分が消えるように設定すると見た目をだいぶかっこよくできます。 設定方法はこちらのサイト
あとはzshにしたりtmuxいれたり
このあたりを見ながらbashではなくzshにしてtmuxとか入れると楽しくなります
(スクショはまだまだカスタム中なので省略)
ARC098/ABC098 D - Xor Sum 2
復習日記
問題概要
- 長さの整数列が与えられる
- を満たすの組の個数を求める
考え方
サンプルを見てみると、
となっていて、の時にちょうど1の位置がお互いに干渉していないことがわかります。
例えば、1がどこかの桁に2つ以上あるときにをとると0になってしまいますが、加算をすると繰り上がって1の位置がずれてしまいます。
ということは、区間のすべての桁について1の個数が1個または0個になるような区間を求めれば答えを求めることができることがわかります。
というのが解説にもありますが、区間を尺取りで実際に計算しながら求めれば答えを求めるのには十分です。
数える実装が上手くきれいに書けなくてサンプルがなかなか通らなかったです。 結局右側を順番に回して左側を詰めていく実装に落ち着きました。 あとほかの人の実装が頭よかったので参考にしました。
ABC109参加してない記録
本番は参加できませんでしたが解いてみた感じで書きます
A - ABC333
が奇数になるCが存在するか確かめる問題
偶数に何をかけても偶数なのでが偶数かどうかで判定
B - Shiritori
しりとりが正しいか判定する問題
これは本当にやるだけ。出現済みかどうかはHashSet等で管理すれば楽だと思います。
C
すべての都市を訪れることが可能な最大の移動距離を求める問題
ずつ移動するので移動距離はの倍数になります。
番目と番目の都市を移動するときの距離が必ずの倍数でないといけないので、
逆を言うとすべての都市のからの距離がの倍数であればどの順番であってもちょうどたどりつくことができます。
以上のことから、すべての都市の座標のXからの距離の最大公約数を求めると以上の条件に当てはまる最大の移動距離を求めることができることがわかります。
D
指定された操作を行いコインが偶数枚置かれたマスを最大化する問題
マス目上の全てのコインを足したときに偶数枚であれば何らかの操作ですべてのマスのコインのマスを偶数枚にすることができると予想できます。
また、奇数枚であればどこか1か所を除いて偶数枚にすることができると予想できます。
ということはどこか一か所に向かってコインを集めるような操作をすればうまく偶数枚にすることができそうです。
実装として簡単なのは全体を横に移動してから端の縦を下に移動させる方法だと思います。
ARC101/ABC107 D - Median of Medians
復習日記
解説その他諸々を見ながらやっていきます。
問題概要
- 長さの数列を昇順に並べたときの番目の要素の値を中央値とする
- 長さNの数列の各についての中央値をと置く
- すべてのに対してのを集めた数列を作り、その数列の中央値を求める
考え方
まず、中央値について考え方を整理します。問題概要には中央値の定義は、
長さの数列を昇順に並べたときの番目の要素の値を中央値とする
と書かれていますが、これを言い換えると、長さの整数列の中央値をとしたときに、
- の中に以上の要素が個以上含まれるの中で最大の整数
であるといえます。
この「条件を満たすものの中で最大のもの」という考え方に注目すると二分探索で解くことができることがわかります。
これは連続部分列の中央値を並べた数列にも同様のことが言えて、最終的にこの問題は、
- のうち以上の要素は何個か?
という質問に置き換えることができます。
ここでについて言及するように言い換えると、
- の連続部分列 のうち, 以上の要素を個以上含むものは何通りか?
という質問になります。
次に、この質問に対してどのような解法をとるかを考えます。
毎回数えてしまうと計算量が多く間に合いません。そこでより大きい数を、より小さい数をに置き換えて累積和を取ります。
そうするとその区間の累積和が0以上であればより大きい数の個数が過半数であるということがわかります。
さらに言えば、からまでの累積和を取っておけば、
と計算をすることで求めることができます。
最後に、区間の累積和が0以上である区間の個数を求める方法ですが、としたときに、
- であるの組み合わせの個数
と言い換えることができます。これは反転数を求めるアルゴリズムを使うと高速に求めることができます。 反転数のアルゴリズムについては蟻本のp162または螺旋本のp175に載っています。
提出コード(諸々を写経)
かなり難しい700点ですね…
これを時間内に解くだけパフォーマンスが2000を超えるので、目標にしたいところです。