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

質問編集履歴

2

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

2017/02/17 09:30

投稿

hahu333
hahu333

スコア8

title CHANGED
File without changes
body CHANGED
@@ -1,46 +1,73 @@
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
- def make_perm(n, m = 0, perm = [])
4
- if n == m
3
+ ```ここに言語を入力
5
- //print perm, "\n"
6
- else
7
- for x in 1 .. n
8
- next if perm.member? x
9
- perm.push x
4
+ def subset(xs)
10
- make_perm(n, m + 1, perm)
5
+ return [[]] if xs.size<=0
6
+ mst=xs.dup
11
- perm.pop
7
+ lst=mst.pop
12
- end
8
+ mst=subset(mst)
13
- end
9
+ mst+mst.map{|e|e+[lst]}
14
10
  end
11
+ def sum(xs)
12
+ xs.inject{|r,a|r+=a}
13
+ end
14
+ def paste(xs)
15
+ rss=[]
16
+ make_perm(xs.size){|idx|
17
+ rss<<xs.values_at(*idx.map{|e|e-1})
18
+ }
19
+ rss
20
+ end
21
+ def make_perm(n, m = 0, perm = [], &blk)
15
22
 
23
+ if n <= m
24
+ yield perm
25
+ else
26
+ for x in 1 .. n
27
+ next if perm.member? x
28
+ perm.push x
29
+ make_perm(n, m + 1, perm, &blk)
30
+ perm.pop
31
+ end
32
+ end
33
+ end
16
34
  def make_exprs(xs)
17
- n=xs.length
35
+ n=xs.length
18
- ass=subset(Array(0..(n-1)))
36
+ ass=subset(Array(0..(n-1)))
19
- yss=[]
37
+ yss=[]
20
- for as in ass
38
+ for as in ass
21
- ys = []
39
+ ys = []
22
- for i in 0..(n-1)
40
+ for i in 0..(n-1)
23
- if as.index(i) != nil then
41
+ if as.index(i) != nil then
24
- ys.push(xs[i])
42
+ ys.push(zs[i])
25
- else
43
+ else
26
- ys.push(-xs[i])
44
+ ys.push(-zs[i])
27
- end
45
+ end
28
- end
46
+ end
29
- yss.push(ys)
47
+ yss.push(ys)
30
- end
48
+ end
31
- return yss
49
+ return yss
32
50
  end
33
-
34
51
  def komachi(xs, target)
52
+ a = 0
35
- zss = paste(xs)
53
+ zss = paste(xs)
36
- wss = []
54
+ wss = []
37
- for zs in zss
55
+ for zs in zss
38
- wss = wss + make_exprs(zs)
56
+ wss = wss + make_exprs(zs)
39
- end
57
+ end
40
- for ws in wss
58
+ for ws in wss
41
- if sum(ws) == target then p ws end
59
+ if sum(ws) == target then
60
+ a = a + 1
42
- end
61
+ end
43
- end
62
+ end
63
+ puts a
64
+ end
44
65
 
66
+ ```
45
67
  追記
46
- プログラムの質問です
68
+ プログラムの質問です
69
+
70
+ 追記2 18:24
71
+ 足りなかった部分を追加、編集してみたのですが、数字を入力しても0としか表示されません。(たまに24とも表示される)
72
+
73
+ また、答えの表示ですが、解の個数だけ表示できればいいです

1

2017/02/17 09:30

投稿

hahu333
hahu333

スコア8

title CHANGED
File without changes
body CHANGED
@@ -40,4 +40,7 @@
40
40
  for ws in wss
41
41
  if sum(ws) == target then p ws end
42
42
  end
43
- end
43
+ end
44
+
45
+ 追記
46
+ プログラムの質問です