標準入力から空白区切りの整数を一行受け取る方法。

# 学んだこと && もくじ
・ACしたコード && 解説
・split()について
・map()について
・stride()（ストライド関数）について
・stride()とfor-in文の違い
・手順まとめ
・ACしたコード && 解説なし


# 注意！
・以下のネタバレあり。

https://atcoder.jp/contests/abc318/tasks/abc318_a


# ACしたコード && 解説
```Swift
// String型のみで利用できるsplit(）を使い、空白区切りで標準入力から
// map{}を利用して文字列で受け取った文字列の整数をInt型の整数の配列として受け取る。
let values = readLine()!.split(separator: " ").map { Int(String($0))! }
// 整数の配列として受け取れているか確認。
print(values)
// 添え字が使えるか確認。
print(values[0])
// 足し算できるか確認。
print(values[0] + 1)
// values[1]からvalues[0] + 1の間、values[2]ずつ増えた回数をカウントする変数を用意。
var count = 0
for i in stride(from: values[1], to: values[0] + 1, by: values[2]) {
    // iがvalues[1]からvalues[0] + 1の間出力できるか確認。
    print(i)
    // iがvalues[2]ずつ増えている回数をカウントする。
    count += 1
}
print(count)
```
<b>入力例１</b>
13 3 5

<b>出力例</b>
[13, 3, 5]
13
14
3
8
13
3

# split（）について
・split（）はString型で利用できるメソッドなので、Int型には利用できない。
▼ 以下のコードで実行したらエラーが出ました。
```swift
// 空白区切りで標準入力から整数の配列として受け取る。
let values = Int(readLine()!)!.split(separator: " ")
// 整数の配列として受け取れいてるか確認。
print(values)
```
<b>入力例１</b>
13 3 5

<b>出力例</b>
main.swift:2:32: error: value of type 'Int' has no member 'split'
let values = Int(readLine()!)!.split(separator: " ")
             ~~~~~~~~~~~~~~~~~ ^~~~~
<b>訳</b>
int' 型の値には 'split' というメンバがない。

→ Int型には、splitが無いという解釈をしたので[Swiftの公式ドキュメント](https://developer.apple.com/documentation/swift/string#splitting-a-string)を確認。
Int型のページにsplitの記載を見つけられなかったので無いという判断をしています。
![スクリーンショット 2023-09-09 16.26.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823837/0174c7b6-767e-95ab-5cb1-0c2c839f101e.png)

# map()について
・配列内の要素に同じ操作をしたい時に利用する。
```Swift
let nums = [1, 2, 3, 4, 5]

// 各要素を2倍に変換するクロージャを使用して新しい配列を作成
// { $0 * 2 }をクロージャーというらしいけど、今回は深掘りしない。
let doubledNums = nums.map { $0 * 2 }

print(doubledNums)
```
<b>出力例</b>
[2, 4, 6, 8, 10]


※以下の文のコレクション部分は、配列に変換して読んでください。
・Swiftのmap()は、コレクション内の各要素に対して指定した変換操作を適用する。
・元のコレクションは変更されず、変換された結果を新しいコレクションとして取得できる。

<b>コレクションとは、、、(ここは深掘りしない)</b>
・配列（Array）
複数の要素を順序付けて格納するデータ構造。同じ型の要素を含むことが一般的。

・辞書（Dictionary）
キーと値のペアを格納するデータ構造で、キーを使用して値を取得する。

・集合（Set）
一意の要素を格納するデータ構造で、重複を許さない。重複のない要素のコレクション。

# stride()（ストライド関数）について
・stride()は関数。
・stride()は、指定された範囲内で指定された増加幅でループを実行するために使用される。
・増加幅は<b>整数型</b>で指定され、正の整数、負の整数、0など、さまざまな値が設定できる。
・増加幅を使用することで、指定された範囲内で特定の間隔で値を生成することができる。
<b>引数の詳細</b>
stride()関数の引数は```stride(from:to:by:)```で構成される。
from:
指定した範囲の初期値。
to:
指定した範囲の終了する値、
by:
指定した増加量で数値を生成する。（for-in分でiの部分に当たる）

<b>実験１</b>
・０から１０未満の範囲で＋２の増加量でiの整数が出力される。
```swift
for i in stride(from: 0, to: 10, by: 2) {
    print(i) 
}
```
<b>出力例</b>
0
2
4
6
8

<b>実験２（間違えたver）</b>
・０から１０までの範囲で偶数の時、iの整数が出力される。
```swift
for i in stride(from: 0, to: 11 + 1, by: i % 2 == 0) {
    print(i) 
}
```
<b>出力例</b>
error: cannot find 'i' in scope
for i in stride(from: 0, to: 11 + 1, by: i % 2 == 0) {
                                      ^
<b>訳</b>
スコープに 'i' が見つからない

<b>エラーの原因</b>
・by:の後に条件式（i % 2 == 0）を直接指定することはできない。
・stride関数のbyの値は、<b>整数型</b>の値を指定する。結果、条件式（i % 2 == 0）は直接指定できない。

<b>実験２（正解ver）（stride()を使って偶数の時、iを出力する方法）</b>
・条件分岐を使って条件を指定する。
```swift
for i in stride(from: 0, to: 11 + 1, by: 2) {
    if i % 2 == 0 {
        print(i)
    }
}
```
<b>出力例</b>
0
2
4
6
8
10

# stride()とfor-in文の違い
・for-in文は、制御構造の一つ。
・for-in文は、コレクション（配列、辞書、セットなど）の要素を反復処理するために使用される。
・for-in文は、コレクション内の各要素に対してループを実行し、各要素を順番に取り出します。

<b>結果</b>
・stride()関数は特定の範囲で数値を生成する際に便利。
・for-in文はコレクション内の要素を処理する際に使用される。

# ACしたコード && 解説なし
```Swift
let values = readLine()!.split(separator: " ").map { Int(String($0))! }
var count = 0
for i in stride(from: values[1], to: values[0] + 1, by: values[2]) {
    count += 1
}
print(count)
```
<b>入力例１</b>
13 3 5

<b>出力例</b>
3

# 手順まとめ
・空白区切りで整数を標準入力から受け取るには、split()を利用する。
・split()はString型のみで利用できるメソッドなので、整数を文字列として受け取る必要がある。
・今回の問題では、整数の操作をするので、文字列として標準入力から受け取った整数を改めてInt型に変換する必要がある。
・String型からInt型に変換する際にmap{}を利用する。