突然ですがSwiftというプログラミング言語を聞いたことはありますか?
Wikiさんは次のように発言しています。
Swift(スウィフト)は、AppleのiOSおよびmacOS、Linux、Windowsで利用出来るプログラミング言語である。
なにやらアップル系のアプリ開発などで使われる言語の1つらしいです。今回はこのSwiftでAtcoderの問題を解くことで基本的な使い方について学ぼうと思いブログを書くことにしました。
問題を解く前に入力の受け取り方と出し方、その他基本文法について確認しておきましょう。先ず標準入力は以下のように書きます。
let Line = readLine()!
ここでreadLine()とは一行を文字として受け取ることを意味しています。もし整数型で受け取りたい場合はIntでくくればいいみたいです。
次に数字を複数受け取る(配列)場合です。以下のように書きます。
let numbers = readLine()!.split(separator:" ").map {Int(String($0))!}
とても簡単ですね。空白区切りで受け取るという命令とInt型で受け取るという命令を追加すればいいみたいです。
次は値を出力してみましょう。
let n = 2
print("Yes")
print(1,n)
#Yes
#1 n
何やらPythonにとても似ていますね。カンマで半角スペースが入るところも全く一緒です。これで入出力の基本的な書き方はマスターできたので次にFor文の書き方について確認しましょう。
let n = Int(readLine()!)!
var sum = 0
for i in 0..<n{
sum += i
}
print(sum)
For文はA~BまでというところをA..<Bと書くみたいですね。あと{}でくくらないといけない事も忘れないようにしないといけません。ちなみにsumの前に書いているvarとはvariableの略で変数、letは定数の様です。
最後にIf文の確認です。
let n = 10
if n < 0{
print("Yes")
}
else{
print("No")
}
#No
とても直観的でわかりやすいですね。ちなみに上のコードの意味はnの値が0未満だったらYesを、それ以外だったらNoを出力するという意味です。これで基本的な使い方が分かったと思います。それでは実際に問題を解いていきましょう。
AtCoder Beginners Selectionを解く
AtCoder Beginners Selectionとは初心者のための問題集です。全部で11問あり後半になるほど難しくなるので今回は最初の3問だけ解いてみます。
第1問 ABC086A – Product
問題文
シカのAtCoDeerくんは二つの正整数a, bを見つけました。aとbの積が偶数か奇数か判定してください。
制約
- 1 < a, b < 10000
- a, bは整数
入力
a b
出力
積が奇数ならOddと、偶数ならEvenと出力せよ。
解答
let ab = readLine()!.split(separator:" ").map {Int(String($0))!}
print((ab[0] * ab[1]).isMultiple(of: 2) ? "Even" : "Odd")
シンプルに2行で書けます。最初の行はaとbの値をそれぞれabという配列の形で受け取っています。そしてab[0](a)とab[1](b)の掛算に対してそれが何の倍数かという判定をisMultiple(of : )で行っています。今回は2の倍数であれば”Even” それ以外は”Odd”を出力するという書き方をしています。
第2問 ABC081A – Placing Marbles
問題文
すぬけ君は 1, 2, 3 の番号がついた 3 つのマスからなるマス目を持っています。 各マスには 0 か 1 が書かれており、マス i には\(s_i\)が書かれています。すぬけ君は 1 が書かれたマスにビー玉を置きます。 ビー玉が置かれるマスがいくつあるか求めてください。
制約
- \(s_1\),\(s_2\),\(s_3\)は
1
あるいは0
入力
s1s2s3
出力
答えを出力せよ。
解答
let s = readLine()!
var sum = 0
for i in s{
sum += Int(String(i))!
}
print(sum)
まず文字としてsを読み込みます。そして各桁が0か1なので各桁の数字を足していけば答えを得ることができます。具体的にFor文内で文字列sの中の各文字(101の場合”1″ , “0”, “1”)がそれぞれ変数iに渡されます。これをsumに加算していけばよいです。注意が必要な点は文字として受け取ったのでsumに加算するときに整数型になおさないといけません。最後にsumを出力しておわりです。
問題3 ABC081B – Shift only
問題文
黒板にN個の正の整数 \(A_1\), … ,\(A_N\)が書かれています.
すぬけ君は,黒板に書かれている整数がすべて偶数であるとき,次の操作を行うことができます.
- 黒板に書かれている整数すべてを, 2で割ったものに置き換える
すぬけ君は最大で何回操作を行うことができるかを求めてください.
制約
- 1 < N < 200
- 1 < \(A_i\) < \(10^3\)
入力
入力は以下の形式で標準入力から与えられる。
N
A1 A2 ... AN
出力
let n = Int(readLine()!)!
var a = readLine()!.split(separator:" ").map {Int(String($0))!}
var count = 0
var check = false
while true{
for i in 0..<n{
if !(a[i]).isMultiple(of: 2){
check = true
break
}
a[i]/=2
}
if check{
break
}
count += 1
}
print(count)
まずNとAをそれぞれ整数型と配列で受け取ります。そして今回はWhile文という条件を満たす限り実行し続けるという意味のコードを書きます(今回の条件:trueとはとりあえず計算し続けてWhileの中身に条件を書くという感じです)。具体的には配列Aのそれぞれの値に対して2で割り切れるか判定して割り切れない場合はcheckという変数にtrueというブール値を返しています。
そしてもしcheckがtrue(割り切れない数があった)場合にはその下のif checkというところで全体のWhile文を抜け出します。
また、全て割り切れる場合は2で割るという操作と割れる回数を数え上げるという操作をそれぞれa[i]/=2(a[i]=a[i] / 2 : 2で割った値を代入するということ)とcount += 1(count = count + 1)という風に書いています。
今回はじめてSwiftに触れてみて感じたことは所々PythonやCの書き方に似ているということです。個人的にはCよりわかりやすく、isMultipleなどの便利な機能があることに驚きました。Apple系のアプリ開発を行う人は基本文法を身に着ける際にAtcoderで練習してみてもいいかもしれません。