質問編集履歴

2

ソースコードを追加、修正しました。

2017/02/17 09:30

投稿

hahu333
hahu333

スコア8

test CHANGED
File without changes
test CHANGED
@@ -1,91 +1,145 @@
1
- 小町算で、数字1.2.3.4.5.6.7.8.9が現れる順番を任意でよいとして答えが0になる式を全て求めるプログラムを作成する。解は何通りあるか?という問題です。色々関数を作ってみたのはいいですが、ここから先に進みません。どうしたら完成するでしょうか?
1
+ 【追記あり】小町算で、数字1.2.3.4.5.6.7.8.9が現れる順番を任意でよいとして答えが0になる式を全て求めるプログラムを作成する。解は何通りあるか?という問題です。色々関数を作ってみたのはいいですが、ここから先に進みません。どうしたら完成するでしょうか?
2
2
 
3
3
 
4
4
 
5
- def make_perm(n, m = 0, perm = [])
5
+ ```ここに言語を入力
6
6
 
7
- if n == m
7
+ def subset(xs)
8
8
 
9
- //print perm, "\n"
9
+ return [[]] if xs.size<=0
10
10
 
11
- else
11
+ mst=xs.dup
12
12
 
13
- for x in 1 .. n
13
+ lst=mst.pop
14
14
 
15
- next if perm.member? x
15
+ mst=subset(mst)
16
16
 
17
- perm.push x
18
-
19
- make_perm(n, m + 1, perm)
17
+ mst+mst.map{|e|e+[lst]}
20
-
21
- perm.pop
22
-
23
- end
24
-
25
- end
26
18
 
27
19
  end
28
20
 
21
+ def sum(xs)
29
22
 
23
+ xs.inject{|r,a|r+=a}
24
+
25
+ end
26
+
27
+ def paste(xs)
28
+
29
+ rss=[]
30
+
31
+ make_perm(xs.size){|idx|
32
+
33
+ rss<<xs.values_at(*idx.map{|e|e-1})
34
+
35
+ }
36
+
37
+ rss
38
+
39
+ end
40
+
41
+ def make_perm(n, m = 0, perm = [], &blk)
42
+
43
+
44
+
45
+ if n <= m
46
+
47
+ yield perm
48
+
49
+ else
50
+
51
+ for x in 1 .. n
52
+
53
+ next if perm.member? x
54
+
55
+ perm.push x
56
+
57
+ make_perm(n, m + 1, perm, &blk)
58
+
59
+ perm.pop
60
+
61
+ end
62
+
63
+ end
64
+
65
+ end
30
66
 
31
67
  def make_exprs(xs)
32
68
 
33
- n=xs.length
69
+ n=xs.length
34
70
 
35
- ass=subset(Array(0..(n-1)))
71
+ ass=subset(Array(0..(n-1)))
36
72
 
37
- yss=[]
73
+ yss=[]
38
74
 
39
- for as in ass
75
+ for as in ass
40
76
 
41
- ys = []
77
+ ys = []
42
78
 
43
- for i in 0..(n-1)
79
+ for i in 0..(n-1)
44
80
 
45
- if as.index(i) != nil then
81
+ if as.index(i) != nil then
46
82
 
47
- ys.push(xs[i])
83
+ ys.push(zs[i])
48
84
 
49
- else
85
+ else
50
86
 
51
- ys.push(-xs[i])
87
+ ys.push(-zs[i])
52
88
 
53
- end
89
+ end
54
90
 
55
- end
91
+ end
56
92
 
57
- yss.push(ys)
93
+ yss.push(ys)
58
94
 
59
- end
95
+ end
60
96
 
61
- return yss
97
+ return yss
62
98
 
63
99
  end
64
100
 
101
+ def komachi(xs, target)
102
+
103
+ a = 0
104
+
105
+ zss = paste(xs)
106
+
107
+ wss = []
108
+
109
+ for zs in zss
110
+
111
+ wss = wss + make_exprs(zs)
112
+
113
+ end
114
+
115
+ for ws in wss
116
+
117
+ if sum(ws) == target then
118
+
119
+ a = a + 1
120
+
121
+ end
122
+
123
+ end
124
+
125
+ puts a
126
+
127
+ end
65
128
 
66
129
 
67
- def komachi(xs, target)
68
130
 
69
- zss = paste(xs)
70
-
71
- wss = []
72
-
73
- for zs in zss
74
-
75
- wss = wss + make_exprs(zs)
76
-
77
- end
131
+ ```
78
-
79
- for ws in wss
80
-
81
- if sum(ws) == target then p ws end
82
-
83
- end
84
-
85
- end
86
-
87
-
88
132
 
89
133
  追記
90
134
 
91
135
  プログラムの質問です
136
+
137
+
138
+
139
+ 追記2 18:24
140
+
141
+ 足りなかった部分を追加、編集してみたのですが、数字を入力しても0としか表示されません。(たまに24とも表示される)
142
+
143
+
144
+
145
+ また、答えの表示ですが、解の個数だけ表示できればいいです

1

2017/02/17 09:30

投稿

hahu333
hahu333

スコア8

test CHANGED
File without changes
test CHANGED
@@ -83,3 +83,9 @@
83
83
  end
84
84
 
85
85
  end
86
+
87
+
88
+
89
+ 追記
90
+
91
+ プログラムの質問です