ABC293 ~Rubyで解いてみた1~
ABC293
2023/03/18
- ブランクがありすぎる故にポンコツすぎて笑ったけど、弊社に3月に来てくれた人が競プロ始めると言っていたから私も再開🚀
「明日のABC出ようかな〜」って言うようなバックエンドエンジニアの人が今月入社してくれて、非常に嬉しいです私🥹
— 朝型のジェシー@MNTSQ (@Jessica_nao_) 2023年3月10日
日頃会う人でやる人がいるって、やっぱり格別だね!!!明日はリアタイでは出られないけど、少なくとも解くぞ🚀自分もちょっとRubyでやってみたかったのと、その人に合わせて、せっかくなのでRubyを使ってみる
- 調べてみると、Rubyで青になった人が居るのを知ってびっくり!
- 久しぶりにやると、ちょっと解いただけでも、競プロと業プロの違いを痛感する……!
- 名付けとか、わざわざインスタンスを新しく作らないとか
A
chomp
しないといけないのを忘れてて、ちょっと止まった- Pythonの癖が抜けないのかな
- 三項演算子使えばシュッとかけるの最初からは見えなかった
- とても悲しい
- 新しい配列を作り直さないで、順番に出力してしまえば良い
- でもこれってかなり競プロ的だよね……!
B
String#split
- 引数がデフォルトで
' '
なの忘れてた - 前後の空白を削除してくれるから、
chomp
しなくて良いのも忘れてた
- 引数がデフォルトで
C
- rubyではbit全探索よりcombination全列挙のほうが早かった を参照
Array#filter{hoge}.size
は、Array#count{hoge}
でOK- Array などを空で用意して
each
で追加していくのなら、初めからEnumarable#each_with_object
を使うのが良い!- 以前業務でやったやつを使えた〜!
Set#add?
も前に使った記憶あるなぁ(しみじみ)require set
しないといけないの悲しい
- 縦と横を間違えて、1ペナもらったの痛すぎる〜!!!
- debug 用に、
pp
をたくさん仕込んだ😎
D
- 自分の端が、それぞれ繋がっているかだけ管理すれば良さそう
- 最初、どのグループに所属しているかも考える必要があるかなと思ったけど、そんなことはなかった
- 環状になっているもの、そうでないものの数だけ出せば良いから
- 「最後にまとめて集計すれば良い」と最初は思ったけど、そうじゃなかったことには注意だ
- 環状の方は、環状になった時にカウントしていけば良いね!
- 環状になっていないものは、左端だけ数えればok
- 最初、どのグループに所属しているかも考える必要があるかなと思ったけど、そんなことはなかった
- 2回と同じ端が出てこないのすごい嬉しい!
- だいぶ実装を軽くしてくれている😭
- 色々考えていたけど、結局UnionFindも必要やんけ!
- 元々その2本が同じグループに入っていて繋がりcycleになるのか、そうでないのかの判定が必要だ〜!
- 参考
- 条件がかなり優しいから、両端がどうとかの管理は不要だった〜!
- すでに結ばれている端が登場することがないとか
- つまり、両端を区別しないでよかった。。。
- すでに結ばれている端が登場することがないとか
attr_reader
にすべきか、attr_accessor
にするかは悩むけど、とりあえずattr_accessor
にしておいた!- いきなりUnionFindを準備できたのはラッキー!
*E
- 周期性があるやつね!!と思ったけど、m が大きすぎるからこれはだめ
- 割り算ができれば良いけど、 m と a-1 が互いに素かわからん
- 繰り返し二乗法の応用を頑張る!
- Ruby の場合は、
Interger#pow
がめっちゃ便利じゃないか!! - kyopro_friendsさんの解説 天才すぎる