回答編集履歴
3
説明追加
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
書き直し
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
|
-
|
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
|
-
|
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
追記
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
|
+
|