Swift で Welcome to AtCoder を解いてみた

[Qiita Engineer Festa 2024（キータ・エンジニア・フェスタ 2024） - Qiita](https://qiita.com/official-campaigns/engineer-festa/2024)
において、約1ヶ月で38記事という大量の記事の投稿を要求されることがわかった。
そこで、あまりコストをかけずに記事数を稼ぐ方法を考えた結果、「Welcome to AtCoder を様々な言語で解く」ことを思いついた。
単に解くだけでなく、使用する言語仕様の解説を入れれば、記事として一応成立するだろう。

# Welcome to AtCoder

[PracticeA - Welcome to AtCoder](https://atcoder.jp/contests/abs/tasks/practice_1)

Welcome to AtCoder では、以下の形式で整数 $a$, $b$, $c$ および文字列 $s$ が入力として与えられる。

```text
a
b c
s
```

この入力をもとに、与えられた整数の和 $sum = a + b + c$ および文字列 $s$ を、以下の形式で出力することが求められる。

```text
sum s
```

# 今回用いた Swift の機能

[The Swift Programming Language (6.0 beta) | Documentation](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/)
[Swift Standard Library | Apple Developer Documentation](https://developer.apple.com/documentation/swift/swift-standard-library)

## 定数の宣言

[The Basics | Documentation](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/thebasics/)

```swift
let 変数名 = 初期値
```

の形式で、定数を宣言できる。

:::note info
`let` のかわりに `var` を用いることで、(再代入できる) 変数を宣言できる。
また、型を明示するなどその他の書き方もある。
:::

## Optional からもとの型への変換

[Optional | Apple Developer Documentation](https://developer.apple.com/documentation/swift/optional)

型名の後に `?` がついた型は、その型のデータを格納する `Optional` である。
`Optional` の値の後に `!` をつけることで、`Optional` の値から格納された値を得ることができる。

:::note info
`Optional.none` に対して `!` を用いた変換を行おうとすると、ランタイムエラーになる。
`!` を用いる以外の変換方法もある。
:::

## 整数の処理

[Int | Apple Developer Documentation](https://developer.apple.com/documentation/swift/int)
[init(_:) | Apple Developer Documentation](https://developer.apple.com/documentation/swift/int/init(_:)-2hmii)
[Basic Operators | Documentation](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/basicoperators/)

`+` 演算子を用いることで、数値の加算を行うことができる。

`Int(文字列)` により、「文字列」をそれが表す整数に変換できる。
これは、結果を `Optional` で返す。

## 文字列の処理

[split(separator:maxSplits:omittingEmptySubsequences:) | Apple Developer Documentation](https://developer.apple.com/documentation/swift/string/split(separator:maxsplits:omittingemptysubsequences:))
[Collection Types | Documentation](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/collectiontypes/)

```swift
文字列.split(separator: 区切り)
```

を用いると、「文字列」を「区切り」の文字列で区切った結果を文字列の配列で得ることができる。
配列の要素には

```swift
配列[添字]
```

の形式でアクセスすることができる。配列の最初の要素の添字は `0` である。

## 標準入出力

[readLine(strippingNewline:) | Apple Developer Documentation](https://developer.apple.com/documentation/swift/readline(strippingnewline:))
[print(_:separator:terminator:) | Apple Developer Documentation](https://developer.apple.com/documentation/swift/print(_:separator:terminator:))

```swift
readLine()
```

を用いると、標準入力から1行読み込み、結果を文字列を持つ `Optional` で得ることができる。
結果の文字列は、デフォルトでは改行文字を含まない。

:::note info
結果に改行文字を含めるかは、設定可能である。
:::

```swift
print(値)
```

を用いると、標準出力に「値」を出力し、さらに改行を出力できる。
「値」は複数をコンマで区切って指定でき、この場合それぞれの値を空白文字1個で区切って出力する。

:::note info
複数指定した「値」の間に何を出力するか (デフォルトでは空白)、および最後に何を出力するか (デフォルトでは改行) は、設定可能である。
:::

# 提出コード

```swift
let line1 = readLine()!
let line2 = readLine()!
let line3 = readLine()!

let a = Int(line1)!
let bc = line2.split(separator: " ")
let b = Int(bc[0])!
let c = Int(bc[1])!

print(a + b + c, line3)
```

[提出 #55231284 - AtCoder Beginners Selection](https://atcoder.jp/contests/abs/submissions/55231284)