回答編集履歴
2
さらに短い式に修正
test
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
遅刻した……。
|
2
2
|
|
3
|
-
C#でLINQを使う例。
|
3
|
+
C#でLINQを使う例(をさらに短くした)。
|
4
4
|
|
5
5
|
|
6
6
|
|
@@ -10,9 +10,7 @@
|
|
10
10
|
|
11
11
|
while (target.Length > 1) {
|
12
12
|
|
13
|
-
target = target.Take(target.Length - 1).Zip(target.Skip(1),
|
14
|
-
|
15
|
-
|
13
|
+
target = target.Skip(1).Zip(target, (x, y) => (x + y) / 2).ToArray();
|
16
14
|
|
17
15
|
}
|
18
16
|
|
@@ -25,3 +23,5 @@
|
|
25
23
|
補足: 毎回の処理で、「配列の先頭から末尾のひとつ手前までの要素」のスライスと、「配列の2番目から末尾までの要素」のスライスがそれぞれ得られれば、それらをZipして「対応する2つの要素の値を足して2で割る」という処理に単純化できる。
|
26
24
|
|
27
25
|
「配列の先頭から末尾のひとつ手前までの要素」のスライスは、Takeによる個数の指定、「配列の2番目から末尾までの要素」のスライスは、Skipによる読み飛ばしで実現可能なので、LINQのメソッドチェーンで処理が完了する。
|
26
|
+
|
27
|
+
修正: さらに、LINQのZipは、「シーケンスの要素の少ない方の分だけ処理する(はみでた要素は処理されない)」という仕様なので、Takeを省略してさらに短く書くことができる。
|
1
補足を追加
test
CHANGED
@@ -19,3 +19,9 @@
|
|
19
19
|
Console.WriteLine(target[0]);
|
20
20
|
|
21
21
|
```
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
補足: 毎回の処理で、「配列の先頭から末尾のひとつ手前までの要素」のスライスと、「配列の2番目から末尾までの要素」のスライスがそれぞれ得られれば、それらをZipして「対応する2つの要素の値を足して2で割る」という処理に単純化できる。
|
26
|
+
|
27
|
+
「配列の先頭から末尾のひとつ手前までの要素」のスライスは、Takeによる個数の指定、「配列の2番目から末尾までの要素」のスライスは、Skipによる読み飛ばしで実現可能なので、LINQのメソッドチェーンで処理が完了する。
|