Posted at

Swiftで競プロ入門

More than 3 years have passed since last update.

paiza プログラミングで彼女を作るがSwiftでかけると聞いたので、競プロ入門してみようかなと思い少しやってみました。(普段はアプリ開発ばかりなので、競技プログラミングは全然できません)

初心者なりに、Swiftだとこんな感じで書くのがSwiftっぽいかなっていうものや使えそうだなと思ったものを紹介したいと思います。


環境

Macがある人はplaygroundでコードを書くのがいいと思います。ただし、標準入力はplayground上で書くと他の計算が止まってしまうので、それだけは提出するものだけに書きましょう。

また、Web上でもplaygroundのようなことができるサイトもあるので、Macじゃない人やXcode入れたくない人はこれもアリかも


Swift入門

この記事では詳しくは書きません。Swiftの言語の入門はいろいろなサイトやドットインストールもありますし、qiitaにも記事があります。本やサイトを見てやる場合はSwiftのバージョンに気をつけましょう。また、Swiftはまだ大規模な変更を含むアップデートが行われたりするので、動かない部分は各自で調べる必要があります。


コード


標準入力

readLine()を使うことで1行ずつString?で取得することができます。この記事でもっと便利に使うやり方が紹介されていますね。

let input_line: String? = readLine()  // 標準入力

let string_value: String = input_value!
let int_value: Int = Int(input_line)!


標準出力

print("hoge")                           // "hoge\n"

print("hoge", "piyo") // "hoge piyo\n"
print("hoge", "piyo", separator: ",") // "hoge,piyo\n"

print("hoge", terminator: "") // "hoge" <- 改行なし
print("piyo") // "piyo\n"


結果

hoge

hoge piyo
hoge,piyo
hogepiyo


関数

普通に書けばいいです。

func pow(base: Int, count: Int) -> Int {

if count < 1 {
return 1
}
return base * pow(base, count: count-1)
}


ループ

いろいろあるので好きなものを使いましょう。

for i in 0..<4 {

print(i) // 0123 の4ループ
}

for _ in 0...5 {
// iは_で省略可 6ループ
}

let arr: [Int] = [4, 5, 6]
for i: Int in arr {
print(i) // 456
}

for (index, value) in arr.enumerate() {
print(index, ":", value) //0 : 4\n1 : 5\n2 : 6\n
}


extension

Swiftはクラスの拡張が簡単にできます。また、StringやIntといったものまで拡張することができます。

extension String {

...
}

これを利用することで便利なオレオレ関数やプロパティを生やすことができます。

extension String {

/// 任意のindexの1文字のStringを返す
func at(i: Int) -> String {
return String(self[self.startIndex.advancedBy(i)])
}

/// 任意のindexから任意の長さを切り取ったStringを返す
func between(i: Int, length: Int) -> String {
return self.substringWithRange(self.startIndex.advancedBy(i)..<self.startIndex.advancedBy(i + length))
}

/// 文字列の長さ(プロパティ)
var length: Int {
return self.characters.count
}

/// 文字列をIntの配列にする "01a234b" -> [0, 1, 2, 3, 4]
func splitToArrayOfInt() -> [Int] {
return self.characters.flatMap({Int(String($0))})
}
}


データ構造

stackやqueueなどの基礎的なものをジェネリクスを使って実装するやり方が公式に載っています。


まとめ

競プロに関しては、まだまだわからないことだらけですね。

swiftはextensionとmap,flatmap等をうまく使うことができればかなり書きやすいと思います。