回答編集履歴

11

f

2020/08/03 16:03

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
  直交座標面(h, y)において
26
26
 
27
- 直線y = p1+p2+p3 = t[0]*s[0]-t[0]*h + t[1]*s[1]-t[1]*h + t[1]*s[1]-t[1]*h
27
+ 直線y = p1+p2+p3 = t[0]*s[0]-t[0]*h + t[1]*s[1]-t[1]*h + t[2]*s[2]-t[2]*h
28
28
 
29
29
  = -(t[0] + t[1] + t[2])*h + (t[0]*s[0] + t[1]*s[1] + t[2]*s[2])
30
30
 

10

f

2020/08/03 16:03

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -62,9 +62,9 @@
62
62
 
63
63
  def func1(s, t):
64
64
 
65
- x = sum(t) # t[0] + t[1] + t[2] ...
65
+ x = sum(t) # t[0] + t[1] + t[2]...
66
66
 
67
- k = sum(i*j for i, j in zip(s, t)) # [0]*s[0] + t[1]*s[1] + t[2]*s[2] ...
67
+ k = sum(ss*tt for ss, tt in zip(s, t)) # [0]*s[0] + t[1]*s[1] + t[2]*s[2]...
68
68
 
69
69
 
70
70
 
@@ -78,9 +78,9 @@
78
78
 
79
79
  hh = h
80
80
 
81
- for p in range(len(t)):
81
+ for ss, tt in zip(s, t):
82
82
 
83
- if t[p]*(s[p]-hh) <= 0:
83
+ if tt*(ss - hh) <= 0:
84
84
 
85
85
  h = None
86
86
 
@@ -88,7 +88,7 @@
88
88
 
89
89
  return None
90
90
 
91
- return tuple(t[i]*(s[i] - h) for i in range(len(t)))
91
+ return tuple(tt*(ss - h) for ss, tt in zip(s, t))
92
92
 
93
93
  ```
94
94
 

9

追加

2020/08/03 16:00

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -114,4 +114,24 @@
114
114
 
115
115
  # sum = 0.9999999999999998
116
116
 
117
+
118
+
119
+ s = [1, 2, 3, 2]
120
+
121
+ t = [0.2, 0.3, 0.2, 0.1]
122
+
123
+ # answer= (0.04999999999999996, 0.37499999999999994, 0.45, 0.12499999999999999)
124
+
125
+ # sum = 1.0
126
+
127
+
128
+
129
+ s = [1, 2, 3, 2]
130
+
131
+ t = [0.2, 0.3, 0.2, 0.5]
132
+
133
+ # answer= None
134
+
135
+ # sum = None
136
+
117
137
  ```

8

修正

2020/08/03 15:54

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -62,9 +62,9 @@
62
62
 
63
63
  def func1(s, t):
64
64
 
65
- x = sum(t) # t[0] + t[1] + t[2]
65
+ x = sum(t) # t[0] + t[1] + t[2] ...
66
66
 
67
- k = sum(i*j for i, j in zip(s, t)) # [0]*s[0] + t[1]*s[1] + t[2]*s[2]
67
+ k = sum(i*j for i, j in zip(s, t)) # [0]*s[0] + t[1]*s[1] + t[2]*s[2] ...
68
68
 
69
69
 
70
70
 
@@ -78,13 +78,17 @@
78
78
 
79
79
  hh = h
80
80
 
81
- for p in range(3):
81
+ for p in range(len(t)):
82
82
 
83
83
  if t[p]*(s[p]-hh) <= 0:
84
84
 
85
- return None
85
+ h = None
86
86
 
87
+ if h is None:
88
+
89
+ return None
90
+
87
- return tuple(t[i]*(s[i] - h) for i in range(3))
91
+ return tuple(t[i]*(s[i] - h) for i in range(len(t)))
88
92
 
89
93
  ```
90
94
 

7

修正

2020/08/03 15:47

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -30,7 +30,7 @@
30
30
 
31
31
 
32
32
 
33
- が直線 y=1と交わるhを算出し
33
+ が直線 y=1と交わるときのh座標を算出し
34
34
 
35
35
  求めたhがいずれのk=0,1,2についてもpk=tk(sk - h)>0を満たしているか
36
36
 

6

内容を修正しました

2020/08/03 15:44

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -1,117 +1,113 @@
1
- 考え方だけ記します。
1
+ ```
2
2
 
3
- 具体的な数字を与えて考えてみましょう。たとえば
3
+ s = [s[0], s[1], s[2]]
4
4
 
5
- a = [1, 2, 3]
5
+ t = [t[0], t[1], t[2]]
6
6
 
7
- b = [4, 5, 6]
7
+ ```
8
8
 
9
- としたとき、
9
+ としたとき、max()を無視すれば、
10
10
 
11
- p1=max(4*(1-h) ,0)
11
+ ```
12
12
 
