回答編集履歴
1
refactor
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
|
-
|
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
|
-
|
15
|
+
static IEnumerable<int> EnumerateDigits(int n, int unit = 10)
|
24
16
|
|
25
|
-
|
17
|
+
{
|
26
18
|
|
27
|
-
|
19
|
+
while (n >= unit)
|
28
20
|
|
29
|
-
|
21
|
+
{
|
30
22
|
|
31
|
-
|
23
|
+
yield return n % unit;
|
32
24
|
|
33
|
-
|
25
|
+
n = n / unit;
|
34
26
|
|
35
|
-
|
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
|
```
|