Toy と帽子と ADP BE

主にプログラミングに関わる話をゆるくエモくやっていきます

AtCoder Beginner Contest 121

各問題

A - White Cells

算数の問題。しかも問題に

なお、残る白色のマス目の数は行や列の選び方によらないことが証明できます。

って親切に書いてくれています。

B - Can you solve this?

公式解説は二次元配列を作るといいでしょうとされていて、確かにその方が思わぬミスは減るのでより安全だと思います。

ただ、状況にもよりますが、個人的に二次元配列を作る方が混乱することがあるので、こういうのはループ中に入力を取りたい派だったりします。

https://atcoder.jp/contests/abc121/submissions/4517069

C - Energy Drink Collector

ソートはあるけど、B問題っぽい?

お店を金額の安い順にソートする必要があるので、先ほどと同じように二次元配列で混乱しないようにしたくてわざわざクラスを定義しました。

https://atcoder.jp/contests/abc121/submissions/4520837

ぬるいっちゃぬるいですが、まあそこまで時間を気にするようなレベルでもないので、今の所、このへんは読みやすさ重視で書くようにしてます。 あと、long にするのは忘れなかったです。えらいw

追記

ていうか、こういうペアを扱うときは(Tree)Map でよかったというお話。 ただし、Mapを使う場合はキーが重複するときどうするかを考慮する必要がありますね。

せっかくなので、TreeMap版も実装して提出しました。

https://atcoder.jp/contests/abc121/submissions/4531121

D - XOR World

結局約半数が WA で完答できず。

https://atcoder.jp/contests/abc121/submissions/4527933

うーん、へんてこな実装ではありますが、これで通るものもあれば通らないものもあるのがなぜなのか・・・。 とりあえず a = 0 のときだめっぽい?なんか法則が崩れる条件がある?それとも単に実装の問題?

ともあれ、XOR のような頻出問題で公式解説にあるような性質をうまく見つけたり使いこなしたりできないとつらいですね。

まとめ

C問題まで順調に解けたし、D問題も提出には至ったのでよし。

なにより、色が付いたので今回はよし!

次の目標は緑で。

f:id:mdstoy:20190309232812p:plain

AtCoder Beginner Contest 120

各問題

A - Favorite Sound

公式の解説どおり。

B - K-th Common Divisor

概ね公式の解説どおり。なのですが、min(A, B)じゃなくて、何をとちくるったかmax(A, B)としていました・・・。 YouTube解説では単に100とされていて、計算量に対した影響はないからまあいいか、というふうに言われていたので、まあいいか、って感じです。(いいのか?)

C - Unification

最終的に公式の解説どおり。

ですが、初めはまともに解こうとしてTLE連発してしまいました。

そこで我に返って冷静に考えてみて、これ消費されずに0と1が両方残ってしまうことはありえなくないか?ってことに気がついたのでした・・・。

AtCoder、そういうのもあるのか・・・。

D - Decayed Bridges

後ろから順に繋げていく、差分更新していく、という考えにはたどり着きました。 しかし、肝心の連結情報をどう作ってどう保存するのかがまったくわからなくてタイムアップ。

UnionFind木というのを使うんですねー。ほふー。

課題など

  • 考え方一つで、恐ろしくシンプルに実装できるタイプの問題もAtCoderにはある
  • データ構造
    • 今回はUnionFind木

感想

C問題のダメージがあまりにも大きい。on_ 次は、次こそは茶色に到達するということでどうかひとつ。

f:id:mdstoy:20190303232840p:plain

AtCoder Beginner Contest 119

2回目の参加の結果は2完。

あああああ、ってなってましたが、パフォーマンスも順位も初参加の前回より上がっていたので、今回はC問題の難易度が高かったということでいいんですよね?ね?

各問題

A - Still TBD

単に、月の部分を引っこ抜いて4以下かどうかで判定しました。 解説PDFでは"2019/04/30"との文字列比較が解説されていて、たしかにそのほうが速いですね。(業務ではやりませんけどね・・・。) ともあれ、A問題でも学びがある。

https://atcoder.jp/contests/abc119/submissions/4367304

B - Digital Gifts

これは問題をそのままコードに落とすだけ。さすがに。

https://atcoder.jp/contests/abc119/submissions/4368946

C - Synthetic Kadomatsu

どうやって「うまいこと」探索するんだろう?うーんわからん、と思ってすぐにD問題に移ってしまいました。 PDFとYouTubeの解説によれば、最大8本の竹に対して「Aに使う or Bに使う or Cに使う or 使わない」を単に全探索すればよかったとのこと・・・。 それぞれの竹がどれに使われるかって発想ができなかったので、そもそもだめです。

D - Lazy Faith

