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