Naomi's notebook

Naomi's notebook

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くらいからの方が圧倒的に書きやすそうで辛かった。終わり。

またリハビリする必要が生じてきたら続きをやります。(言語募集中)