スタート地点から二分探索して、寺→神社の順と神社→寺の順で近いものを探せばいいんじゃないの?東西と目的地の組み合わせで最大8通り計算するだけじゃないの? と思って実装していたのですが、間に合わず。

PDFとYouTubeの解説によれば、考え方は合っていた模様。要するに実装力が酷すぎるということ。あああああ。on_ この問題は落ち着けばさすがにできた気がします・・・。もったいなかった。

課題

  • 全探索
  • 慌てずにコードを書く

感想

得るものはいろいろあったので、まあよしということで。 次回の目標は茶色に到達、で。

f:id:mdstoy:20190225001544p:plain

AtCoder Beginner Contest 118 (AtCoder 始めました)

主に、なんか面白そー、っていう理由でAtCoderを始めることにしました。あと、トレーニングっていうかリハビリっていうか、とにかくコードを考えて書くための動機がなんか欲しかったということもあります。

で、自分が何を考えて回答のコードを書くに至ったのか参照できるようにしておくと後で役立つかもと思って、ブログに思考を落としておくことにします。いわば積極的に恥を晒していくスタイル。

あと、Javaでやります。(当面の間は) Javaで競プロは正直面倒ですし、時間をいくらでもかけていいならよりエレガントにかける言語は他にもありますが、現状ではトータルで考えてJavaが圧倒的に早く書けるので仕方がない・・・。

各問題

A - B +/- A

https://atcoder.jp/contests/abc118/submissions/4279713

条件をただコードに書き下しただけ。

B - Foods Loved by Everyone

https://atcoder.jp/contests/abc118/submissions/4282069

食べ物ごとに好きと答えた人の数をカウントし、そのカウントが回答人数と一致したものを数えたら、それが答え。

C - Monsters Battle Royale

https://atcoder.jp/contests/abc118/submissions/4290804

最終的にACに至った回答は

  • 一番小さい数で他の数すべてをオーバーキルにならないように攻撃する
    • このときの最終結果は、他の数に対して一番小さい数で剰余を計算すると求まる
  • これを生存者が一人になるまで繰り返す

というロジック。

なんでこんなロジックになっちゃったかというと、最初に思いついたロジックが

  • 一番小さい数で二番目に小さい数を「一回」攻撃する
  • ひたすらそれを繰り返す

というもので、それを TLE にならないように修正した(だけ)だからです。

最初の回答 : https://atcoder.jp/contests/abc118/submissions/4283717

あと、確実にループでなめられるようにするためにソートかけてるんですけど、多分ちょっと考えたらソートいらなくなりそう。 ていうかソートに頼っている時点でだめやん?

D - Match Matching

未提出

C問題のTLEがなかなか振りほどけず、考える時間がほとんどありませんでした。

ちなみに問題を見て思いついたロジックは。

  • 1があるとき
    • 本数が偶数のとき
      • 1を並べる(完)
    • 本数が奇数のとき
      • 7があるとき
        • 7のあと1を並べる(完)
      • (7がなくて)5があるとき
        • (次は4本の4だが、これは偶数だから考えなくていい)
        • 5のあと1を並べる(完)

(以下省略)

のように、使用本数が少ないものから考慮していくというものでしたが、これだと必要本数の多い数だけが用意されているケースで分岐が大変なことになりそうなので、いずれにせよ色んな意味でだめでした。

感想

競プロで必要な考え方に慣れていかないと、話になりませんね。 とりあえずDPをちゃんと勉強せねば。

まずは色がつくところを目標にがんばります。

f:id:mdstoy:20190217010618p:plain

2018 年を振り返る

あんまりこういうことしないですけどね。まあ今年は大きなイベントが二つあったので。

2018 年の大イベント

その一 退職

会社をやめました。

mdstoy.hatenablog.com

退職はしましたが、色々あって次に所属する会社は未だに決まっておらず、派遣社員で食いつないでおります。

可及的速やかに次の仕事を見つけねばなりません。見つけねばなりません。

その二 JJUG CCC で登壇

東京で登壇してきました。

mdstoy.hatenablog.com

単発では終わらぬよう、今後も努力していきたい所存です。

幸いなことに、今自分が本当にやりたいことはおぼろげながら見えてきました。

というわけで

2019 年はまず転職活動を全力で、そして、本当にやりたいことをはっきりと見据えることをまず目標にぼちぼちやっていきたいと思います。

「JJUG CCC 2018 Fall」に行ってきました - 登壇するには編

無名のエンジニアが 44 歳にもなって JJUG CCC に初参加ながら初登壇した経験を綴って、世のエンジニアに夢と希望を与えたいと思ったり思わなかったりするお話。

JJUG CCC で登壇するもっともシンプルな方法

  • CfP を提出する
  • CfP が採用される
  • 登壇できる

おわり

いや、そういうことじゃないw

登壇のために必要だと思うこと

