##背景
普段Swift使ってアプリを開発していますが、
「paizaをSランクにしておくといいかも」との助言もあり、ついこの間paizaをやりはじめてみました。
普段使わない文法で慣れていなかったり、そもそもコードのバージョンが古いサイトもあったので、自分用に「paizaでよく使う文法」をまとめました。
参考にどうぞ。
##よく使うコード
###標準入力
//1行取得 例:1
let input_line = readLine()!
//複数行
let input_line1 = readLine()!
let input_line2 = readLine()!
let input_line3 = readLine()!
//複数行
var strs = [String]()
for _ in 0..<8 {
strs.append(readLine()!)
}
//複数行
while let line = readLine() {
// 入力された行に対する処理
}
※7/4追記
コメント欄で以下の方法を教えていただきました。ありがとうございます。
//複数行取得
let s = AnyIterator { readLine() }.joined()
//配列で取得(くそ便利)
let arr = Array(AnyIterator { readLine() })
###文字列の処理
//例: 1 3 5 7 → ["1","3","5","7"]
let strs = input_line.split(separator:" ")
//例: 16357 → ["1","6","3","5","7"]
let strs = input_line.map{String($0)}
//例: ["1","3","5","7"] → [1,3,5,7]
let numbers = strs.map({Int($0)!})
補足:「標準入力〜文字列の処理」をこんな関数にしてやると便利かも
func readInts() -> [Int] {
return readLine()!.split(separator: " ").map { Int($0)! }
}
さて、続き。
let s = "ぎょうざたべたい"
//前から◯文字取得
s.prefix(3) //ぎょう
//後ろから◯文字取得
s.suffix(2) //たい
//◯文字切り捨て
s.dropLast(2) //ぎょうざたべ
//文字列切り出し m文字目〜n文字目
let i1 = s.index(s.startIndex, offsetBy: 3)
let i2 = s.index(s.startIndex, offsetBy: 6)
s[i1...i2] //ざたべた
s[i1..<i2] //ざたべ
//文字列結合
let s1 = "はら"
let s2 = "へった"
s1 + s2 //はらへった
let array = ["はら","へった"]
array.joined() //はらへった
array.joined(separator:" ") //はら へった
array.joined(separator:",") //はら,へった
//文字列に文字が含まれるか
let s = "はろーSwift"
if s.contains("は"){
print("OK")
}
//文字列の一部を置き換え
var s = "はじめましてこんにちは"
if let range = s.range(of:"こんにちは"){
s.replaceSubrange(range, with: "さようなら") //はじめましてさようなら
}
//大文字・小文字
let a = "swift".uppercased()
let b = "SWIFT".lowercased()
//ある文字列をn個繰り返す
let s = String(repeating: "AB", count: 5)
// "ABABABABAB"
###配列初期化
var a = [String]()
var b = [[String]]()
b.append(["はじ","めまして"])
###配列並び替え
var array = [5,2,6,7,1]
array.sort{$0 < $1} //昇順 [1,2,5,6,7]
array.sort{$0 > $1} //降順 [7,6,5,2,1]
array.reversed() //逆順 [1,7,6,2,5]
・sort()は配列を書き換える
・sorted()は配列を書き換えない
###配列絞り込み
//例:3で割り切れるもののみからなる配列に
let array = [5,2,6,3,1]
array.filter({$0 % 3 == 0}) //[6,3]
###配列結合
let arr1 = [5,2,6]
let arr2 = [3,1]
arr1 + arr2 //[5,2,6,3,1]
//配列に要素を追加
let arr = ["a", "b", "c", "e"]
arr.insert("d", at: 3) //["a", "b", "c", "d", "e"]
//配列末尾に要素を追加
arr.append("←") //["a", "b", "c", "e", "f"]
###配列の要素の合計値
let array = [1, 2, 3, 4, 5]
let result = array.reduce(0) { $0 + $1 } //15
このコードだとreduce()の良さが出てない気もしますが。。。
###配列の全要素が条件を満たすかどうか
//全ての要素が偶数かどうか
let values = [2, 4, 6, 8]
//contains()
let isAllEven = !values.contains { !($0 % 2 == 0) }
//allSatisfy()
let isAllEven = values.allSatisfy { $0 % 2 == 0 }
allSatisfy()の方が可読性が高いですね。Swift 4.2でSequenceに追加されたメソッドです。
###配列のindexを取得
let scores = [8, 6, 1, 62 ,90]
//enumerated()
for (index, score) in scores.enumerated() {
print("\(index): \(score)")
}
//index(of: )
if let index = scores.index(of: 90) {
print("index: \(index)")
}
//index(where: )
if let index = scores.index(where: {$0 == 90}) {
print("index: \(index)")
}
enumerated()ですが、インデックスと要素のタプルを返します。
###配列をユニークに
let array = [3, 4, 2, 2, 1, 5, 1, 3, 4]
let result = array.reduce([], { $0.contains($1) ? $0 : $0 + [$1] })
// [1, 2, 3, 4, 5]
三項演算子を使って書いています。
[]に要素をわんこそばのように追加していくイメージです
###絶対値
let a = abs(-6) //6
###累乗
let a = pow(5.0, 3)
###◯進数
let a = 44
let str2 = String(num, radix: 2)
let str16 = String(num, radix: 16)
//2進数を10進数に
let int = Int("110110", radix: 2)
###最大、最小
max(1,5,2) //5
min(1,5,2) //2
let h = [65.7, 64.3, 61.1, 67.5, 58.5, 60.3, 64.9]
let max = h.max() //67.5
let min = h.min() //58.5
###倍数
//2の倍数か?
let a = 18
a.isMultiple(of: 2) //true
###小数点以下切り捨て・切り上げ・四捨五入
let a = 3.1
floor(a) //切り捨て 3.0
ceil(a) //切り上げ 4.0
round(a) //四捨五入 3.0
//小数点をずらして整数値に
let b = a * 10
floor(b) / 10 //切り捨て 3
ceil(b) / 10 //切り上げ 4
round(b) / 10 //四捨五入 3
###0埋めする format指定
let num1 = String(format: "%04d", 9) //0009
let num2 = String(format: "%0.3f", 0.2) // 0.200
##終わりに
「他にもこれよく使うよ」という文法があったらコメントで教えてくれると喜びます(笑)
一緒にpaizaランクSを目指しましょう!