回答編集履歴

1

refactor

2018/08/06 14:27

投稿

papinianus
papinianus

スコア12705

test CHANGED
@@ -2,38 +2,36 @@
2
2
 
3
3
 
4
4
 
5
- 100を百にしようと思うと大変だけど、一〇〇でいいなら、Linqでワンライナー
5
+ 100を百にしようと思うと大変だけど、一〇〇でいいなら、Linqで。
6
-
7
- 漢数字をlist(配列とかList)でもつか、map(Dictinary)でもつか2パターン
8
-
9
- 引数を数字と見るか、文字列と見るかで2パターン
10
-
11
- (さらに書きませんでしたが文字列の場合、数値だけを抜き出しておきかえる、というパターンもあり得るが、Where(char.isDigit)をSelectの前に入れればいいので)
12
-
13
- C#でこの程度で10回if書いてたら話になりません。
14
6
 
15
7
 
16
8
 
17
9
  ```csharp
18
10
 
19
- static string ConvertToKansuji(int n)
11
+ static string ConvertToKansuji(int n) => string.Concat(EnumerateDigits(n).Select(i => ToKansujiOnBaseByString(i)).Reverse());
20
12
 
21
- {
13
+ static string ConvertToKansuji(string str, bool onlyDigits = false) => string.Concat(str.ToCharArray().Where(c => !onlyDigits || char.IsDigit(c)).Select(c => char.IsDigit(c) ? ToKansujiOnBaseByDictionary(c) : $"{c}"));
22
14
 
23
- var kansuji = new[] { "〇", "一", "二", "三", "四", "五", "六", "七", "八", "九", };
15
+ static IEnumerable<int> EnumerateDigits(int n, int unit = 10)
24
16
 
25
- return string.Concat(n.ToString().ToCharArray().Select(digit => kansuji[(int)char.GetNumericValue(digit)]));
17
+ {
26
18
 
27
- }
19
+ while (n >= unit)
28
20
 
29
- static string ConvertToKansuji(string str)
21
+ {
30
22
 
31
- {
23
+ yield return n % unit;
32
24
 
33
- var kansuji = new Dictionary<char, string> { { '0', "〇" }, { '1', "一" }, { '2', "二" }, { '3', "三" }, { '4', "四" }, { '5', "五" }, { '6', "六" }, { '7', "七" }, { '8', "八" }, { '9', "九" }, };
25
+ n = n / unit;
34
26
 
35
- return string.Concat(str.ToCharArray().Select(c => char.IsDigit(c) ? kansuji[c] : c.ToString()));
27
+ }
36
28
 
37
- }
29
+ }
30
+
31
+ static string ToKansujiOnBaseByString(int n, int unit = 10) => unit > 10 || n >= unit ? throw new InvalidOperationException("illegal") : $"{"〇一二三四五六七八九"[n]}";
32
+
33
+ static string ToKansujiOnBaseByArray(int n, int unit = 10) => unit > 10 || n >= unit ? throw new InvalidOperationException("illegal") : (new[] { "〇", "一", "二", "三", "四", "五", "六", "七", "八", "九", })[n];
34
+
35
+ static string ToKansujiOnBaseByDictionary(char n, int unit = 10) => unit > 10 || !char.IsDigit(n) || (int)char.GetNumericValue(n) >= unit ? throw new InvalidOperationException("illegal") : (new Dictionary<char, string> { { '0', "〇" }, { '1', "一" }, { '2', "二" }, { '3', "三" }, { '4', "四" }, { '5', "五" }, { '6', "六" }, { '7', "七" }, { '8', "八" }, { '9', "九" }, })[n];
38
36
 
39
37
  ```