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

回答編集履歴

7

更新日の修正

2017/07/19 11:07

投稿

think49
think49

スコア18194

answer CHANGED
@@ -170,8 +170,8 @@
170
170
 
171
171
  ### 更新履歴
172
172
 
173
- - 2017/09/19 17:40 「多次元 Map」を追記
173
+ - 2017/07/19 17:40 「多次元 Map」を追記
174
- - 2017/09/19 18:14 「2進数のビットマップ」を追記
174
+ - 2017/07/19 18:14 「2進数のビットマップ」を追記
175
- - 2017/09/19 18:21 多次元 Map で条件が増えた場合のコードを追記
175
+ - 2017/07/19 18:21 多次元 Map で条件が増えた場合のコードを追記
176
176
 
177
177
  Re: ssbb0212 さん

6

多次元 Map で条件が増えた場合のコードを追記

2017/07/19 11:07

投稿

think49
think49

スコア18194

answer CHANGED
@@ -52,7 +52,6 @@
52
52
  ### 多次元 Map
53
53
 
54
54
  配列の代わりに `Map` を使用してみました。
55
- 条件が3列以上になってもキーの配列を増やすだけで対応可能です。
56
55
 
57
56
  - [multidimensional-map.js : 多次元Mapを生成](https://gist.github.com/think49/00326b750d48f5f9c48a042f1b19a1c2)
58
57
  - [多次元 Map - JSFiddle](https://jsfiddle.net/cj7vsttf/1/)
@@ -120,6 +119,23 @@
120
119
  console.log(getImportance3({A: true, B: true})); // "高い"
121
120
  ```
122
121
 
122
+ 条件が増えた場合、ルールの数を増やすだけで対応可能です。
123
+
124
+ ```JavaScript
125
+ var rules = [
126
+ [new Map([['A', false], ['B', false], ['C', false]]), 'XXX'],
127
+ [new Map([['A', false], ['B', true], ['C', true]]), 'XYY'],
128
+ [new Map([['A', true], ['B', false], ['C', false]]), 'YXX'],
129
+ [new Map([['A', true], ['B', true], ['C', true]]), 'YYY']
130
+ ];
131
+ var getImportance3 = createFunction(rules);
132
+
133
+ console.log(getImportance3({A: false, B: false, C: false})); // "XXX"
134
+ console.log(getImportance3({A: false, B: true, C: true})); // "XYY"
135
+ console.log(getImportance3({A: true, B: false, C: false})); // "YXX"
136
+ console.log(getImportance3({A: true, B: true, C: true})); // "YYY"
137
+ ```
138
+
123
139
  ### 2進数のビットマップ
124
140
 
125
141
  もし、2進数に馴染み深いのであれば、基数変換するのも手です。
@@ -156,5 +172,6 @@
156
172
 
157
173
  - 2017/09/19 17:40 「多次元 Map」を追記
158
174
  - 2017/09/19 18:14 「2進数のビットマップ」を追記
175
+ - 2017/09/19 18:21 多次元 Map で条件が増えた場合のコードを追記
159
176
 
160
177
  Re: ssbb0212 さん

5

多次元 Mapで条件が増えた場合

2017/07/19 09:21

投稿

think49
think49

スコア18194

answer CHANGED
@@ -52,6 +52,7 @@
52
52
  ### 多次元 Map
53
53
 
54
54
  配列の代わりに `Map` を使用してみました。
55
+ 条件が3列以上になってもキーの配列を増やすだけで対応可能です。
55
56
 
56
57
  - [multidimensional-map.js : 多次元Mapを生成](https://gist.github.com/think49/00326b750d48f5f9c48a042f1b19a1c2)
57
58
  - [多次元 Map - JSFiddle](https://jsfiddle.net/cj7vsttf/1/)

4

「2進数のビットマップ」を追記

2017/07/19 09:16

投稿

think49
think49

スコア18194

answer CHANGED
@@ -119,8 +119,41 @@
119
119
  console.log(getImportance3({A: true, B: true})); // "高い"
120
120
  ```
121
121
 
122
+ ### 2進数のビットマップ
123
+
124
+ もし、2進数に馴染み深いのであれば、基数変換するのも手です。
125
+
126
+ |A|B|C|合計|
127
+ |:--:|:--:|:--:|:--:|
128
+ |0|0|0|0|
129
+ |0|0|1|1|
130
+ |0|1|0|2|
131
+ |0|1|1|3|
132
+ |1|0|0|4|
133
+ |1|0|1|5|
134
+ |1|1|0|6|
135
+
136
+ 2進数なので2パターンしか対応できませんが、コードは大分シンプルで条件が増えても対応可能です。
137
+ ただし、条件が増えると左端に "D -> A -> B - > C" になってしまいます。
138
+ 「C -> B -> A」のように降順で定義しておけば解決しますが、反面、読みづらくなるので、機械的に処理する工夫が必要かもしれません。
139
+
140
+ ```JavaScript
141
+ function getValue (a, b, c) {
142
+ return ['000','001','010','011','100','101','110'][parseInt('' + Number(c) + Number(b) + Number(a), 2)];
143
+ }
144
+
145
+ console.log(getValue(false, false, false)); // "000"
146
+ console.log(getValue(false, false, true)); // "001"
147
+ console.log(getValue(false, true, false)); // "010"
148
+ console.log(getValue(false, true, true)); // "011"
149
+ console.log(getValue(true, false, false)); // "100"
150
+ console.log(getValue(true, false, true)); // "101"
151
+ console.log(getValue(true, true, false)); // "110"
152
+ ```
153
+
122
154
  ### 更新履歴
123
155
 
124
156
  - 2017/09/19 17:40 「多次元 Map」を追記
157
+ - 2017/09/19 18:14 「2進数のビットマップ」を追記
125
158
 
126
159
  Re: ssbb0212 さん

3

「多次元 Map」を追記

2017/07/19 09:14

投稿

think49
think49

スコア18194

answer CHANGED
@@ -17,7 +17,7 @@
17
17
  console.log(getImportance1(true, true)); // "高い"
18
18
  ```
19
19
 
20
- ### 二次元配列 (設定の可読性を向上させたもの)
20
+ ### 二次元配列 + オブジェクト初期化子
21
21
 
22
22
  設定の可読性とパフォーマンスの両立を目指しました。
23
23
 
@@ -49,4 +49,78 @@
49
49
  console.log(getImportance2(true, true)); // "高い"
50
50
  ```
51
51
 
52
+ ### 多次元 Map
53
+
54
+ 配列の代わりに `Map` を使用してみました。
55
+
56
+ - [multidimensional-map.js : 多次元Mapを生成](https://gist.github.com/think49/00326b750d48f5f9c48a042f1b19a1c2)
57
+ - [多次元 Map - JSFiddle](https://jsfiddle.net/cj7vsttf/1/)
58
+
59
+ ```JavaScript
60
+ var map = createMultidimensionalMap([
61
+ [[false, false], '低い'],
62
+ [[false, true], '普通'],
63
+ [[true, false], 'やや高い'],
64
+ [[true, true], '高い']
65
+ ]);
66
+
67
+ console.log(map);
68
+ console.log(map.get(false).get(false)); // "低い"
69
+ console.log(map.get(false).get(true)); // "普通"
70
+ console.log(map.get(true).get(false)); // "やや高い"
71
+ console.log(map.get(true).get(true)); // "高い"
72
+ ```
73
+
74
+ 以下、オブジェクト初期化子でルールを渡せるようにしたコード。
75
+
76
+ - [多次元 Map で重要度を定義する - JSFiddle](https://jsfiddle.net/cj7vsttf/2/)
77
+
78
+ ```JavaScript
79
+ 'use strict';
80
+ function createFunction (rules) {
81
+ var keys = [...rules[0][0].keys()],
82
+ hasOwnProperty = Object.prototype.hasOwnProperty;
83
+
84
+ for (var i = 0, len = rules.length, rule; i < len; ++i) {
85
+ rule = rules[i];
86
+ rule[0] = [...rule[0].values()];
87
+ }
88
+
89
+ rules = createMultidimensionalMap(rules);
90
+
91
+ return function getImportance3 (conditions) {
92
+ var map = rules;
93
+
94
+ for (var i = 0, len = keys.length, key; i < len; ++i) {
95
+ key = keys[i];
96
+
97
+ if (!hasOwnProperty.call(conditions, key)) {
98
+ throw new ReferenceError;
99
+ }
100
+
101
+ map = map.get(conditions[key]);
102
+ }
103
+
104
+ return map;
105
+ };
106
+ }
107
+
108
+ var rules = [
109
+ [new Map([['A', false], ['B', false]]), '低い'],
110
+ [new Map([['A', false], ['B', true]]), '普通'],
111
+ [new Map([['A', true], ['B', false]]), 'やや高い'],
112
+ [new Map([['A', true], ['B', true]]), '高い']
113
+ ];
114
+ var getImportance3 = createFunction(rules);
115
+
116
+ console.log(getImportance3({A: false, B: false})); // "低い"
117
+ console.log(getImportance3({A: false, B: true})); // "普通"
118
+ console.log(getImportance3({A: true, B: false})); // "やや高い"
119
+ console.log(getImportance3({A: true, B: true})); // "高い"
120
+ ```
121
+
122
+ ### 更新履歴
123
+
124
+ - 2017/09/19 17:40 「多次元 Map」を追記
125
+
52
126
  Re: ssbb0212 さん

2

デバッグ用途の console\.log を削除

2017/07/19 08:40

投稿

think49
think49

スコア18194

answer CHANGED
@@ -39,7 +39,6 @@
39
39
  }
40
40
 
41
41
  return function getImportance2 (a, b) {
42
- console.log(JSON.stringify(array));
43
42
  return array[Number(Boolean(a))][Number(Boolean(b))];
44
43
  };
45
44
  }());

1

二次元配列 \(設定の可読性を向上させたもの\)

2017/07/19 04:04

投稿

think49
think49

スコア18194

answer CHANGED
@@ -1,17 +1,53 @@
1
1
  JavaScript で回答します。
2
2
 
3
+ ### 二次元配列
4
+
3
5
  「〇×」を Boolean 型の変数として作ってみました。
4
6
  二次元配列を使った簡単なコードなので、他の言語にも応用できると思います。
5
7
 
6
8
  ```JavaScript
9
+ 'use strict';
7
- function getImportance (a, b) { // 仮引数 a, b は Boolean 型の値をとるものとする
10
+ function getImportance1 (a, b) { // 仮引数 a, b は Boolean 型の値をとるものとする
8
11
  return [['低い', '普通'], ['やや高い', '高い']][Number(Boolean(a))][Number(Boolean(b))];
9
12
  }
10
13
 
11
- console.log(getImportance(false, false)); // "低い"
14
+ console.log(getImportance1(false, false)); // "低い"
12
- console.log(getImportance(false, true)); // "普通"
15
+ console.log(getImportance1(false, true)); // "普通"
13
- console.log(getImportance(true, false)); // "やや高い"
16
+ console.log(getImportance1(true, false)); // "やや高い"
14
- console.log(getImportance(true, true)); // "高い"
17
+ console.log(getImportance1(true, true)); // "高い"
15
18
  ```
16
19
 
20
+ ### 二次元配列 (設定の可読性を向上させたもの)
21
+
22
+ 設定の可読性とパフォーマンスの両立を目指しました。
23
+
24
+ ```JavaScript
25
+ 'use strict';
26
+ var getImportance2 = (function () {
27
+ var rules = [
28
+ [{a: false, b: false}, '低い'],
29
+ [{a: false, b: true}, '普通'],
30
+ [{a: true, b: false}, 'やや高い'],
31
+ [{a: true, b: true}, '高い']
32
+ ],
33
+ array = [[],[]];
34
+
35
+ for (var i = 0, len = rules.length, rule; i < len; ++i) {
36
+ rule = rules[i];
37
+
38
+ array[Number(rule[0].a)][Number(rule[0].b)] = rule[1];
39
+ }
40
+
41
+ return function getImportance2 (a, b) {
42
+ console.log(JSON.stringify(array));
43
+ return array[Number(Boolean(a))][Number(Boolean(b))];
44
+ };
45
+ }());
46
+
47
+ console.log(getImportance2(false, false)); // "低い"
48
+ console.log(getImportance2(false, true)); // "普通"
49
+ console.log(getImportance2(true, false)); // "やや高い"
50
+ console.log(getImportance2(true, true)); // "高い"
51
+ ```
52
+
17
53
  Re: ssbb0212 さん