Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit ba77733

Browse files
committed
Added new coding challenge
1 parent 5efb82e commit ba77733

File tree

1 file changed

+90
-0
lines changed

1 file changed

+90
-0
lines changed

‎src/trip_stops.py‎

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
# -*- coding: utf-8 -*-
2+
import random
3+
import math
4+
import itertools
5+
6+
from concurrent.futures.thread import ThreadPoolExecutor
7+
8+
"""
9+
Return the number of possible combinations of three kind of stops during a trip, before
10+
a previous combination must be repeated.
11+
12+
Each list represent the distance from the trip origin where the stop is placed.
13+
Each list can be disordered.
14+
15+
Example:
16+
17+
A = [29, 50]
18+
B = [61, 37]
19+
C = [37, 70]
20+
21+
(29, 37, 70), (29, 61, 70), (50, 61, 70)
22+
23+
Should return 3.
24+
"""
25+
26+
27+
def solution_v1(A, B, C):
28+
29+
def countt(it):
30+
itt = filter(lambda t: t[0] < t[1] and t[1] < t[2], it[0])
31+
return sum(1 for _ in itt)
32+
33+
N = len(A)
34+
NN = N * N * N
35+
36+
prod = itertools.product(A, B, C)
37+
t = ThreadPoolExecutor(4)
38+
chunk = math.ceil(NN / 4)
39+
40+
f1 = t.submit(countt, (itertools.islice(prod, chunk),))
41+
f2 = t.submit(countt, (itertools.islice(prod, chunk),))
42+
f3 = t.submit(countt, (itertools.islice(prod, chunk),))
43+
f4 = t.submit(countt, (itertools.islice(prod, chunk),))
44+
count = f1.result() + f2.result() + f3.result() + f4.result()
45+
return count if count < 1000000000 else -1
46+
47+
48+
if __name__ == '__main__':
49+
50+
A = [29, 50]
51+
B = [61, 37]
52+
C = [37, 70]
53+
54+
ans = solution_v1(A, B, C)
55+
assert(ans == 3)
56+
57+
A = [5]
58+
B = [5]
59+
C = [5]
60+
61+
ans = solution_v1(A, B, C)
62+
assert(ans == 0)
63+
64+
A = [5]
65+
B = [6]
66+
C = [7]
67+
68+
ans = solution_v1(A, B, C)
69+
assert(ans == 1)
70+
71+
A = [5, 6]
72+
B = [5, 7]
73+
C = [5, 8]
74+
75+
ans = solution_v1(A, B, C)
76+
assert(ans == 2)
77+
78+
N = 100
79+
A = [random.randint(1, 500) for x in range(N)]
80+
B = [random.randint(501, 1000) for x in range(N)]
81+
C = [random.randint(1001, 1500) for x in range(N)]
82+
ans = solution_v1(A, B, C)
83+
assert(ans == N * N * N)
84+
85+
N = 100
86+
A = [random.randint(1, 500) for x in range(N)]
87+
B = [random.randint(501, 1000) for x in range(N)]
88+
C = [x for x in range(N - 1)] + [1001]
89+
ans = solution_v1(A, B, C)
90+
assert(ans == N * N * 1)

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /