回答編集履歴

3

説明追加

2023/03/20 00:53

投稿

ozwk
ozwk

スコア13512

test CHANGED
@@ -1,6 +1,49 @@
1
1
  ちゃんとした説明になってなかったのでイチから書き直しました。元の回答は編集履歴から確認してください。
2
2
 
3
3
  ---
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
+ 実例を見てみます。
4
47
 
5
48
  Eran2がrandintの上限を返すときを考えます。上限は`min(end, 4 + start) + 1`です。
6
49
  つまり
@@ -61,3 +104,6 @@
61
104
  一方で`removalside[: temp2]`は`[]` になります。
62
105
  なので`[0, 1]`が捨てられます。
63
106
 
107
+ ---
108
+
109
+

2

書き直し

2023/03/20 00:26

投稿

ozwk
ozwk

スコア13512

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

1

追記

2023/03/16 03:16

投稿

ozwk
ozwk

スコア13512

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