回答編集履歴
4
ルールの誤認識を修正
answer
CHANGED
@@ -7,10 +7,11 @@
|
|
7
7
|
こちらの変則型の質問(数字の並び方を固定せず(←指摘があり追記しました。)、解を0とする)と理解しました。
|
8
8
|
|
9
9
|
ひたすら トライ&エラー ということなので、全組み合わせをループで回すことになります。ただし、ループとしては、外側にある数字を使用してはイケない制限が発生するので、それをスキップする機構を組み込みます。
|
10
|
-
四則演算は、そのまま4通りなので、ループで回せばイイです。
|
10
|
+
四則演算とは、そのまま4通りなので、ループで回せばイイです。
|
11
11
|
|
12
12
|
===追記===
|
13
|
-
|
13
|
+
*ルールを勘違いしていました。計算方法は四則演算だけでなく、空白を含むのですね^^;
|
14
|
+
回答を修正しました。
|
14
15
|
|
15
16
|
多分、再帰で全部記述することもできる気もしますが、ちょっと頭が追いつかなくなったので、大きく3部分に分けました。
|
16
17
|
otn さんの回答見ると、Ruby だと `create_number` と `operation_combination` に似た内容が関数化されてるんですかね。羨ましい。。。
|
@@ -23,9 +24,9 @@
|
|
23
24
|
123456789,
|
24
25
|
123456798,
|
25
26
|
|
26
|
-
`operation_combination` +-*/ の組み合わせを与えられた桁数分用意
|
27
|
+
`operation_combination` +-*/空白 の組み合わせを与えられた桁数分用意
|
27
|
-
+-*/ を 1-
|
28
|
+
+-*/空白 を 1-5 の数字に置き換えて考えています。
|
28
|
-
1-
|
29
|
+
1-5 を桁数分の組み合わせで作成します。
|
29
30
|
こんな数字が並びます。
|
30
31
|
111111111,
|
31
32
|
111111112,
|
@@ -48,8 +49,8 @@
|
|
48
49
|
private $base_array;
|
49
50
|
private $count_base_array;
|
50
51
|
private $result_array =[];
|
51
|
-
private $base_op_array = [1,2,3,4]; //1:+,2:-,3:*,4:/
|
52
|
+
private $base_op_array = [1,2,3,4,5]; //1:+,2:-,3:*,4:/,5:''
|
52
|
-
private $count_base_op_array =
|
53
|
+
private $count_base_op_array = 5;
|
53
54
|
private $combination_op_array = [];
|
54
55
|
|
55
56
|
public function __construct($base_array) {
|
@@ -115,6 +116,9 @@
|
|
115
116
|
if ((int)$op_array[$i-1] === 4){
|
116
117
|
$sum = $sum . '/'. $num_array[$i];
|
117
118
|
}
|
119
|
+
if ((int)$op_array[$i-1] === 5){
|
120
|
+
$sum = $sum . $num_array[$i];
|
121
|
+
}
|
118
122
|
}
|
119
123
|
$result= eval("return {$sum};");
|
120
124
|
echo $sum . ' = ' . $result . PHP_EOL;
|
@@ -134,96 +138,150 @@
|
|
134
138
|
1+2-3 = 0
|
135
139
|
1+2*3 = 7
|
136
140
|
1+2/3 = 1.6666666666667
|
141
|
+
1+23 = 24
|
137
142
|
1-2+3 = 2
|
138
143
|
1-2-3 = -4
|
139
144
|
1-2*3 = -5
|
140
145
|
1-2/3 = 0.33333333333333
|
146
|
+
1-23 = -22
|
141
147
|
1*2+3 = 5
|
142
148
|
1*2-3 = -1
|
143
149
|
1*2*3 = 6
|
144
150
|
1*2/3 = 0.66666666666667
|
151
|
+
1*23 = 23
|
145
152
|
1/2+3 = 3.5
|
146
153
|
1/2-3 = -2.5
|
147
154
|
1/2*3 = 1.5
|
148
155
|
1/2/3 = 0.16666666666667
|
156
|
+
1/23 = 0.043478260869565
|
157
|
+
12+3 = 15
|
158
|
+
12-3 = 9
|
159
|
+
12*3 = 36
|
160
|
+
12/3 = 4
|
161
|
+
123 = 123
|
149
162
|
1+3+2 = 6
|
150
163
|
1+3-2 = 2
|
151
164
|
1+3*2 = 7
|
152
165
|
1+3/2 = 2.5
|
166
|
+
1+32 = 33
|
153
167
|
1-3+2 = 0
|
154
168
|
1-3-2 = -4
|
155
169
|
1-3*2 = -5
|
156
170
|
1-3/2 = -0.5
|
171
|
+
1-32 = -31
|
157
172
|
1*3+2 = 5
|
158
173
|
1*3-2 = 1
|
159
174
|
1*3*2 = 6
|
160
175
|
1*3/2 = 1.5
|
176
|
+
1*32 = 32
|
161
177
|
1/3+2 = 2.3333333333333
|
162
178
|
1/3-2 = -1.6666666666667
|
163
179
|
1/3*2 = 0.66666666666667
|
164
180
|
1/3/2 = 0.16666666666667
|
181
|
+
1/32 = 0.03125
|
182
|
+
13+2 = 15
|
183
|
+
13-2 = 11
|
184
|
+
13*2 = 26
|
185
|
+
13/2 = 6.5
|
186
|
+
132 = 132
|
165
187
|
2+1+3 = 6
|
166
188
|
2+1-3 = 0
|
167
189
|
2+1*3 = 5
|
168
190
|
2+1/3 = 2.3333333333333
|
191
|
+
2+13 = 15
|
169
192
|
2-1+3 = 4
|
170
193
|
2-1-3 = -2
|
171
194
|
2-1*3 = -1
|
172
195
|
2-1/3 = 1.6666666666667
|
196
|
+
2-13 = -11
|
173
197
|
2*1+3 = 5
|
174
198
|
2*1-3 = -1
|
175
199
|
2*1*3 = 6
|
176
200
|
2*1/3 = 0.66666666666667
|
201
|
+
2*13 = 26
|
177
202
|
2/1+3 = 5
|
178
203
|
2/1-3 = -1
|
179
204
|
2/1*3 = 6
|
180
205
|
2/1/3 = 0.66666666666667
|
206
|
+
2/13 = 0.15384615384615
|
207
|
+
21+3 = 24
|
208
|
+
21-3 = 18
|
209
|
+
21*3 = 63
|
210
|
+
21/3 = 7
|
211
|
+
213 = 213
|
181
212
|
2+3+1 = 6
|
182
213
|
2+3-1 = 4
|
183
214
|
2+3*1 = 5
|
184
215
|
2+3/1 = 5
|
216
|
+
2+31 = 33
|
185
217
|
2-3+1 = 0
|
186
218
|
2-3-1 = -2
|
187
219
|
2-3*1 = -1
|
188
220
|
2-3/1 = -1
|
221
|
+
2-31 = -29
|
189
222
|
2*3+1 = 7
|
190
223
|
2*3-1 = 5
|
191
224
|
2*3*1 = 6
|
192
225
|
2*3/1 = 6
|
226
|
+
2*31 = 62
|
193
227
|
2/3+1 = 1.6666666666667
|
194
228
|
2/3-1 = -0.33333333333333
|
195
229
|
2/3*1 = 0.66666666666667
|
196
230
|
2/3/1 = 0.66666666666667
|
231
|
+
2/31 = 0.064516129032258
|
232
|
+
23+1 = 24
|
233
|
+
23-1 = 22
|
234
|
+
23*1 = 23
|
235
|
+
23/1 = 23
|
236
|
+
231 = 231
|
197
237
|
3+1+2 = 6
|
198
238
|
3+1-2 = 2
|
199
239
|
3+1*2 = 5
|
200
240
|
3+1/2 = 3.5
|
241
|
+
3+12 = 15
|
201
242
|
3-1+2 = 4
|
202
243
|
3-1-2 = 0
|
203
244
|
3-1*2 = 1
|
204
245
|
3-1/2 = 2.5
|
246
|
+
3-12 = -9
|
205
247
|
3*1+2 = 5
|
206
248
|
3*1-2 = 1
|
207
249
|
3*1*2 = 6
|
208
250
|
3*1/2 = 1.5
|
251
|
+
3*12 = 36
|
209
252
|
3/1+2 = 5
|
210
253
|
3/1-2 = 1
|
211
254
|
3/1*2 = 6
|
212
255
|
3/1/2 = 1.5
|
256
|
+
3/12 = 0.25
|
257
|
+
31+2 = 33
|
258
|
+
31-2 = 29
|
259
|
+
31*2 = 62
|
260
|
+
31/2 = 15.5
|
261
|
+
312 = 312
|
213
262
|
3+2+1 = 6
|
214
263
|
3+2-1 = 4
|
215
264
|
3+2*1 = 5
|
216
265
|
3+2/1 = 5
|
266
|
+
3+21 = 24
|
217
267
|
3-2+1 = 2
|
218
268
|
3-2-1 = 0
|
219
269
|
3-2*1 = 1
|
220
270
|
3-2/1 = 1
|
271
|
+
3-21 = -18
|
221
272
|
3*2+1 = 7
|
222
273
|
3*2-1 = 5
|
223
274
|
3*2*1 = 6
|
224
275
|
3*2/1 = 6
|
276
|
+
3*21 = 63
|
225
277
|
3/2+1 = 2.5
|
226
278
|
3/2-1 = 0.5
|
227
279
|
3/2*1 = 1.5
|
228
280
|
3/2/1 = 1.5
|
281
|
+
3/21 = 0.14285714285714
|
282
|
+
32+1 = 33
|
283
|
+
32-1 = 31
|
284
|
+
32*1 = 32
|
285
|
+
32/1 = 32
|
286
|
+
321 = 321
|
229
287
|
```
|
3
追記
answer
CHANGED
@@ -7,4 +7,223 @@
|
|
7
7
|
こちらの変則型の質問(数字の並び方を固定せず(←指摘があり追記しました。)、解を0とする)と理解しました。
|
8
8
|
|
9
9
|
ひたすら トライ&エラー ということなので、全組み合わせをループで回すことになります。ただし、ループとしては、外側にある数字を使用してはイケない制限が発生するので、それをスキップする機構を組み込みます。
|
10
|
-
四則演算は、そのまま4通りなので、ループで回せばイイです。
|
10
|
+
四則演算は、そのまま4通りなので、ループで回せばイイです。
|
11
|
+
|
12
|
+
===追記===
|
13
|
+
関数化すべき箇所が特定できればと思い、php でサンプルを作成してみました。
|
14
|
+
|
15
|
+
多分、再帰で全部記述することもできる気もしますが、ちょっと頭が追いつかなくなったので、大きく3部分に分けました。
|
16
|
+
otn さんの回答見ると、Ruby だと `create_number` と `operation_combination` に似た内容が関数化されてるんですかね。羨ましい。。。
|
17
|
+
|
18
|
+
ざっくりと解説すると
|
19
|
+
|
20
|
+
`create_number` 与えられた配列に対して、重複のない組み合わせの数字を作成
|
21
|
+
すでに使用した数字はスキップし、それ以外は桁数になるまで再帰することで作成しています。
|
22
|
+
こんな数字が並びます。
|
23
|
+
123456789,
|
24
|
+
123456798,
|
25
|
+
|
26
|
+
`operation_combination` +-*/ の組み合わせを与えられた桁数分用意
|
27
|
+
+-*/ を 1-4 の数字に置き換えて考えています。
|
28
|
+
1-4 を桁数分の組み合わせで作成します。
|
29
|
+
こんな数字が並びます。
|
30
|
+
111111111,
|
31
|
+
111111112,
|
32
|
+
|
33
|
+
意味は
|
34
|
+
+++++++++,
|
35
|
+
++++++++-,
|
36
|
+
|
37
|
+
です。
|
38
|
+
|
39
|
+
`get_sum` ぐるぐる計算するところ
|
40
|
+
create_number と operation_combination で作成した配列を空になるまで計算しています。
|
41
|
+
今回は、値の正当性を確認したかったので、0 のカウントとせず、式と合計値を表示するサンプルにしています。
|
42
|
+
結局、eval のお世話になってしまいました^^;
|
43
|
+
面白かったです。
|
44
|
+
|
45
|
+
```php
|
46
|
+
<?php
|
47
|
+
class Komachi{
|
48
|
+
private $base_array;
|
49
|
+
private $count_base_array;
|
50
|
+
private $result_array =[];
|
51
|
+
private $base_op_array = [1,2,3,4]; //1:+,2:-,3:*,4:/
|
52
|
+
private $count_base_op_array = 4;
|
53
|
+
private $combination_op_array = [];
|
54
|
+
|
55
|
+
public function __construct($base_array) {
|
56
|
+
$this->base_array = $base_array;
|
57
|
+
$this->count_base_array = count($base_array);
|
58
|
+
}
|
59
|
+
|
60
|
+
public function result() {
|
61
|
+
return ($this->result_array);
|
62
|
+
}
|
63
|
+
|
64
|
+
public function combination_op_array() {
|
65
|
+
return ($this->combination_op_array);
|
66
|
+
}
|
67
|
+
|
68
|
+
public function create_number($org_number,$count){
|
69
|
+
for($i = 0 ; $i < $this->count_base_array ;$i++){
|
70
|
+
$org_number_array = str_split($org_number,1);
|
71
|
+
if (in_array($this->base_array[$i],$org_number_array)) {
|
72
|
+
continue;
|
73
|
+
}
|
74
|
+
$new_number = $org_number * 10 + $this->base_array[$i];
|
75
|
+
if ($count === $this->count_base_array){
|
76
|
+
$this->result_array[] = $new_number;
|
77
|
+
continue;
|
78
|
+
}
|
79
|
+
$this->create_number($new_number,$count+1);
|
80
|
+
}
|
81
|
+
}
|
82
|
+
|
83
|
+
public function operation_combination($org_number,$count){
|
84
|
+
for($i = 0 ; $i < $this->count_base_op_array ;$i++){
|
85
|
+
$new_number = $org_number * 10 + $this->base_op_array[$i];
|
86
|
+
if ($count === $this->count_base_array-1){
|
87
|
+
$this->combination_op_array[] = $new_number;
|
88
|
+
continue;
|
89
|
+
}
|
90
|
+
$this->operation_combination($new_number,$count+1);
|
91
|
+
}
|
92
|
+
}
|
93
|
+
|
94
|
+
public function get_sum(){
|
95
|
+
$this->create_number(0,1);
|
96
|
+
$this->operation_combination(0,1);
|
97
|
+
foreach($this->result_array as $num){
|
98
|
+
$num_array = str_split($num,1);
|
99
|
+
foreach($this->combination_op_array as $combination_op){
|
100
|
+
$op_array = str_split($combination_op,1);
|
101
|
+
for($i = 0 ; $i < $this->count_base_array ;$i++){
|
102
|
+
if($i === 0){
|
103
|
+
$sum = $num_array[$i];
|
104
|
+
continue;
|
105
|
+
}
|
106
|
+
if ((int)$op_array[$i-1] === 1){
|
107
|
+
$sum = $sum . '+'.$num_array[$i];
|
108
|
+
}
|
109
|
+
if ((int)$op_array[$i-1] === 2){
|
110
|
+
$sum = $sum . '-'.$num_array[$i];
|
111
|
+
}
|
112
|
+
if ((int)$op_array[$i-1] === 3){
|
113
|
+
$sum = $sum . '*'.$num_array[$i];
|
114
|
+
}
|
115
|
+
if ((int)$op_array[$i-1] === 4){
|
116
|
+
$sum = $sum . '/'. $num_array[$i];
|
117
|
+
}
|
118
|
+
}
|
119
|
+
$result= eval("return {$sum};");
|
120
|
+
echo $sum . ' = ' . $result . PHP_EOL;
|
121
|
+
}
|
122
|
+
}
|
123
|
+
}
|
124
|
+
}
|
125
|
+
|
126
|
+
// $tmp = new Komachi([1,2,3,4,5,6,7,8,9]);
|
127
|
+
$komachi = new Komachi([1,2,3]);
|
128
|
+
$komachi->get_sum();
|
129
|
+
```
|
130
|
+
|
131
|
+
以下、[1,2,3] の結果です。
|
132
|
+
```
|
133
|
+
1+2+3 = 6
|
134
|
+
1+2-3 = 0
|
135
|
+
1+2*3 = 7
|
136
|
+
1+2/3 = 1.6666666666667
|
137
|
+
1-2+3 = 2
|
138
|
+
1-2-3 = -4
|
139
|
+
1-2*3 = -5
|
140
|
+
1-2/3 = 0.33333333333333
|
141
|
+
1*2+3 = 5
|
142
|
+
1*2-3 = -1
|
143
|
+
1*2*3 = 6
|
144
|
+
1*2/3 = 0.66666666666667
|
145
|
+
1/2+3 = 3.5
|
146
|
+
1/2-3 = -2.5
|
147
|
+
1/2*3 = 1.5
|
148
|
+
1/2/3 = 0.16666666666667
|
149
|
+
1+3+2 = 6
|
150
|
+
1+3-2 = 2
|
151
|
+
1+3*2 = 7
|
152
|
+
1+3/2 = 2.5
|
153
|
+
1-3+2 = 0
|
154
|
+
1-3-2 = -4
|
155
|
+
1-3*2 = -5
|
156
|
+
1-3/2 = -0.5
|
157
|
+
1*3+2 = 5
|
158
|
+
1*3-2 = 1
|
159
|
+
1*3*2 = 6
|
160
|
+
1*3/2 = 1.5
|
161
|
+
1/3+2 = 2.3333333333333
|
162
|
+
1/3-2 = -1.6666666666667
|
163
|
+
1/3*2 = 0.66666666666667
|
164
|
+
1/3/2 = 0.16666666666667
|
165
|
+
2+1+3 = 6
|
166
|
+
2+1-3 = 0
|
167
|
+
2+1*3 = 5
|
168
|
+
2+1/3 = 2.3333333333333
|
169
|
+
2-1+3 = 4
|
170
|
+
2-1-3 = -2
|
171
|
+
2-1*3 = -1
|
172
|
+
2-1/3 = 1.6666666666667
|
173
|
+
2*1+3 = 5
|
174
|
+
2*1-3 = -1
|
175
|
+
2*1*3 = 6
|
176
|
+
2*1/3 = 0.66666666666667
|
177
|
+
2/1+3 = 5
|
178
|
+
2/1-3 = -1
|
179
|
+
2/1*3 = 6
|
180
|
+
2/1/3 = 0.66666666666667
|
181
|
+
2+3+1 = 6
|
182
|
+
2+3-1 = 4
|
183
|
+
2+3*1 = 5
|
184
|
+
2+3/1 = 5
|
185
|
+
2-3+1 = 0
|
186
|
+
2-3-1 = -2
|
187
|
+
2-3*1 = -1
|
188
|
+
2-3/1 = -1
|
189
|
+
2*3+1 = 7
|
190
|
+
2*3-1 = 5
|
191
|
+
2*3*1 = 6
|
192
|
+
2*3/1 = 6
|
193
|
+
2/3+1 = 1.6666666666667
|
194
|
+
2/3-1 = -0.33333333333333
|
195
|
+
2/3*1 = 0.66666666666667
|
196
|
+
2/3/1 = 0.66666666666667
|
197
|
+
3+1+2 = 6
|
198
|
+
3+1-2 = 2
|
199
|
+
3+1*2 = 5
|
200
|
+
3+1/2 = 3.5
|
201
|
+
3-1+2 = 4
|
202
|
+
3-1-2 = 0
|
203
|
+
3-1*2 = 1
|
204
|
+
3-1/2 = 2.5
|
205
|
+
3*1+2 = 5
|
206
|
+
3*1-2 = 1
|
207
|
+
3*1*2 = 6
|
208
|
+
3*1/2 = 1.5
|
209
|
+
3/1+2 = 5
|
210
|
+
3/1-2 = 1
|
211
|
+
3/1*2 = 6
|
212
|
+
3/1/2 = 1.5
|
213
|
+
3+2+1 = 6
|
214
|
+
3+2-1 = 4
|
215
|
+
3+2*1 = 5
|
216
|
+
3+2/1 = 5
|
217
|
+
3-2+1 = 2
|
218
|
+
3-2-1 = 0
|
219
|
+
3-2*1 = 1
|
220
|
+
3-2/1 = 1
|
221
|
+
3*2+1 = 7
|
222
|
+
3*2-1 = 5
|
223
|
+
3*2*1 = 6
|
224
|
+
3*2/1 = 6
|
225
|
+
3/2+1 = 2.5
|
226
|
+
3/2-1 = 0.5
|
227
|
+
3/2*1 = 1.5
|
228
|
+
3/2/1 = 1.5
|
229
|
+
```
|
2
追記の明記
answer
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
> 小町算(こまちざん)は数の遊びである数学パズルの一種。1□2□3□4□5□6□7□8□9 = 100 という数式の□の中に、+,-,×,÷,空白 のいずれかを一つずつ入れて正しい数式を完成させるというものである。方程式などは解法が研究されており、虫食い算、覆面算も繰り上がりなどを手がかりに答えを絞り込んでいけるが、小町算はそのような解法はなく、ひたすらトライ&エラーで答えを探すしかない。
|
6
6
|
|
7
|
-
こちらの変則型の質問(数字の並び方を固定せず、解を0とする)と理解しました。
|
7
|
+
こちらの変則型の質問(数字の並び方を固定せず(←指摘があり追記しました。)、解を0とする)と理解しました。
|
8
8
|
|
9
9
|
ひたすら トライ&エラー ということなので、全組み合わせをループで回すことになります。ただし、ループとしては、外側にある数字を使用してはイケない制限が発生するので、それをスキップする機構を組み込みます。
|
10
10
|
四則演算は、そのまま4通りなので、ループで回せばイイです。
|
1
質問の理解を修正
answer
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
> 小町算(こまちざん)は数の遊びである数学パズルの一種。1□2□3□4□5□6□7□8□9 = 100 という数式の□の中に、+,-,×,÷,空白 のいずれかを一つずつ入れて正しい数式を完成させるというものである。方程式などは解法が研究されており、虫食い算、覆面算も繰り上がりなどを手がかりに答えを絞り込んでいけるが、小町算はそのような解法はなく、ひたすらトライ&エラーで答えを探すしかない。
|
6
6
|
|
7
|
-
こちらの変則型の質問(解を0とする)と理解しました。
|
7
|
+
こちらの変則型の質問(数字の並び方を固定せず、解を0とする)と理解しました。
|
8
8
|
|
9
9
|
ひたすら トライ&エラー ということなので、全組み合わせをループで回すことになります。ただし、ループとしては、外側にある数字を使用してはイケない制限が発生するので、それをスキップする機構を組み込みます。
|
10
10
|
四則演算は、そのまま4通りなので、ループで回せばイイです。
|