AtCoder: abc239 (Swift)
A - Horizon
提出
B - Integer Division
- コンテスト中はその場で解いたけれど、-∞に向かって切り捨てをするオペレーターを追加した
- 本当は
/_がわかりやすいと思ったけれど、許されなかった
提出
infix operator /-: MultiplicationPrecedence // FloorDiv
/// FloorDiv
/// - Returns: Division result floored towards negative infinity
func /- (lhs: Int, rhs: Int) -> Int {
if rhs < 0 { return -lhs /- -rhs }
return lhs >= 0 ? lhs / rhs : (lhs - rhs + 1) / rhs
}
C - Knight Fork
- 最初、問題をちゃんと読めておらず勘違いした
- こういった記述に対してまだ慣れていないのも原因か
- 読み飛ばすことがちょくちょくある
- 他の人の解答を見ているとパターンの表現方法が異なって興味深い
- 自分はそれぞれを直接指定してしまった
- 公式解説でもx、yの両方でも
-2...2の組み合わせを計算で弾いている - ここら辺の無駄を減らしたいと思ってしまうのは、不要な最適化なのだろうか
- 手で直接パターンを書き出すのは、ミスをしそうだとは思う。
- Swiftだと
pow(Int, Int)がなく、不便だなと思う機会が何回かあったので、とりあえず関数を用意してみた - オペレーターも考えたが、
pow(Double, Double)があるから、それを踏襲 - より安全にな方にと、返り値はOptionalにしたけれども、気分という感じもする。
提出
/// Power of Ints
/// - Parameters:
/// - base: Base number to be powered
/// - index: The exponent
/// - Returns: Int of the exponential number. `nil` if the result is beyond Int.
func pow(_ base: Int, _ index: Int) -> Int? {
let result = pow(Double(base), Double(index))
guard result <= Double(Int.max) && result >= Double(Int.min) else { return nil }
return Int(result)
}
D - Prime Sum Game
- 本番は不精して素数の一覧を引っ張ってきた
- 振り返りではエラトネスの篩で実装
- 実装する際に素数でない場合の
guard else continueしていたときにx += 1せずにループ…- while文とかでループする際には最初に
deferでループ条件をつける癖をつけたい
- while文とかでループする際には最初に
- 普段あんまり
stride(from:though:by)を使わないから慣れたい contains(where:)とかもまだあまり使えていない提出
- 振り返り
E - Subtree K-th Max
- コンテスト終了後だけれども、マージソートで実装した
- 冷静に考えてみるとPriorityQueueはテンプレートに入れているのだから、それを活用すればよかった
- 今回の問題はそこまで大きくないのだから、標準のソートでも制限内でできた
- 自分の使えるツールとそれがどれぐらい使えるのか、判断できるようになりたい
- 時間外とはいえ、自力でE問題を解けたことはよかった