예제 #1
0
def deal(d: deque, count: int = 0) -> None:
    if count == 0:
        d.reverse()
        return

    _d: deque = d.copy()
    while len(_d):
        d[0] = _d.popleft()
        d.rotate(-count)
예제 #2
0
def recursiveBattle(p1: deque, p2: deque, depth=1):
    p1alreadySeen = set()
    p2alreadySeen = set()

    while len(p1) != 0 and len(p2) != 0:
        deck1hash = ",".join(str(c) for c in p1)
        deck2hash = ",".join(str(c) for c in p2)
        if deck1hash in p1alreadySeen or deck2hash in p2alreadySeen:
            return (1, 0)
        else:
            p1alreadySeen.add(deck1hash)
            p2alreadySeen.add(deck2hash)

        a = p1.popleft()
        b = p2.popleft()

        winner = 0
        if a <= len(p1) and b <= len(p2):
            winner, _ = recursiveBattle(deque(list(p1)[:a]),
                                        deque(list(p2)[:b]), depth + 1)
        else:
            winner = 1 if a > b else 2

        if winner == 1:
            p1.append(a)
            p1.append(b)
        else:
            p2.append(b)
            p2.append(a)

    winner = 1 if len(p2) == 0 else 2

    p1.reverse()
    p2.reverse()

    return (winner, sum([(i + 1) * x for i, x in enumerate(p1 + p2)]))
예제 #3
0
def reverse_deque(source_deque: deque) -> None:
    print(f'Reversing {source_deque} ... ', end='')
    source_deque.reverse()
    print(f'-> {source_deque}')
예제 #4
0
def calculate_score(player_cards: deque) -> int:
    player_cards.reverse()
    tot_val = 0
    for val, card in enumerate(player_cards, start=1):
        tot_val += val * card
    return tot_val
예제 #5
0
def dealIntoNewStack(cards: deque):
    cards.reverse()
    if verbose: print(f"deal into new stack: {cards}")
    return cards