# AtCoder: abc239 (Swift)

## [A - Horizon](https://atcoder.jp/contests/abc239/tasks/abc239_a)


### 提出

- [コンテスト中](https://atcoder.jp/contests/abc239/submissions/29435374)

## [B - Integer Division](https://atcoder.jp/contests/abc239/tasks/abc239_b)

- コンテスト中はその場で解いたけれど、-∞に向かって切り捨てをするオペレーターを追加した
- 本当は`/_`がわかりやすいと思ったけれど、許されなかった

### 提出

- [コンテスト中](https://atcoder.jp/contests/abc239/submissions/29440994)
- [振り返り](https://atcoder.jp/contests/abc239/submissions/29558009)

```swift
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](https://atcoder.jp/contests/abc239/tasks/abc239_c)

-  最初、問題をちゃんと読めておらず勘違いした
  - こういった記述に対してまだ慣れていないのも原因か
  - 読み飛ばすことがちょくちょくある
-  他の人の解答を見ているとパターンの表現方法が異なって興味深い
  - 自分はそれぞれを直接指定してしまった
  - [公式解説](https://atcoder.jp/contests/abc239/editorial/3389)でもx、yの両方でも `-2...2` の組み合わせを計算で弾いている
  - ここら辺の無駄を減らしたいと思ってしまうのは、不要な最適化なのだろうか
  - 手で直接パターンを書き出すのは、ミスをしそうだとは思う。
- Swiftだと `pow(Int, Int)` がなく、不便だなと思う機会が何回かあったので、とりあえず関数を用意してみた
- オペレーターも考えたが、`pow(Double, Double)` があるから、それを踏襲
- より安全にな方にと、返り値はOptionalにしたけれども、気分という感じもする。

### 提出

- [コンテスト中](https://atcoder.jp/contests/abc239/submissions/29461726)
- [振り返り](https://atcoder.jp/contests/abc239/submissions/29558529)

```swift
/// 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](https://atcoder.jp/contests/abc239/tasks/abc239_d)

- 本番は不精して素数の一覧を引っ張ってきた
- 振り返りではエラトネスの篩で実装
- 実装する際に素数でない場合の`guard else continue`していたときに `x += 1`せずにループ…
  - while文とかでループする際には最初に`defer`でループ条件をつける癖をつけたい
- 普段あんまり`stride(from:though:by)`を使わないから慣れたい
- `contains(where:)`とかもまだあまり使えていない
- 
### 提出

- [コンテスト中](https://atcoder.jp/contests/abc239/submissions/29467594)
- [振り返り](https://atcoder.jp/contests/abc239/submissions/29600937)

## [E - Subtree K-th Max](https://atcoder.jp/contests/abc239/tasks/abc239_e)

- コンテスト終了後だけれども、マージソートで実装した
- 冷静に考えてみるとPriorityQueueはテンプレートに入れているのだから、それを活用すればよかった
- 今回の問題はそこまで大きくないのだから、標準のソートでも制限内でできた
- 自分の使えるツールとそれがどれぐらい使えるのか、判断できるようになりたい
- 時間外とはいえ、自力でE問題を解けたことはよかった

### 提出

- [Merge Sort](https://atcoder.jp/contests/abc239/submissions/29479611)
- [Priority Queue](https://atcoder.jp/contests/abc239/submissions/29601798)
- [Sort](https://atcoder.jp/contests/abc239/submissions/29602227)

