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

回答編集履歴

11

f

2020/08/03 16:03

投稿

sfdust
sfdust

スコア1137

answer CHANGED
@@ -11,7 +11,7 @@
11
11
  となります。
12
12
  p1~p3のいずれかが0となるようなhは除外するのですから、結局、
13
13
  直交座標面(h, y)において
14
- 直線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
14
+ 直線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
15
15
  = -(t[0] + t[1] + t[2])*h + (t[0]*s[0] + t[1]*s[1] + t[2]*s[2])
16
16
 
17
17
  が直線 y=1と交わるときのh座標を算出し

10

f

2020/08/03 16:03

投稿

sfdust
sfdust

スコア1137

answer CHANGED
@@ -30,20 +30,20 @@
30
30
 
31
31
  ```lang-python
32
32
  def func1(s, t):
33
- x = sum(t) # t[0] + t[1] + t[2] ...
33
+ x = sum(t) # t[0] + t[1] + t[2]...
34
- k = sum(i*j for i, j in zip(s, t)) # [0]*s[0] + t[1]*s[1] + t[2]*s[2] ...
34
+ k = sum(ss*tt for ss, tt in zip(s, t)) # [0]*s[0] + t[1]*s[1] + t[2]*s[2]...
35
35
 
36
36
  if x == 0:
37
37
  h = None
38
38
  else:
39
39
  h = (k-1)/x
40
40
  hh = h
41
- for p in range(len(t)):
41
+ for ss, tt in zip(s, t):
42
- if t[p]*(s[p]-hh) <= 0:
42
+ if tt*(ss - hh) <= 0:
43
43
  h = None
44
44
  if h is None:
45
45
  return None
46
- return tuple(t[i]*(s[i] - h) for i in range(len(t)))
46
+ return tuple(tt*(ss - h) for ss, tt in zip(s, t))
47
47
  ```
48
48
  実行例
49
49
  ```lang-python

9

追加

2020/08/03 16:00

投稿

sfdust
sfdust

スコア1137

answer CHANGED
@@ -56,4 +56,14 @@
56
56
 
57
57
  # answer= (0.13333333333333328, 0.3999999999999999, 0.4666666666666666)
58
58
  # sum = 0.9999999999999998
59
+
60
+ s = [1, 2, 3, 2]
61
+ t = [0.2, 0.3, 0.2, 0.1]
62
+ # answer= (0.04999999999999996, 0.37499999999999994, 0.45, 0.12499999999999999)
63
+ # sum = 1.0
64
+
65
+ s = [1, 2, 3, 2]
66
+ t = [0.2, 0.3, 0.2, 0.5]
67
+ # answer= None
68
+ # sum = None
59
69
  ```

8

修正

2020/08/03 15:54

投稿

sfdust
sfdust

スコア1137

answer CHANGED
@@ -30,18 +30,20 @@
30
30
 
31
31
  ```lang-python
32
32
  def func1(s, t):
33
- x = sum(t) # t[0] + t[1] + t[2]
33
+ x = sum(t) # t[0] + t[1] + t[2] ...
34
- k = sum(i*j for i, j in zip(s, t)) # [0]*s[0] + t[1]*s[1] + t[2]*s[2]
34
+ k = sum(i*j for i, j in zip(s, t)) # [0]*s[0] + t[1]*s[1] + t[2]*s[2] ...
35
35
 
36
36
  if x == 0:
37
37
  h = None
38
38
  else:
39
39
  h = (k-1)/x
40
40
  hh = h
41
- for p in range(3):
41
+ for p in range(len(t)):
42
42
  if t[p]*(s[p]-hh) <= 0:
43
+ h = None
44
+ if h is None:
43
- return None
45
+ return None
44
- return tuple(t[i]*(s[i] - h) for i in range(3))
46
+ return tuple(t[i]*(s[i] - h) for i in range(len(t)))
45
47
  ```
46
48
  実行例
