回答編集履歴

2

さらに短い式に修正

2020/11/29 04:16

投稿

Daregada
Daregada

スコア11990

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
- (x, y) => (x + y) / 2).ToArray();
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

補足を追加

2020/11/29 04:16

投稿

Daregada
Daregada

スコア11990

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のメソッドチェーンで処理が完了する。