AtCoder Beginners Selection in Swift
最近は何もやっていませんでした。(この場をお借りして関係者の方々にお詫びをしておきます…申し訳ありませんでした。)
それは置いておくとして、Swiftをやらないかと誘われたのでとりあえずリハビリがてらABSしておきます。
過去の記事
naomi-notebook.hatenablog.com
naomi-notebook.hatenablog.com
naomi-notebook.hatenablog.com
naomi-notebook.hatenablog.com
naomi-notebook.hatenablog.com
naomi-notebook.hatenablog.com
naomi-notebook.hatenablog.com
参考にしたもの
https://developer.apple.com/documentation/swift
あとは適当にググったりしました
PracticeA Welcome to AtCoder
Swiftのバージョンが2なんですが、3とか4とかの方が参照できるものが多いような気がする…
import Foundation var input_line: String = readLine()! let a = Int(input_line)! input_line = readLine()! let bc: [String] = input_line.characters.split(" ").map{String($0)} let b = Int(bc[0])! let c = Int(bc[1])! let s: String = readLine()! print(a+b+c,s)
ABC086A Product
https://developer.apple.com/documentation/swift/string
https://developer.apple.com/documentation/swift/array
ここら辺を見つつ…
import Foundation var inputs: [Int] = readLine()!.characters.split(" ").map{Int(String($0))!} if inputs.reduce(1,combine:*)%2==1 {print("Odd")} else{print("Even")}
ABC081A Placing Marbles
import Foundation var inputs: [Int] = readLine()!.characters.map{Int(String($0))!} print(inputs.reduce(0,combine:+))
ABC081B Shift only
allSatisfy( https://developer.apple.com/documentation/swift/array/2994715-allsatisfy )使おうとしたら4.2から?らしい(泣いちゃった)
import Foundation var inp : Int = Int(readLine()!)! var inputs: [Int] = readLine()!.characters.split(" ").map{Int(String($0))!} var count=0 while inputs.filter({$0%2==0}).count==inp { inputs=inputs.map{$0/2} count+=1; } print(count)
ABC087B Coins
ぐちょく!
import Foundation var A : Int = Int(readLine()!)! var B : Int = Int(readLine()!)! var C : Int = Int(readLine()!)! var X : Int = Int(readLine()!)! var count=0 for i in 0...A{for j in 0...B{for k in 0...C{ if 500*i+100*j+50*k==X {count+=1} }}} print(count)
ABC083B Some Sums
Rustの時みたいな感じにしようかと思ったけど結構めんどくさそうだったので愚直に
import Foundation var inputs: [Int] = readLine()!.characters.split(" ").map{Int(String($0))!} var N=inputs[0] var A=inputs[1] var B=inputs[2] var count=0 for i in 1...N{ var digs=0 var j=i while j>0{ digs+=j%10 j/=10 } if digs>=A&&digs<=B {count+=i} } print(count)
ABC088B Card Game for Two
sort->enumerate->偶奇でfiltering->それぞれreduce(+)->引き算
みたいなことがやりたいね〜
とか思ったけど、sort->abs(reduce(-$0+$1))みたいな手法があったのを思い出した、できるだろうか
https://developer.apple.com/documentation/swift/array/2298686-reduce
reduceのページを見る。
できた。
import Foundation var inp = readLine()! var inputs: [Int] = readLine()!.characters.split(" ").map{Int(String($0))!} print(abs(inputs.sort().reduce(0,combine:{ n,m in -n+m}) ))
ABC085B Kagami Mochi
同じのを取り除いて数を数えるだけ。
unique的なのあるの…?調べたらないみたい、ですがSetがあるようです。…なぜか
https://developer.apple.com/documentation/swiftのArray,Dictionaryの下にないのでビビったけど…?
https://developer.apple.com/documentation/swift/set
import Foundation var N = Int(readLine()!)! var mochi = Set<Int>() for i in 1...N{ mochi.insert(Int(readLine()!)!) } print(mochi.count)
(Set楽だけど他の言語で使ったっけ…)
ABC085C Otoshidama
ラベルを使って多重ループから一気に抜けられるらしい。
import Foundation let inputs = readLine()!.characters.split(" ").map{Int(String($0))!} let N = inputs[0] let Y = inputs[1]/1000 for_1:for i in 0...N{ for j in 0...(N-i){ if i*10+j*5+(N-i-j)==Y { print(i,j,N-i-j) break for_1 }else if i==N{ print(-1,-1,-1) } } } }
ABC049C 白昼夢 / Daydream
https://developer.apple.com/documentation/foundation/nsregularexpression
なんかめんどくさそう
swift2.2だとnumberOfMatchesが存在しなさそう(value of type 'NSRegularExpression' has no member 'numberOfMatches')
あとString.lengthがあるのは(StringがCollectionに適合したのは)4からなので、charactersからcountしないといけない(splitの時に困るのと同じ)
…と思ったら、多分AtCoder上ではNSRegularExpressionが使えなさそうですね、ひえ(これはObjective-Cだけど多分似たような感じ Objective-C で AtCoder に参加する際の苦労 - Qiita
)
…再帰の練習するか〜!
→TLE(そんな遅かったっけ?)
import Foundation let input = readLine()! let pattern = "^(erase|eraser|dream|dreamer)+$" func check_input(s:String) -> Bool { if s.characters.count==0 {return true} else if s.hasPrefix("erasera") {return check_input(String(s.characters.dropFirst(5)))} else if s.hasPrefix("dreamera"){return check_input(String(s.characters.dropFirst(5)))} else if s.hasPrefix("eraser") {return check_input(String(s.characters.dropFirst(6)))} else if s.hasPrefix("dreamer") {return check_input(String(s.characters.dropFirst(7)))} else if s.hasPrefix("erase") {return check_input(String(s.characters.dropFirst(5)))} else if s.hasPrefix("dream") {return check_input(String(s.characters.dropFirst(5)))} else {return false} } if check_input(input)==true {print("YES")} else {print("NO")}
じゃあ後ろからマッチさせていく解法やるか…
import Foundation var input = readLine()! var s = Array(input.characters.reverse()) let patterns=["maerd","remaerd","esare","resare"].map{Array($0.characters)} var p=0 while p<s.count { var ifmatchedany=false for pattern in patterns { var matchcount=0 for c in 0..<pattern.count { if s[p+c]==pattern[c]{ matchcount+=1 }else{ break } } if matchcount==pattern.count{ ifmatchedany=true p+=pattern.count break } } if !ifmatchedany {print("NO");break} else if(p==s.count){print("YES");break} }
ちなみにこれはplayground上で動くやつ
import Foundation let input = "dreamers" let pattern : String = "^(erase|eraser|dream|dreamer)+$" let re = try! NSRegularExpression( pattern: pattern, options:NSRegularExpression.Options.caseInsensitive ) let matches = re.matches( in:input, options:[], range:NSMakeRange(0,input.count)) if matches.count>0 { print("Yes")} else {print("No")}
ABC086C Traveling
reduceできるんだっけ〜と思ったけど入力がめんどくさいから普通にやります
iimport Foundation let N = Int(readLine()!)! var t=0;var x=0;var y=0 for i in 0..<N{ let txy=readLine()!.characters.split(" ").map{Int(String($0))!} let d=abs(txy[1]-x)+abs(txy[2]-y) if txy[0]-t-d<0 || (txy[0]-t-d)%2>0 {print("No");break;} else if i==(N-1) {print("Yes");break} t=txy[0];x=txy[1];y=txy[2] }
感想
結構描きやすい部類の言語だと思いました。今までやった中だとRustにちょっと似ていると感じました。Objective-Cとの相互運用性を重視しているらしいのでObjective-Cとすごく似てるんだろうけど、やった事がない。あと、プロトコルがHaskellの型クラスと似てるのかな?(ABS解いただけなのでそういうところまで詳しく見ていないですが…)
Swift4くらいからの方が圧倒的に書きやすそうで辛かった。終わり。
またリハビリする必要が生じてきたら続きをやります。(言語募集中)