13
- p2=max(5*(2-h) ,0)
13
+ p1 = t[0]*s[0]-t[0]*h
14
14
 
15
- p3=max(6*(3-h) ,0)
15
+ p2 = t[1]*s[1]-t[1]*h
16
16
 
17
+ p3 = t[2]*s[2]-t[2]*h
18
+
19
+ ```
20
+
17
- となっています。
21
+ となます。
22
+
23
+ p1~p3のいずれかが0となるようなhは除外するのですから、結局、
24
+
25
+ 直交座標面(h, y)において
26
+
27
+ 直線y = p1+p2+p3 = t[0]*s[0]-t[0]*h + t[1]*s[1]-t[1]*h + t[1]*s[1]-t[1]*h
28
+
29
+ = -(t[0] + t[1] + t[2])*h + (t[0]*s[0] + t[1]*s[1] + t[2]*s[2])
18
30
 
19
31
 
20
32
 
21
- それぞれhの範囲切り替えて考えると、
33
+ が直線 y=1と交わるhを算出し
22
34
 
23
- p1= h≦1ならば 4*(1-h) 、 h>1ならば0
35
+ 求めたhがいずれのk=0,1,2についてもpk=tk(sk - h)>0を満たしているか
24
36
 
25
- p2= h≦2なら 5*(2-h) 、 h>2らば0
37
+ 確認すれよいのではいでしょうか。
26
-
27
- p3= h≦3ならば 6*(3-h) 、 h>3ならば0
28
38
 
29
39
 
30
40
 
41
+ 上記で
42
+
43
+ x = t[0] + t[1] + t[2]
44
+
45
+ k = t[0]*s[0] + t[1]*s[1] + t[2]*s[2]
46
+
47
+ とおけば
48
+
49
+ y = -xh+k と y = 1の交点を求めるわけですから、
50
+
51
+ h = (k-1)/x
52
+
31
- となっています。
53
+ となます。(x=0の場合は除外)
32
54
 
33
55
 
34
56
 
35
- これら3つついてまとめると
57
+ ※s,t中身よっは、解を持ちせん。
36
58
 
37
59
 
38
60
 
39
- h≦1の場合
61
+ ```lang-python
40
62
 
41
- p1+p2+p3 = 4*(1-h) + 5*(2-h) + 6*(3-h)
63
+ def func1(s, t):
42
64
 
43
- 1<h≦2の場合
65
+ x = sum(t) # t[0] + t[1] + t[2]
44
66
 
45
- p1+p2+p3 = 0+p2+p3 = 5*(2-h) + 6*(3-h)
67
+ k = sum(i*j for i, j in zip(s, t)) # [0]*s[0] + t[1]*s[1] + t[2]*s[2]
46
-
47
- ・2<h≦3の場合
48
-
49
- p1+p2+p3 = 0+0+p3 = 6*(3-h)
50
-
51
- ・3<hの場合
52
-
53
- p1+p2+p3 = 0
54
68
 
55
69
 
56
70
 
71
+ if x == 0:
72
+
73
+ h = None
74
+
75
+ else:
76
+
77
+ h = (k-1)/x
78
+
79
+ hh = h
80
+
81
+ for p in range(3):
82
+
83
+ if t[p]*(s[p]-hh) <= 0:
84
+
85
+ return None
86
+
57
- p1+p2+p3 = yとして、(h, y)のグラフを上記に従ってノートかなんかに描いてみましょう。
87
+ return tuple(t[i]*(s[i] - h) for i in range(3))
88
+
89
+ ```
90
+
91
+ 実行例
92
+
93
+ ```lang-python
94
+
95
+ s = [1, 2, 3]
96
+
97
+ t = [0.4, 0.3, 0.2]
58
98
 
59
99
 
60
100
 
61
- すると、上記の場合で
101
+ r = func1(s,t)
62
102
 
103
+ print("answer=", r)
104
+
63
- p1+p2+p3 (= y)=1となるのは、 直線y=6*(3-h) が直線 y=1と交わる点のx座標ということになります。
105
+ print("sum = {}".format(sum(r) if r else None))
64
106
 
65
107
 
66
108
 
67
- 一般化すると、
109
+ # answer= (0.13333333333333328, 0.3999999999999999, 0.4666666666666666)
68
110
 
69
- a1≦a2≦a3として、a1,a2,a3に対応するbを b1,b2,b3として並び替えたうえで
111
+ # sum = 0.9999999999999998
70
112
 
