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