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

回答編集履歴

4

ルールの誤認識を修正

2017/02/20 05:36

投稿

退会済みユーザー
answer CHANGED
@@ -7,10 +7,11 @@
7
7
  こちらの変則型の質問(数字の並び方を固定せず(←指摘があり追記しました。)、解を0とする)と理解しました。
8
8
 
9
9
  ひたすら トライ&エラー ということなので、全組み合わせをループで回すことになります。ただし、ループとしては、外側にある数字を使用してはイケない制限が発生するので、それをスキップする機構を組み込みます。
10
- 四則演算は、そのまま4通りなので、ループで回せばイイです。
10
+ 四則演算は、そのまま4通りなので、ループで回せばイイです。
11
11
 
12
12
  ===追記===
13
- 関数化すべき箇所が特定できればと思い、php でサンプルを作成してました。
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-4 の数字に置き換えて考えています。
28
+ +-*/空白 を 1-5 の数字に置き換えて考えています。
28
- 1-4 を桁数分の組み合わせで作成します。
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 = 4;
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

追記

2017/02/20 05:36

投稿

退会済みユーザー
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

追記の明記

2017/02/20 05:27

投稿

退会済みユーザー
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

質問の理解を修正

2017/02/17 12:38

投稿

退会済みユーザー
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通りなので、ループで回せばイイです。