このページについて
このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。
見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。
挑戦する課題
レベルアップ問題集の戦セットから「【競技4】明日天気にな〜れ! (paizaランク D 相当)」を取り上げます。
以下は、問題公開 Web ページからの引用です。
問題
この問題は、弊社営業社員が競技プログラミングに挑戦したものです。
明日からn日分の天気を占うために「明日天気にな〜れ」をすることにしました。
足に履いている靴の片方を蹴り上げて、靴が表向きだったら「晴れ」、裏向きだったら「雨」、横向きだったら「曇り」であるとします。
靴を蹴り上げた後の向きがn個入力されるので、n日分の天気占いの結果を出力してください。
入力される値
入力は以下のフォーマットで与えられます
1 2 3 4 5 |
n d_1 d_2 ... d_n |
- 入力される文字列数n
- d_1, d_2, …, d_n は forward または reverse または sideways
- 入力はn + 1行となり、末尾に改行を一つ含みます。
期待する出力
i行目に入力値d_iが、
- forward のとき Sunny
- reverse のとき Rainy
- sideways のとき Cloudy
を出力してください。
考え方
入力値を逐一比較しても構わないが、犯したくないのは文字列の間違い。入力判断用の文字列もだが、出力用の文字列も1文字でも違えば間違いなので、なるべく問題からコピーして使いたいところ。
やり方は色々あると思われるが、ここでは Dictionary と AnyIterator 、それに map を組み合わせ、条件判断させることなく出力させることにした。
また、 AnyIterator を使えば、入力文字列の行数をカウントする必要はないため、一行目は読み飛ばすことにする。
注意しなければならないのは、 Dictionary の出力がオプショナル型となること。アンラップしなければ出力に余計な文字列( Optional())がつくので注意。
解答例
1 2 3 |
let w = ["forward":"Sunny", "reverse":"Rainy", "sideways":"Cloudy"] _ = Int(readLine()!)! _ = Array(AnyIterator { readLine() }).map { print(w[$0]!) } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
_ = Int(readLine()!)! let sa = Array(AnyIterator { readLine() }) var w = "" for s in sa { switch s { case "forward": w = "Sunny" case "reverse": w = "Rainy" default: w = "Cloudy" } print(w) } |