回答編集履歴

2

パターンマッチングを追記

2019/12/24 10:26

投稿

xebme
xebme

スコア1090

test CHANGED
@@ -87,3 +87,27 @@
87
87
  **もっと良い解答**
88
88
 
89
89
  あるはず。考えましょう。
90
+
91
+
92
+
93
+ **パターンマッチング(追記)**
94
+
95
+ 畳み込みにパターンマッチングを適用して、この回答を終わります。
96
+
97
+
98
+
99
+ ```Scala
100
+
101
+ val (_, ans2) = list.foldLeft((Nil:List[Int], Nil:List[Int])) {
102
+
103
+ case ((x, y), (_, "H", c)) => (x :+ c, y)
104
+
105
+ case ((Nil, y), _) => (Nil, y)
106
+
107
+ case ((x, y), _) => (Nil, {val avg = x.sum / x.length; y ++ x.filter(avg < _)})
108
+
109
+ }
110
+
111
+ ans2.foreach(println(_))
112
+
113
+ ```

1

解説を追加

2019/12/24 10:26

投稿

xebme
xebme

スコア1090

test CHANGED
@@ -31,6 +31,20 @@
31
31
  }
32
32
 
33
33
  ```
34
+
35
+ "H"が続く間、wlistという一時的なリストにcの値を保存します。理由は、cの平均を計算してからでなければ、平均より大きな要素を選択できないからです。
36
+
37
+ - "H"が続く間、cの値をwlistに順に保存する
38
+
39
+ - "R"が現れたら、wlistが空でなければ、以下の処理を行う
40
+
41
+ ・wlistの平均を計算する。sumが合計、lengthが個数です。整数除算
42
+
43
+ ・wlistから平均より大きなcを選択する。filterを使います
44
+
45
+ ・選択したcを表示する。foreach、printlnを使います
46
+
47
+ ・wlistを空にする
34
48
 
35
49
 
36
50
 
@@ -66,6 +80,8 @@
66
80
 
67
81
  ```
68
82
 
83
+ やっていることは上と同じです。wlistに相当するのが、(x,y)のxです。xには"H"が続く間、cの値が保存されます。yは出力用のリストです。"R"が現れる都度、計算した平均より大きなcが順にyに保存されます。畳み込みと同じ処理は再帰を使ってもできます。
84
+
69
85
 
70
86
 
71
87
  **もっと良い解答**