예제 #1
0
파일: zad1.py 프로젝트: weed478/asd1
"""


from zad1testy import runtests


def insertion_sort(A, p, r):
    for i in range(p + 1, r):
        for j in range(i, p, -1):
            if A[j - 1][0] > A[j][0]:
                A[j - 1], A[j] = A[j], A[j - 1]
            else:
                break


def chaos_index(T):
    n = len(T)

    A = [(T[i], i) for i in range(n)]

    insertion_sort(A, 0, n)

    k = 0
    for i in range(n):
        k = max(k, abs(A[i][1] - i))

    return k


runtests(chaos_index)
예제 #2
0
    def build_G(u, v):
        for u_prim in range(n):
            for v_prim in range(n):
                if (M[u][u_prim] != 0 or u == u_prim) and \
                   (M[v][v_prim] != 0 or v == v_prim) and \
                   dist[u_prim][v_prim] >= d and \
                   (not (u_prim == v and v_prim == u)):

                    # dodajemy krawędź między ustawieniami uv i uv_prim jeśli:
                    # - jest krawędz z u do u_prim i v do v_prim (lub stoimy w miejscu)
                    # - odległość (separacja) w nowym ustawieniu >= d
                    # - nie idziemy tą samą krawędzią w przeciwnych kierunkach

                    G[u][v].append(
                        ((u_prim, v_prim), M[u][u_prim] + M[v][v_prim]))

    for u in range(n):
        for v in range(n):
            build_G(u, v)

    d, parent = dijkstra(G, (x, y))

    # zamiast dijkstry DFS ale zostawiłem dijkstrę bo ładnie działa (DFS oczywiście też)
    # d, parent = dfs(G, x, y)

    return rebuild_path(y, x, parent)


runtests(keep_distance)
예제 #3
0
    def is_empty(self):
        return self.elements == 0


def dijkstra(G, s, t):
    n = len(G)
    distances = [float("inf")] * n
    distances[s] = 0
    q = PriorityQueue(100)
    q.put((s, 0), distances)
    while not q.is_empty():
        v = q.get()
        for i in range(n):
            if G[v[0]][i] > 0 and G[v[0]][i] != v[1]:
                if distances[i] > distances[v[0]] + G[v[0]][i]:
                    distances[i] = distances[v[0]] + G[v[0]][i]
                    q.put((i, G[v[0]][i]), distances)
    return distances[t]


def islands(G, A, B):
    x = dijkstra(G, A, B)
    if x < float('inf'):
        return x
    else:
        return None


runtests(islands)
예제 #4
0
        x_letter_pos[ord_i(x[i])].append(i)
        y_letter_pos[ord_i(y[i])].append(i)

    for ci in range(num_chars):
        # dopasuj wszystkie wystąpienia
        while len(x_letter_pos[ci]) > 0:
            if len(y_letter_pos[ci]) == 0:
                # nie ma do czego dopasować
                return False

            # weż pierwsze wystąpienia
            xi = x_letter_pos[ci].popleft()
            yi = y_letter_pos[ci].popleft()

            # jeśli pierwsze wystąpienie znaku w x nie da się dopasować do pierwszego wystąpienia w y
            # to znaczy, że znak w y nie można dopasować do żadnego innego znaku w x
            if abs(xi - yi) > t:
                return False

    return True


if __name__ == "__main__":
    print(tanagram("kotomysz", "tokmysoz", 3))
    print(tanagram2("kotomysz", "tokmysoz", 3))

    print(tanagram("kotomysz", "tokmysoz", 2))
    print(tanagram2("kotomysz", "tokmysoz", 2))

    runtests(tanagram2)