2022-09-22 PAST #10 の I を解いた / twiq 実装メモ (2)
PAST #10 : 第10回 アルゴリズム実技検定 過去問 の I を解いた。
- I - 対称変換
https://atcoder.jp/contests/past202203-open/tasks/past202203_i
- 提出: https://atcoder.jp/contests/past202203-open/submissions/35047419
- 操作が 0 回で一致する場合は
S = Tなのでソートして一致するかを調べれば良い - 操作が 1 回で X 軸に平行な直線で対称移動する場合は
SとTの点のX座標は一致しY座標はどこかを基準に対照なので、SをXの昇順Yの昇順TをXの昇順Yの降順で並べて、 1 件目で基準位置を求めた後残りがすべて一致することを調べれば良い - Y 軸に平行な直線で対称移動する場合も同様に考えれば解ける
- 二つの点の間を取ると小数になるが、間を取る必要はなくて和をとって一致していれば十分のはず
実装メモ
2022-09-21 の EventStream の続き。
Vec<Event>となっているがEventStreamにしたほうが良い箇所がありそうEventStreamは単一のEventStreamIdを持ち、単調増加するEventStreamSeqを持つ- ↑の定義から一部は
Vec<Event>で残すことになりそう (EventStreamIdを横断する場合がある)- 「単一の
EventStreamIdを持つ」という部分を削る選択肢もあるだろうけど、現状はEventStreamのグループごとに取り得る event type が分類されているので、EventStreamIdごとに区切るほうが良さそうEventStreamは aggregate の実装の共通部分を削減する上で効果がありそうEventStreamへの追加のためにEventStreamSeqの増加など定形処理が多いので削れそう- 現在の目標から外れているので保留する
- 空の
Vec<Event>はあり得るか (空を許容するか) - 空を許容しない場合は
EventStore::find_event_streamの戻り値はEventStreamではなくOption<EventStream>になる - 空を許容する場合は
EventStreamIdを保持すべきか - 空を許容かつ
EventStreamIdを保持しない場合はEventStream::idの戻り値はEventStreamIdではなくOption<EventStreamId>になる EventStreamから aggregate を復元する場合にEventStreamが空で得られているとOption<A>を返すべきところでResult::Errになりそう (判断が面倒になりそう)- 取り得る状態をより簡素にするため、今回は空を許容しない形で進める
EventStream の属性。
id,seq,eventsを追加したidはすべてのVec<Event>に共通のEventStreamIdidは取れないと不便そうseqはVec<Event>の最後のEventのEventStreamSeq- 永続化する際に更新前・更新後の
EventStreamSeqが必要になる - 更新前・後の履歴管理は複雑になるので避けて aggregate ごと clone する
Cloneをderiveに入れておく必要があるeventsはVec<Event>- 永続化する際に 1 件ずつ
Eventを取り出したいため - 順序は
EventStreamSeqの昇順で問題ないはず - aggregate では
Eventの追加がある EventStream::push(Event)として単純にEventを追加するのは欲しいEventIdの生成やEventStreamIdの指定やEventStreamSeqのインクリメントを自動でやってほしい- 名前に迷う
- もう
Eventの生成はほとんど隠蔽してしまっても良い気もする - 基本的なユースケースとしては
EventDataを渡して残りの情報は保管してもらうで良さそう EventStream自体の生成はどうなる……?Vec<Event>から生成する想定だけど最初のEventの生成を隠蔽してしまうと困るEventStream::empty(EventStreamId)のような形で生成できると良いけど空は許容されていないEventStream::generate(EventData)EventStream::push(EventData)EventStream::push_event(Event)Eventを push することのほうが少なそうなのとgenerate側をEventDataにしたのでpushをEventDataに譲ってpush_eventとした
今日のコミット。