47
49
  ```lang-python

7

修正

2020/08/03 15:47

投稿

sfdust
sfdust

スコア1137

answer CHANGED
@@ -14,7 +14,7 @@
14
14
  直線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
15
15
  = -(t[0] + t[1] + t[2])*h + (t[0]*s[0] + t[1]*s[1] + t[2]*s[2])
16
16
 
17
- が直線 y=1と交わるhを算出し
17
+ が直線 y=1と交わるときのh座標を算出し
18
18
  求めたhがいずれのk=0,1,2についてもpk=tk(sk - h)>0を満たしているか
19
19
  確認すればよいのではないでしょうか。
20
20
 

6

内容を修正しました

2020/08/03 15:44

投稿

sfdust
sfdust

スコア1137

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

5

fix

2020/08/03 15:42

投稿

sfdust
sfdust

スコア1137

answer CHANGED
@@ -1,5 +1,4 @@
1
- 文系なので数学的知識は中学数学までしかないのですが、それで解く向性だけ記します。
1
+ 考え方だけ記します。
2
-
3
2
  具体的な数字を与えて考えてみましょう。たとえば
4
3
  a = [1, 2, 3]
5
4
  b = [4, 5, 6]
@@ -28,7 +27,6 @@
28
27
  p1+p2+p3 = 0
29
28
 
30
29
  p1+p2+p3 = yとして、(h, y)のグラフを上記に従ってノートかなんかに描いてみましょう。
31
- **わからなかったら中学数学からやり直してください**
32
30
 
33
31
  すると、上記の場合で
34
32
  p1+p2+p3 (= y)=1となるのは、 直線y=6*(3-h) が直線 y=1と交わる点のx座標ということになります。
@@ -46,7 +44,7 @@
46
44
  y=Ax+B と y=Cの交点は、yにCを代入して
47
45
  C=Ax+B を解いて
48
46
  x=(C-B)/A (ただしA≠0。A=0のときは解なし)
49
- となります(これも中学数学でわかるはずですよね?)
47
+ となります
50
48
 
51
49
  これに倣えば
52
50
  y = bk(ak - h) と y=1 の交点は

4

fix

2020/08/02 14:49

投稿

sfdust
sfdust

スコア1137

answer CHANGED
@@ -35,7 +35,7 @@
35
35
 
36
36
  一般化すると、
37
37
  a1≦a2≦a3として、a1,a2,a3に対応するbを b1,b2,b3として並び替えたうえで
38
-
38
+ ak*bk≧0となる場合には
39
39
  ・h≦a1  → [p1+p2+p3]
40
40
  ・a1<h≦a2 → [p2+p3]
41
41
  ・a2<h≦a3 → [p3]

3

fix

2020/08/02 14:05

投稿

sfdust
sfdust

スコア1137

answer CHANGED
@@ -39,7 +39,7 @@
39
39
  ・h≦a1  → [p1+p2+p3]
40
40
  ・a1<h≦a2 → [p2+p3]
41
41
  ・a2<h≦a3 → [p3]
42
- の各範囲(定義域といいます)における矢尻氏の右側に記した直線と、直線y=1の交点のx座標が、求めるべきhの値になるということがわかります。
42
+ の各範囲(定義域といいます)における矢の右側に記した直線と、直線y=1の交点のx座標が、求めるべきhの値になるということがわかります。
43
43
 
44
44
 
45
45
 

2

fix

2020/08/02 13:57

投稿

sfdust
sfdust

スコア1137

answer CHANGED
@@ -25,21 +25,21 @@
25
25
  ・2<h≦3の場合
26
26
  p1+p2+p3 = 0+0+p3 = 6*(3-h)
27
27
  ・3<hの場合
28
- p1+p2+p3 = 0x
28
+ p1+p2+p3 = 0
29
29
 
30
30
  p1+p2+p3 = yとして、(h, y)のグラフを上記に従ってノートかなんかに描いてみましょう。
31
31
  **わからなかったら中学数学からやり直してください**
32
32
 
33
- すると、
33
+ すると、上記の場合で
34
34
  p1+p2+p3 (= y)=1となるのは、 直線y=6*(3-h) が直線 y=1と交わる点のx座標ということになります。
35
35
 
36
- 上記を一般化すると、
36
+ 一般化すると、
37
37
  a1≦a2≦a3として、a1,a2,a3に対応するbを b1,b2,b3として並び替えたうえで
38
38
 
39
- ・h≦a1
39
+ ・h≦a1  → [p1+p2+p3]
40
- ・a1<h≦a2
40
+ ・a1<h≦a2 → [p2+p3]
41
- ・a2<h≦a3
41
+ ・a2<h≦a3 → [p3]
42
- の各範囲(定義域といいます)における直線(h,y)と、直線y=1の交点のx座標が、求めるべきhの値になるということがわかります。
42
+ の各範囲(定義域といいます)における矢尻氏の右側に記した直線と、直線y=1の交点のx座標が、求めるべきhの値になるということがわかります。
43
43
 
44
44
 
45
45
 

1

修正

2020/08/02 13:56

投稿

sfdust
sfdust

スコア1137

answer CHANGED
@@ -52,8 +52,10 @@
52
52
  y = bk(ak - h) と y=1 の交点は
53
53
  1 = bk(ak - h)
54
54
  1/bk = ak - h
55
- h= ak - 1/bk ただし bk≠1
55
+ h= ak - 1/bk ただし bk≠0。 bk=0の場合は解なし)
56
56
 
57
57
  となります。
58
58
 
59
- あとは上記の内容をpythonで実装するだけです。
59
+ あとは上記の内容をpythonで実装するだけです。
60
+
61
+ 詳しい人はpulpか何かでスマートな解き方を示してくれるかもしれませんが。