ABC293 ~Rubyで解いてみた1~

ABC293

2023/03/18

  • ブランクがありすぎる故にポンコツすぎて笑ったけど、弊社に3月に来てくれた人が競プロ始めると言っていたから私も再開🚀
    • 自分もちょっとRubyでやってみたかったのと、その人に合わせて、せっかくなのでRubyを使ってみる

      • 調べてみると、Rubyで青になった人が居るのを知ってびっくり!
    • kona0001.hatenablog.com

  • 久しぶりにやると、ちょっと解いただけでも、競プロと業プロの違いを痛感する……!

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も必要やんけ!
  • attr_reader にすべきか、 attr_accessor にするかは悩むけど、とりあえず attr_accessor にしておいた!
  • いきなりUnionFindを準備できたのはラッキー!

*E

  • 周期性があるやつね!!と思ったけど、m が大きすぎるからこれはだめ
  • 割り算ができれば良いけど、 m と a-1 が互いに素かわからん
  • 繰り返し二乗法の応用を頑張る!
  • Ruby の場合は、Interger#pow がめっちゃ便利じゃないか!!
  • kyopro_friendsさんの解説 天才すぎる