paiza Learning や AtCoder で使えそうなコードスニペット一覧(Swift5版)。
このページは普段使い用のメモ程度ですので、詳細な解説が必要な方は次のページをご参照ください。
標準入力の扱い
- 標準入力から文字列を読み込む。
1 2 3 4 5 |
// 文字列として扱う let s = readLine()! // Int として扱う let i = Int(readLine()!)! |
- 標準入力から一行入力を読み込み、空白で区切り、配列にいれる。
1 2 3 4 5 |
// 文字列として扱う let sa = readLine()!.split(separator: " ").map{ String($0) } // Int 型として扱う let ia = readLine()!.split(separator: " ").map { Int($0)! } |
- 複数行を一気に取り込む。
1 2 3 4 5 |
// 文字列の場合 let sa = Array(AnyIterator { readLine() }).map{ String($0) } // Int型に map する let ia = Array(AnyIterator { readLine() }).map { Int($0)! } |
- n * m 行の空白で区切られた配列を一気に取り込み、二次元配列にする。
1 2 3 4 5 6 7 8 |
// [[Int]] にする場合 // 1 2 3 // 4 5 6 // のような入力を [[1, 2, 3], [4, 5, 6]] にする let ia = Array(AnyIterator { readLine() }) .map { $0.split(separator: " ") .map { Int($0)! } } |
制御構文
- for 文で範囲を指定する
1 2 3 |
for i in stride(from: 開始値, to: 終了値, by: 増加値) { // 処理 } |
文字の扱い
- ある文字に対応する Unicode 値を取得する
1 2 |
// 戻り値は UInt32 Unicode.Scalar("A")!.value |
文字列操作
- はじめの i 文字、もしくは末尾のi文字を得る。
1 2 |
let s = str.prefix(i) let s = str.suffix(i) |
- 先頭から n 文字目
1 |
let s = str[str.index(str.startIndex, offsetBy: n - 1)] |
- 末尾の n 文字を切り落として新しいインスタンスを作る
1 |
let s = str.dropLast(n) |
- 文字列全てを小文字、あるいは大文字にする
1 2 3 4 5 |
// 全て小文字 s.lowercased() // 全て大文字 s.uppercased() |
- 文字列を任意の文字で分割する
1 2 3 4 5 6 7 |
// 区切りの候補が一つの場合 str.split(separator: " ") // 例えば、区切りの候補が複数ある場合 str.split(whereSeparator: { $0 == "/" || $0 == ":" }) // 複数の区切り文字を使うのであれば、こちらの方が分かりやすいかもしれない。 str.split(whereSeparator: { "/:".contains($0) }) |
- 文字列中の文字を入れ替える
- 一番最初に現れた文字列だけ入れ替え。
1 2 3 4 5 |
import Foundation if let r = s.range(of:"at") { s.replaceSubrange(r, with: "@") } |
-
- 文字列内で該当する文字全てを入れ替える場合。
1 2 3 4 5 6 7 8 9 |
import Foundation repeat { guard let r = s.range(of: "at") else { break } s.replaceSubrange(r, with: "@") } while true |
- ゼロサプレス
1 2 3 |
import Foundation print(String(format: "%03d", Int(readLine()!)!)) |
配列操作
- 配列の初期化
1 |
var ia = [Int](repeating: 0, count: 1000) |
- 連番の配列を作る
1 |
var ia = [Int](1..10) |
- 配列の n 番目に要素 t を挿入する
1 |
s.insert(t, at: n) |
- 配列に入れられた数値の総和を求める
1 2 3 4 |
ia.reduce(0) {$0 + $1} // あるいは、演算子だけ渡す(演算子も関数) ia.reduce(0, +) |
- 最大・最小値を求める
1 2 |
let max = ia.max()! let min = ia.min()! |
- 配列を逆順にする。求められる結果は ReversedCollection<T> なので、必要に応じて元の型のイニシャライザを使い、型変換を行う。
1 2 |
// 求められる結果は ReversedCollection<T> s.reversed() |
- 配列のインデックスと要素
1 2 3 4 |
for e in d.enumerated() { // e.element 要素 // e.offset インデックス } |
- ある配列 arrから、最初に現れた要素 sのインデックスを得る。戻り値はオプショナル型なので注意。
1 |
i = arr.firstInex(of: s) |
- 配列の最後の要素
1 2 |
// 調べる値 k を配列の最後から取得し、元の配列からは削除する var k = ia.removeLast() |
- 文字(文字列)の出力位置(要素番号)の取得
1 2 3 4 5 6 7 8 9 10 11 12 |
import Foundation // https://stackoverrun.com/ja/q/9520618 を改変 extension String { func encodedOffset(of character: Character) -> Int? { return firstIndex(of: character)?.utf16Offset(in: self) } func encodedOffset(of string: String) -> Int? { return range(of: string)?.lowerBound.utf16Offset(in: self) } } |
- ある配列が全て条件を満たしているかチェックする。
1 |
ia.allSatisfy { $0 % 2 == 0 } |
辞書の操作
- キー( key)が存在しない値の場合のデフォルト値を指定する
1 2 3 4 5 6 7 8 9 10 |
// words という辞書に対し、input で与えられた key が存在しない場合には // value の初期値を default で指定した値とした上で加算する words[input, default: 0] += 1 // 上記の操作は以下の操作と同じ if let _ = words[input] { words[input]! += 1 } else { words[input] = 1 } |
- 辞書に対して畳み込み演算を行う
1 2 3 4 |
words = "asfewfevsdfdcdsc" let count = words.reduce(into: [:]){ dict, word in dict[word, default: 0] += 1 } |
計算
- n 倍か否かのチェック。素数判定に使える。
1 |
num.isMultiple(of: n) |
頻出公式
- 閏年(うるうどし)の判定と曜日の判定(ツェラーの公式)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// 閏年だと true func isLeap(_ y: Int) -> Bool { if y % 400 == 0 || ( y % 100 != 100 && y % 4 == 0) { return true } else { return false } } // 日曜日を 0 として、以下 月 = 1, 火 = 2,.. と続く func dayOfWeek(_ y: Int, _ m: Int, _ d: Int) -> Int { var y = y, m = m if 1...2 ~= m { y -= 1 m += 12 } return ( y + y / 4 - y / 100 + y / 400 + (13 * m + 8) / 5 + d ) % 7 } |