学んだこと && もくじ
・ACしたコード && 解説
・split()について
・map()について
・stride()(ストライド関数)について
・stride()とfor-in文の違い
・手順まとめ
・ACしたコード && 解説なし
注意!
・以下のネタバレあり。
ACしたコード && 解説
// 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)
入力例1
13 3 5
出力例
[13, 3, 5]
13
14
3
8
13
3
split()について
・split()はString型で利用できるメソッドなので、Int型には利用できない。
▼ 以下のコードで実行したらエラーが出ました。
// 空白区切りで標準入力から整数の配列として受け取る。
let values = Int(readLine()!)!.split(separator: " ")
// 整数の配列として受け取れいてるか確認。
print(values)
入力例1
13 3 5
出力例
main.swift:2:32: error: value of type 'Int' has no member 'split'
let values = Int(readLine()!)!.split(separator: " ")
~~~~~~~~~~~~~~~~~ ^~~~~
訳
int' 型の値には 'split' というメンバがない。
→ Int型には、splitが無いという解釈をしたのでSwiftの公式ドキュメントを確認。
Int型のページにsplitの記載を見つけられなかったので無いという判断をしています。
map()について
・配列内の要素に同じ操作をしたい時に利用する。
let nums = [1, 2, 3, 4, 5]
// 各要素を2倍に変換するクロージャを使用して新しい配列を作成
// { $0 * 2 }をクロージャーというらしいけど、今回は深掘りしない。
let doubledNums = nums.map { $0 * 2 }
print(doubledNums)
出力例
[2, 4, 6, 8, 10]
※以下の文のコレクション部分は、配列に変換して読んでください。
・Swiftのmap()は、コレクション内の各要素に対して指定した変換操作を適用する。
・元のコレクションは変更されず、変換された結果を新しいコレクションとして取得できる。
コレクションとは、、、(ここは深掘りしない)
・配列(Array)
複数の要素を順序付けて格納するデータ構造。同じ型の要素を含むことが一般的。
・辞書(Dictionary)
キーと値のペアを格納するデータ構造で、キーを使用して値を取得する。
・集合(Set)
一意の要素を格納するデータ構造で、重複を許さない。重複のない要素のコレクション。
stride()(ストライド関数)について
・stride()は関数。
・stride()は、指定された範囲内で指定された増加幅でループを実行するために使用される。
・増加幅は整数型で指定され、正の整数、負の整数、0など、さまざまな値が設定できる。
・増加幅を使用することで、指定された範囲内で特定の間隔で値を生成することができる。
引数の詳細
stride()関数の引数はstride(from:to:by:)
で構成される。
from:
指定した範囲の初期値。
to:
指定した範囲の終了する値、
by:
指定した増加量で数値を生成する。(for-in分でiの部分に当たる)
実験1
・0から10未満の範囲で+2の増加量でiの整数が出力される。
for i in stride(from: 0, to: 10, by: 2) {
print(i)
}
出力例
0
2
4
6
8
実験2(間違えたver)
・0から10までの範囲で偶数の時、iの整数が出力される。
for i in stride(from: 0, to: 11 + 1, by: i % 2 == 0) {
print(i)
}
出力例
error: cannot find 'i' in scope
for i in stride(from: 0, to: 11 + 1, by: i % 2 == 0) {
^
訳
スコープに 'i' が見つからない
エラーの原因
・by:の後に条件式(i % 2 == 0)を直接指定することはできない。
・stride関数のbyの値は、整数型の値を指定する。結果、条件式(i % 2 == 0)は直接指定できない。
実験2(正解ver)(stride()を使って偶数の時、iを出力する方法)
・条件分岐を使って条件を指定する。
for i in stride(from: 0, to: 11 + 1, by: 2) {
if i % 2 == 0 {
print(i)
}
}
出力例
0
2
4
6
8
10
stride()とfor-in文の違い
・for-in文は、制御構造の一つ。
・for-in文は、コレクション(配列、辞書、セットなど)の要素を反復処理するために使用される。
・for-in文は、コレクション内の各要素に対してループを実行し、各要素を順番に取り出します。
結果
・stride()関数は特定の範囲で数値を生成する際に便利。
・for-in文はコレクション内の要素を処理する際に使用される。
ACしたコード && 解説なし
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)
入力例1
13 3 5
出力例
3
手順まとめ
・空白区切りで整数を標準入力から受け取るには、split()を利用する。
・split()はString型のみで利用できるメソッドなので、整数を文字列として受け取る必要がある。
・今回の問題では、整数の操作をするので、文字列として標準入力から受け取った整数を改めてInt型に変換する必要がある。
・String型からInt型に変換する際にmap{}を利用する。