このページについて
このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。
見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。
挑戦する課題
レベルアップ問題集の文字列処理メニューから「数値判定 (paizaランク C 相当)」を取り上げます。
以下は、問題公開 Web ページからの引用です。
問題
文字列 S が与えられるので、 S を整数に変換できる場合には “YES” , そうでない場合は “NO” を出力してください。
なお、文字列 S を数値に変換できるとは、S の全ての文字が { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } のいずれかであることをいいます。
入力される値
1 |
S |
- 文字列 S が 1 行で与えられます。
期待する出力
S を数値に変換できる場合には "YES" , そうでない場合は "NO" を 1 行で出力してください。条件
- 1 ≦ | S| ≦ 10000 ( | S| は、 S の文字数です。)
- S の各文字は数字またはアルファベットの大文字です。
考え方
64bit の範囲内で計算できる数値であれば、入力された文字列が
Int に変換できるか(イニシャライザが失敗するか否か)で簡単に判断することができるが、今回与えられた条件を見ると、与えられる数値(としての文字列)の桁数は 10,000 桁である。
したがって、
Int 型として処理することはできない。
ここでは、与えられた文字列を逐次判別し、一つでも数値、つまり 0 - 9 の以外の文字が存在すれば、それは数値ではないと判断することで処理を行う。
含まれる文字の判定式を独自に作るため、ここでは contains(where:) を使い、クロージャで条件式を記述している。
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 |
let s = readLine()! var flag = true for ss in s { // ss は String.Element 型なので、一度 String に変換する if !String(ss).contains {"0123456789".contains($0)} { // 数値以外の文字が渡されたら処理を中断 flag = false break } } // 結果表示 print(flag ? "YES" : "NO") |
1 2 3 4 5 6 7 8 9 10 11 |
var flag = true readLine()!.lazy.forEach { s in if !String(s).contains { t in "0123456789".contains(t) } { flag = false } } print(flag ? "YES" : "NO") |