このページについて
このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。
見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。
挑戦する課題
レベルアップ問題集の文字列処理メニューから「表記の訂正 (paizaランク C 相当)」を取り上げます。
以下は、問題公開 Web ページからの引用です。
問題
paiza 研究所では実験データをわかりやすい形式で保存したいのですが、
機械によって得られる数値には、次のような表記ミスがあることがわかっています。
- ミス 1
先頭に必要のない 0 がいくつかついてしまう- 本来 1 である数値が 0001 と表記されてしまう
- 本来 0.001 である数値が 00.001 と表記されてしまう
- ミス 2
小数である数値の末尾に必要のない 0 がいくつかついてしまう- 本来 0.1 である数値が 0.10 と表記されてしまう
- ミス 3
小数である数値に小数点が複数個ついてしまう
ただし、 1 つめの小数点の位置がが正しい小数点の位置であるものとします- 本来 0.123 である数値が 0.1.2.3 と表記されてしまう。
表記が正しくない可能性のある数値を表す文字列 S が与えられるので、その数値を正しい表記にしてください。
S を数値として扱うと上手く処理が行えないので気をつけてください。
入力される値
1 |
S |
- 文字列 S が 1 行で与えられます。
期待する出力
S を正しい表記にしたものを 1 行で出力してください。条件
- 1 ≦ | S| ≦ 10000 ( | S| は、 S の文字数です。)
- ミス 2 , 3 は小数の場合のみ起こる
- 答えが .0 の形式になるような値は与えられません
- S は 0 以上の数値を表す文字列
考え方
執筆中。
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
import Foundation // https://stackoverrun.com/ja/q/9520618 を改変 extension String { func encodedOffset(of character: Character) -> Int? { return firstIndex(of: character)?.utf16Offset(in: self) } func encodedOffset(of string: String) -> Int? { return range(of: string)?.lowerBound.utf16Offset(in: self) } } // 文字列先頭のゼロの数をカウントする func countZero(_ s: String) -> Int { var index = 0 for ss in s { // 0以外の文字が出てくるまで検索 if String(ss).contains(where: { "123456789".contains($0)} ) { return index } index += 1 } return index } // 一行読み込む var s = readLine()! //var s = "00001928.11.000.6790.01930" //var s = "00001928.11000679001930" //var s = "00.00001000000" // 小数の判定 if s.contains(".") { // 小数点を一つにする let ss = s.split(separator: ".") s = ss[0] + "." + ss[1..<ss.count].map { String($0) }.joined() // 末尾の余計なゼロを消す // 文字列を反転させ、先頭のゼロをカウントし、その数の分だけ末尾のゼロを消す let rs = String(s.reversed()) let index = countZero(rs) s = String(s.dropLast(index)) } // ゼロサプレス var index = 0 index = countZero(s) // 小数点を含む場合、先頭のゼロと小数点のどちらが最初に来るか判定 if let fpoint = s.encodedOffset(of: ".") { if fpoint < index { index = fpoint - 1 } } // 先頭のゼロを消す s = String(s.dropFirst(index)) print(s) |