71
- ak*bk≧0となる場合には
72
-
73
- ・h≦a1  → [p1+p2+p3]
74
-
75
- ・a1<h≦a2 → [p2+p3]
76
-
77
- ・a2<h≦a3 → [p3]
78
-
79
- の各範囲(定義域といいます)における矢印の右側に記した直線と、直線y=1の交点のx座標が、求めるべきhの値になるということがわかります。
80
-
81
-
82
-
83
-
84
-
85
-
86
-
87
- y=Ax+B と y=Cの交点は、yにCを代入して
88
-
89
- C=Ax+B を解いて
90
-
91
- x=(C-B)/A (ただしA≠0。A=0のときは解なし)
92
-
93
- となります
113
+ ```
94
-
95
-
96
-
97
- これに倣えば
98
-
99
- y = bk(ak - h) と y=1 の交点は
100
-
101
- 1 = bk(ak - h)
102
-
103
- 1/bk = ak - h
104
-
105
- h= ak - 1/bk (ただし bk≠0。 bk=0の場合は解なし)
106
-
107
-
108
-
109
- となります。
110
-
111
-
112
-
113
- あとは上記の内容をpythonで実装するだけです。
114
-
115
-
116
-
117
- 詳しい人はpulpか何かでスマートな解き方を示してくれるかもしれませんが。

5

fix

2020/08/03 15:42

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -1,6 +1,4 @@
1
- 文系なので数学的知識は中学数学までしかないのですが、それで解く向性だけ記します。
1
+ 考え方だけ記します。
2
-
3
-
4
2
 
5
3
  具体的な数字を与えて考えてみましょう。たとえば
6
4
 
@@ -58,8 +56,6 @@
58
56
 
59
57
  p1+p2+p3 = yとして、(h, y)のグラフを上記に従ってノートかなんかに描いてみましょう。
60
58
 
61
- **わからなかったら中学数学からやり直してください**
62
-
63
59
 
64
60
 
65
61
  すると、上記の場合で
@@ -94,7 +90,7 @@
94
90
 
95
91
  x=(C-B)/A (ただしA≠0。A=0のときは解なし)
96
92
 
97
- となります(これも中学数学でわかるはずですよね?)
93
+ となります
98
94
 
99
95
 
100
96
 

4

fix

2020/08/02 14:49

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -72,7 +72,7 @@
72
72
 
73
73
  a1≦a2≦a3として、a1,a2,a3に対応するbを b1,b2,b3として並び替えたうえで
74
74
 
75
-
75
+ ak*bk≧0となる場合には
76
76
 
77
77
  ・h≦a1  → [p1+p2+p3]
78
78
 

3

fix

2020/08/02 14:05

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -80,7 +80,7 @@
80
80
 
81
81
  ・a2<h≦a3 → [p3]
82
82
 
83
- の各範囲(定義域といいます)における矢尻氏の右側に記した直線と、直線y=1の交点のx座標が、求めるべきhの値になるということがわかります。
83
+ の各範囲(定義域といいます)における矢の右側に記した直線と、直線y=1の交点のx座標が、求めるべきhの値になるということがわかります。
84
84
 
85
85
 
86
86
 

2

fix

2020/08/02 13:57

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -52,7 +52,7 @@
52
52
 
53
53
  ・3<hの場合
54
54
 
55
- p1+p2+p3 = 0x
55
+ p1+p2+p3 = 0
56
56
 
57
57
 
58
58
 
@@ -62,25 +62,25 @@
62
62
 
63
63
 
64
64
 
65
- すると、
65
+ すると、上記の場合で
66
66
 
67
67
  p1+p2+p3 (= y)=1となるのは、 直線y=6*(3-h) が直線 y=1と交わる点のx座標ということになります。
68
68
 
69
69
 
70
70
 
71
- 上記を一般化すると、
71
+ 一般化すると、
72
72
 
73
73
  a1≦a2≦a3として、a1,a2,a3に対応するbを b1,b2,b3として並び替えたうえで
74
74
 
75
75
 
76
76
 
77
- ・h≦a1
77
+ ・h≦a1  → [p1+p2+p3]
78
78
 
79
- ・a1<h≦a2
79
+ ・a1<h≦a2 → [p2+p3]
80
80
 
81
- ・a2<h≦a3
81
+ ・a2<h≦a3 → [p3]
82
82
 
83
- の各範囲(定義域といいます)における直線(h,y)と、直線y=1の交点のx座標が、求めるべきhの値になるということがわかります。
83
+ の各範囲(定義域といいます)における矢尻氏の右側に記した直線と、直線y=1の交点のx座標が、求めるべきhの値になるということがわかります。
84
84
 
85
85
 
86
86
 

1

修正

2020/08/02 13:56

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -106,7 +106,7 @@
106
106
 
107
107
  1/bk = ak - h
108
108
 
109
- h= ak - 1/bk ただし bk≠1
109
+ h= ak - 1/bk ただし bk≠0。 bk=0の場合は解なし)
110
110
 
111
111
 
112
112
 
@@ -115,3 +115,7 @@
115
115
 
116
116
 
117
117
  あとは上記の内容をpythonで実装するだけです。
118
+
119
+
120
+
121
+ 詳しい人はpulpか何かでスマートな解き方を示してくれるかもしれませんが。