質問するログイン新規登録

回答編集履歴

2

さらに短い式に修正

2020/11/29 04:16

投稿

Daregada
Daregada

スコア11992

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

補足を追加

2020/11/29 04:16

投稿

Daregada
Daregada

スコア11992

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