Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for One line Drawing by mortonfox
from itertools import groupby
def draw(segments):
segments = list(segments)
allvertices = sorted(sum([[seg[:2], seg[2:]] for seg in segments], []))
oddvertices = []
evenvertices = []
for vertex, vertlist in groupby(allvertices):
if len(list(vertlist)) % 2:
oddvertices.append(vertex)
else:
evenvertices.append(vertex)
oddcount = len(oddvertices)
tour = []
def make_tour(start, end):
subtour = [start]
vertex = start
while True:
for seg in segments:
if seg[:2] == vertex:
other_vertex = seg[2:]
elif seg[2:] == vertex:
other_vertex = seg[:2]
else:
continue
subtour.append(other_vertex)
vertex = other_vertex
segments.remove(seg)
break
if vertex == end:
return subtour
def continue_tour():
for seg in segments:
if seg[:2] in tour:
vertex = seg[:2]
break
elif seg[2:] in tour:
vertex = seg[2:]
break
subtour = make_tour(vertex, vertex)
tourpos = tour.index(vertex)
tour[tourpos:tourpos+1] = subtour
if oddcount == 0:
tour = make_tour(evenvertices[0], evenvertices[0])
elif oddcount == 2:
tour = make_tour(oddvertices[0], oddvertices[1])
else:
return []
while segments:
continue_tour()
return tour
if __name__ == '__main__':
#These "asserts" using only for self-checking and not necessary for auto-testing
def checker(func, in_data, is_possible=True):
user_result = func(in_data)
if not is_possible:
if user_result:
print("How did you draw this?")
return False
else:
return True
if len(user_result) < 2:
print("More points please.")
return False
data = list(in_data)
for i in range(len(user_result) - 1):
f, s = user_result[i], user_result[i + 1]
if (f + s) in data:
data.remove(f + s)
elif (s + f) in data:
data.remove(s + f)
else:
print("The wrong segment {}.".format(f + s))
return False
if data:
print("You forgot about {}.".format(data[0]))
return False
return True
assert checker(draw,
{(1, 2, 1, 5), (1, 2, 7, 2), (1, 5, 4, 7), (4, 7, 7, 5)}), "Example 1"
assert checker(draw,
{(1, 2, 1, 5), (1, 2, 7, 2), (1, 5, 4, 7),
(4, 7, 7, 5), (7, 5, 7, 2), (1, 5, 7, 2), (7, 5, 1, 2)},
False), "Example 2"
assert checker(draw,
{(1, 2, 1, 5), (1, 2, 7, 2), (1, 5, 4, 7), (4, 7, 7, 5),
(7, 5, 7, 2), (1, 5, 7, 2), (7, 5, 1, 2), (1, 5, 7, 5)}), "Example 3"
Dec. 24, 2016