```
def final_door_state(events: list[str]) -> str:
    moves = {
        "unlock": "closed",
        "lock": "locked",
        "open": "open",
        "close": "closed",
    }
    state = "locked"
    ignored = 0
    for event in events:
        if event not in moves:
            raise ValueError(f"Invalid event: {event}")
        new_state = moves.get(event)
        if new_state != state:
            state = new_state
        elif event != ignore_event(state):
            ignored += 1
    return state + ":" + str(ignored)

def ignore_event(state: str) -> str:
    if state == "locked":
        return "unlock"
    elif state == "closed":
        return "open"
    elif state == "open":
        return "close"
    elif state == "closed":
        return "lock"
```