このページについて
このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。
見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。
挑戦する課題
レベルアップ問題集の文字列処理メニューから「日時データの変換その1 (paizaランク C 相当)」を取り上げます。
以下は、問題公開 Web ページからの引用です。
問題
日時が “yyyy/MM/dd/hh:mm” の形式で与えられるので、年・月・日・時・分をそれぞれ出力してください。
入力される値
1 |
yyyy/MM/dd/hh:mm |
- 日時を表す文字列が 1 行で与えられます。
- yyyy は 4 桁で西暦年を表します。 4 桁未満の場合の上位桁は となります。例) 0734, 0021
- MM は 2 桁で月を表します。2 桁未満の場合の上位桁は となります。例) 09
- dd は 2 桁で日にちを表します。2 桁未満の場合の上位桁は となります。例) 02
- hh は 2 桁で時を表します。2 桁未満の場合の上位桁は となります。例) 07
- mm は 2 桁で分を表します。2 桁未満の場合の上位桁は となります。例) 01
期待する出力
5 行で年・月・日・時・分を順に出力してください。
1 2 3 4 5 |
yyyy MM dd hh mm |
考え方
与えられる文字列は、 "/" および ":" で区切られているので、一連の文字列をこれらの文字を区切り文字として分割すれば良い。
split(separator:) を使うのであれば、1度目は "/" で区切り、最後残った部分(時刻の部分)だけ ":" で区切りなおす。一方、 String には別のメソッド split(whereSeparator:) があり、このメソッドを使うと複数の区切り文字を指定でき、一回の処理で終わらせることも可能である。
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// まず "/" で区切る let sa = readLine()!.split(separator: "/").map{ String($0) } // 時刻の部分だけ ":" で区切り直す let hm = sa[3].split(separator: ":").map{ String($0) } // 出力 for i in 0..<3 { print(sa[i]) } for i in 0..<2 { print(hm[i]) } |
1 |
readLine()!.split(whereSeparator: { $0 == "/" || $0 == ":" }).forEach{ print(String($0)) } |
あるいは、区切り文字の候補に分割された文字が含まれるか否かで処理する方法もある。
1 |
readLine()!.split(whereSeparator: { "/:".contains($0)}).forEach{ print(String($0)) } |