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

回答編集履歴

3

説明追加

2023/03/20 00:53

投稿

ozwk
ozwk

スコア13553

answer CHANGED
@@ -2,6 +2,49 @@
2
2
 
3
3
  ---
4
4
 
5
+ 関数`Merement`内のこの部分について:
6
+ ```python
7
+ target = removalside[len(removalside) + temp2: len(removalside)] + target
8
+ removalside = removalside[: temp2]
9
+ ```
10
+
11
+ 質問者様の意図を想像するに、長さ`N`のリスト`arr`と負の整数`i`があったとき、
12
+
13
+ `arr[: i]`が
14
+ `arr[: N + i]`と同じ結果になる前提で書かれたコードかと思いますが、
15
+ これは`-2*N < i < -N`の範囲においては結果が異なります。
16
+
17
+ 簡単な検証用コードを書きました。
18
+
19
+ ```python
20
+ N=5
21
+ arr = list(range(N))
22
+ for i in range(1, 3*N):
23
+ print(i, arr[:-i], arr[:N-i])
24
+ ```
25
+
26
+ 結果はこちらです
27
+ ```text
28
+ 1 [0, 1, 2, 3] [0, 1, 2, 3]
29
+ 2 [0, 1, 2] [0, 1, 2]
30
+ 3 [0, 1] [0, 1]
31
+ 4 [0] [0]
32
+ 5 [] []
33
+ 6 [] [0, 1, 2, 3]
34
+ 7 [] [0, 1, 2]
35
+ 8 [] [0, 1]
36
+ 9 [] [0]
37
+ 10 [] []
38
+ 11 [] []
39
+ 12 [] []
40
+ 13 [] []
41
+ 14 [] []
42
+ ```
43
+
44
+ ---
45
+
46
+ 実例を見てみます。
47
+
5
48
  Eran2がrandintの上限を返すときを考えます。上限は`min(end, 4 + start) + 1`です。
6
49
  つまり
7
50
  ```python
@@ -60,3 +103,6 @@
60
103
  `removalside[3 - 4: 3]`となり、`[2]`になります
61
104
  一方で`removalside[: temp2]`は`[]` になります。
62
105
  なので`[0, 1]`が捨てられます。
106
+
107
+ ---
108
+

2

書き直し

2023/03/20 00:26

投稿

ozwk
ozwk

スコア13553

answer CHANGED
@@ -1,37 +1,62 @@
1
- どういう状況で抜けが発生するか実際に動かしてました。
1
+ ちゃんとた説明になっったのでイチから書き直しました。元の回答は編集履歴から確認してください。
2
- すると以下のような状況でした:
3
2
 
3
+ ---
4
+
5
+ Eran2がrandintの上限を返すときを考えます。上限は`min(end, 4 + start) + 1`です。
6
+ つまり
4
7
  ```python
8
+ def Eran2(end: int, start: int = 1):
9
+ # temporary1 = random.randint(start, min(end, 4 + start) + 1)
5
- temporary1 = [28, 29, 30]
10
+ temporary1 = min(end, 4 + start) + 1
6
- temporary3 = [14, 15, 50, 16, 17, 31, 32, 33, 34, 1, 51, 52, 18, 35, 19, 20, 21, 22, 23, 36, 37, 38, 39, 53, 2, 3, 4, 5, 24, 54, 40, 41, 55, 25, 26, 42, 43, 44, 6, 7, 27, 8, 9, 10, 11]
11
+ return temporary1
7
12
  ```
8
13
 
9
- の状態で
10
- `temporary3, temporary1 = Merements(temporary3, temporary1)`
11
- 処理が走ってかつ`Merements``temp2 = -Eran2(temp1)`において
14
+ とき以下のような`Merements`の検証用コードを動かすと、
12
- `temp2 = -4`になったとき(後述)、
13
15
 
16
+ ```python
17
+ def Eran2(end: int, start: int = 1):
18
+ # temporary1 = random.randint(start, min(end, 4 + start) + 1)
19
+ temporary1 = min(end, 4 + start) + 1
14
- `temporary3`は
20
+ return temporary1
15
- `target = removalside[len(removalside) + temp2: len(removalside)] + target`
16
- つまり `target = [28, 29, 30][-1: -4] + target`
17
- つまり `target = [30] + target`
18
21
 
19
- `temporary1`は
20
- ` removalside = removalside[: temp2]`つまり `removalside = [28, 29, 30][: -4]`なので`[]`にされます。
21
22
 
23
+ def Merements(target: list, removalside: list):
24
+ temp1 = len(removalside)
25
+ if temp1 < 3:
26
+ target = removalside + target
27
+ removalside = []
28
+ else:
22
- なので[28, 29]が捨てられます。
29
+ temp2 = -Eran2(temp1)
30
+ target = removalside[len(
31
+ removalside) + temp2: len(removalside)] + target
32
+ removalside = removalside[: temp2]
33
+ return target, removalside
23
34
 
35
+ for i in range(10):
36
+ ys,xs = Merements([], list(range(i)))
37
+ print(i, xs, ys)
38
+ ```
24
39
 
40
+ 結果がこちら
41
+ ```text
42
+ 0 [] []
43
+ 1 [] [0]
44
+ 2 [] [0, 1]
45
+ 3 [] [2]
46
+ 4 [] [3]
47
+ 5 [] [4]
48
+ 6 [] [0, 1, 2, 3, 4, 5]
49
+ 7 [0] [1, 2, 3, 4, 5, 6]
50
+ 8 [0, 1] [2, 3, 4, 5, 6, 7]
51
+ 9 [0, 1, 2] [3, 4, 5, 6, 7, 8]
25
- さて
52
+ ```
26
- `temp2 = -4`得るか、つまり`Eran2(3)`が`4`にるかどうかです
53
+ i=3, 4, 5 のときに要素数ていいことわかりました。
27
- `RA.randint(1, min(3, 4 + 1) + 1)`、つまり`RA.randint(1, 4)`なのでありえます。(randint(a,b)はa以上b**以下** を返します。)
28
54
 
29
- というわけでPython自体ののバグではないです。
30
-
31
- ---
32
-
33
- どこいのかはそもそも目的が読取れなかったのでわかりせんが、
55
+ 試しに、`i=3`のとき、すなわち`Merements([], [0, 1, 2])`で何起きてのかを見てみます。
34
- `if temp1 < 3:`
56
+ このとき`temp2`は`-4`で、
57
+ `len(removalside)`は`3`になります。
35
-
58
+ すると、
36
- `temporary1 = RA.randint(start, min(end, 4 + start) + 1)`
59
+ `removalside[len(removalside) + temp2: len(removalside)]`
60
+ `removalside[3 - 4: 3]`となり、`[2]`になります
61
+ 一方で`removalside[: temp2]`は`[]` になります。
37
- 辺りが意図と異のでないのかとおもいます。
62
+ なので`[0, 1]`が捨てられます。

1

追記

2023/03/16 03:16

投稿

ozwk
ozwk

スコア13553

answer CHANGED
@@ -27,3 +27,11 @@
27
27
  `RA.randint(1, min(3, 4 + 1) + 1)`、つまり`RA.randint(1, 4)`なのでありえます。(randint(a,b)はa以上b**以下** を返します。)
28
28
 
29
29
  というわけでPython自体ののバグではないです。
30
+
31
+ ---
32
+
33
+ どこが悪いのかはそもそも目的が読み取れなかったのでわかりませんが、
34
+ `if temp1 < 3:`
35
+
36
+ `temporary1 = RA.randint(start, min(end, 4 + start) + 1)`
37
+ 辺りが意図と異なるのでないのかとおもいます。