題材

当然、CfP を提出するためには、提出する題材が必要になります。

自分の知識なんてたかが知れているから、人に話せるネタがない、と思う人もいるかもしれませんが、それは心配しなくても大丈夫です。 何でも知っている全知全能の神のような人はこの世に存在しません。見上げてみれば、どう見ても神にしか見えない人もいるっちゃいますが、それはそれ。

また、セッションには色んな人が参加します。マサカリ持った怖い人しかいないわけではありません。自分が頑張って習得した知識をこれから学ぶ人たちに共有すると思えば、そんなに難しいことではないはずです。後輩に教えるのと大差ありません。JJUG CCC のように CfP を出す段階で対象者を指定できるのであればなおさらです。怖い人がマサカリ投げるためにわざわざ初心者向けに来たりはしないので心配ありません。

さらに、人によってつまずくポイントというのもさまざまです。できる人にとってははまったく気にも留めずに通過していったポイントで、初学者・初心者がハマるというのはよくあることです。そして、できる人は自分がハマらなかったがゆえに、何がハマりポイントなのかがわからないというのもまたよくあることです。 そして、そのハマりポイントを説明できるのは、ハマったことがある人だけです。きっと、たぶん。*1

手前味噌ですが「もう参照渡しとは言わせない」は、まさにそういう話題だと思います。 で、多少なりとも腕に覚えのある人なら、「もう参照渡しとは言わせない」ごときが通るなら、自分でも話せることがあるのでは!?って思えるんじゃないかなーと思ってるんですけどどうでしょう?*2

モチベーション

セッション中にも言ったのですが、長年付き合ってきた(?)ネタがあったうえで

このアンケート結果を見て(まあ現実はそんなものかと思いつつも)、未だに 50% なんやーとなったので、これが決定的なモチベーションになって CfP を出すに至りました。

もっともらしいことを言えば、壁を突き破るための情熱、つまり伝えたいと思う強い気持ちが自分の中に必要かもしれません。それは人それぞれだと思うので、なんともアドバイスはできないのですが。

人に話をするということ

さすがに JJUG CCC クラスのカンファレンスともなると、人前で話す経験が皆無ではつらいと思います。時間配分であったり、どういう話がウケてどういう話がウケないのかであったり、自分は壇上に立ったとき声がどれくらい出るのか、どれくらい出せばいい感じなのか、話すペースは上がるのか下がるのか、壇上に立ったとき自分がどういうテンションになるのか、などなど。これらはやってみないとわからないものです。

とかいいつつ、実は私自身は、カンファレンスでの登壇自体が初めてだったりします。社内勉強会の類で話したことが数回と、LT が 1 回の経験しかありませんでした。 ただ、そのたった一回の LT の経験が大きかったように思います。それがなかったらまたぜんぜん違う結果になっていたかもしれませんし、登壇しようという気持ち自体が湧くこともなかったかもしれません。

ちなみにその LT のレポートはこちら。

mdstoy.hatenablog.com

LT ならお手軽に参加できる勉強会がいっぱいあるはずですから、興味のある人はガンガン LT やってみればいいんじゃないかなと思います。

うまく話せるか不安に思う人もいるかもしれませんが問題ありません。登壇なんてものは、要するに思いの丈をひたすらぶつけるだけの作業なんです。しらんけどw*3

上記モチベーションのところでもいいましたが、伝えたいと思う強い気持ちがあれば言葉は自然に湧いてくるんじゃないかなと思います。オタクが自分の知識を熱く語らずにはいられない、みたいなことです要するに。(ほんまかいな?) しかも正しいことを言っている分には誰にも咎められません。うざいとか空気読めとか言われずに思いの丈を語り続けられるわけですよ。

ちなみに、大きな声では言えませんが、私、今回、本番同様のリハーサルを一度もしておりません。(声を出さずに脳内でしゃべりながらスライドを通すことは何度かしましたが) それでも大丈夫だという自信がありましたし*4、実際にしゃべりきれたのは、私の中に伝えたいと思う強い気持ちと10数年かけて培ってきた知識があったからにほかなりません。

逆に、そこまでの知識と情熱がないのであれば、まずそれを身につけることが先決だと思います。

結論

登壇するためには気持ちが最重要。語るだけの知識を持っていることは大前提だが、それは必ずしも高度である必要はない。どんなレベルの話にも需要はある。なんなら失敗談でもいい。そんな感じで。

*1:教育そのものに関心のある人なら話は別ですが、できるエンジニアかつできる教育者となると、さすがに激レアなのではないかと

*2:私自身では客観的に判断しづらいのでちょっとあれなんですけど

*3:真面目な話、そこの考え方は人によってぜんぜん違うはずなのでご注意

*4:やらないよりやったほうがいいには決まってます、念の為