2.4 演習:アルゴリズムを通してプログラミングに慣れる

ここでは,AtCoderと呼ばれる競技プログラミングのウェブサービスの問題を元に, いくつかアルゴリズムの実装をしてみましょう.なそ,AtCoderでは色々な言語による解答を提出することができますが,残念ながらR言語は対象外です. PythonやC++など他のプログラミング言語を使ってコードを書いてみたいという人は是非チャレンジしてみて欲しい.

問題に取り組むに当たり,Googleなどの検索サービスを使って調べることを推奨する. プログラミング言語においては,全ての機能や関数を網羅的に説明・把握・理解することは難しい. そのため,適宜必要な機能があるかを調査し,利用できる技術も非常に大切である.

これまで紹介したような手法を組み合わせればほとんど解答はできるはずだが, もっと良いやり方,簡単なやり方を探すのも良いだろう.

Exercise 2.4 (Distinct Integers) いくつかの整数がベクトルvの要素として与えられる.このベクトルには何種類の整数が含まれているのかを出力せよ.

例:c(1,2,3,4,4)ならば4種類なので4と出力する

v <- c(1,10,3,2,5,5,2)

Exercise 2.5 (Jogging) 高橋君と青木君はジョギングをすることにしました。 高橋君は「\(4\)秒間秒速\(3\)メートルで歩き、\(3\)秒間休む」ことを繰り返します。 青木君は「\(6\)秒間秒速\(2\)メートルで歩き、\(5\)秒間休む」ことを繰り返します。 二人が同時にジョギングを始めてから 10秒後、高橋君と青木君はそれぞれ何メートル進んでいるかを計算すせよ.

ヒント:休む時間をしっかりと考慮する必要があるのは,最後だけ.

Exercise 2.6 (じゃんけん) サーバル、フェネック、アライグマの 3 人がじゃんけんをして、あいこになりました。 フェネックが出した手を表す文字aとアライグマが出した手を表す文字bが与えられ,それぞれ0 はグー、1 はチョキを、2 はパーを表します。 サーバルが出した手を表す文字を出力してください。なお、答えは一意に定まります。

ここでは,関数janken(a,b)を実装してください.

# 入力例
janken(0, 1)

Exercise 2.7 (Edge checker) 下の画像で示す図において,a番とb番の点を直接結ぶ線が存在するか判定する関数edgeChecker(a,b)を実装せよ.a,bは整数として与えら得る.出力は,存在すればTRUE,存在しなければFALSEとする.

# 入力例
edgeChecker(1, 3) # 結ばれていないのでFALSE

Exercise 2.8 (Tires) 末尾がerまたはistであるような文字列\(S\)が与えられたとき, \(S\)の末尾がerである場合はerを、istである場合はistを出力する関数tires(S)を実装せよ.

# 入力例
tires(S)

Exercise 2.9 (Next alphabet) zでない英小文字\(C\)が与えられます。アルファベット順で\(C\)の次の文字を出力する関数next_alphabet(C)を実装してください.

# 入力例
next_alphabet('a') # 答えは b

Exercise 2.10 (Weather Prediction) 高橋君の住む町の天気は、一日ごとに晴れ(Sunny)、くもり(Cloudy)、雨(Rainy)、晴れ、くもり、雨、… と周期的に変化します。 今日の天気を表す文字列\(S\)が与えられるので、明日の天気を予測する関数weather_prediction(S)を実装してください.

weather_prediction("Cloudy") # 答えは"Rainy"

Exercise 2.11 (Around square) \(N\)以下の平方数のうち、最大のものを求めて出力する関数around_square(N)を実装せよ.。 ただし、平方数とは、ある整数の2乗として表せる整数のことを指す.

# 入力例
around_square(10) # 出力:9