1votos

La tela de araña en Python

por josejuan hace 6 años

Por poner una solución en Python con animación en tiempo real.

Un problema fácil de resolver imperativamente... ¿y funcionalmente? (inmutabilidad y transparencia referencial). Aun así (el enfoque funcional), creo que puede ser un buen kata para practicar punteros y/o TAD's.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# -*- coding: latin-1 -*- 
 
# esta sería una solución imperativa en Python 
import random 
 
N = 40 # Tamaño del grafo NxN nodos. 
R = range(N) 
G = [[1 if x == y else 0 for x in R] for y in R] # grafo 
A = [(x, x) for x in R] # arañas 
 
def inc(c, d): 
        n = c + d * random.choice([-1, 1]) 
        if n < 0: return 1 
        if n >= N: return N - 2 
        return n 
 
def doStep(): 
        for i in R: 
                (dx, dy) = random.choice([(0, 1), (1, 0)]) 
                A[i] = (inc(A[i][0], dx), inc(A[i][1], dy)) 
                G[A[i][0]][A[i][1]] += 1 
 
 
 
 
 
# si queremos animar el tema... 
import sys 
import pygame 
 
W = 20 # Tamaño de cada arista. 
 
# Colores 
white = (255, 255, 255) 
black = (  0,   0,   0) 
gray  = (150, 150, 150) 
 
pygame.init() 
pygame.display.set_caption('Tela de araña') 
g = pygame.display.set_mode(((N + 1) * W, (N + 1) * W)) 
g.fill(white) 
 
def C(z): return (z + 1) * W 
def Q(a): return (C(a[0]), C(a[1])) 
 
while(1): 
        if pygame.event.peek(3): 
                sys.exit(0) 
        B = A[:] 
        doStep() 
        for t in range(10): 
                pygame.time.wait(10) 
                g.fill(white) 
                S = {} 
                for c in R: 
                        for r in R: 
                                nc = G[c][r] / 1 
                                pc = (C(c), C(r)) 
                                for i in range(nc): 
                                        z = int((255 * (nc - i)) / nc) 
                                        if not z in S: S[z] = [] 
                                        S[z].append((pc, nc - i)) 
                K = S.keys() 
                K.reverse() 
                for k in K: 
                        for c in S[k]: 
                                pygame.draw.circle(g, (k, k, k), c[0], c[1]) 
                for c in R: 
                        pygame.draw.line(g, gray, (C(c), W), (C(c), N * W)) 
                        pygame.draw.line(g, gray, (W, C(c)), (N * W, C(c))) 
                f = 0.1 * t 
                j = 1.0 - f 
                for i in R: 
                        (ax, ay), (bx, by) = Q(A[i]), Q(B[i]) 
                        pygame.draw.circle(g, black, (int(ax * f + bx * j), int(ay * f + by * j)), W >> 2) 
                pygame.display.flip() 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.