class Rover:
    created = 0

    def __init__(self, x=0, y=0, coins=100, items=None):
        if not Rover.valid_coins(coins):
            raise ValueError("invalid coins")
        self.x = x
        self.y = y
        self._coins = coins
        if items is None:
            self.items = []
        else:
            self.items = list(items)
        Rover.created += 1

    def move(self, dx, dy):
        self.x += dx
        self.y += dy

    def distance_to(self, other):
        dx = self.x - other.x
        dy = self.y - other.y
        return (dx * dx + dy * dy) ** 0.5

    def spend(self, amount):
        if (type(amount) is not int
                or amount <= 0
                or amount > self._coins):
            return False
        self._coins -= amount
        return True

    def coins_left(self):
        return self._coins

    def pick(self, item):
        self.items.append(item)

    @classmethod
    def from_pair(cls, pair):
        return cls(pair[0], pair[1])

    @staticmethod
    def valid_coins(value):
        return type(value) is int and value >= 0

a = Rover(0, 0)
b = Rover.from_pair((3, 4))
print("start distance:", a.distance_to(b))
a.move(1, 1)
print("pay:", a.spend(30))
a.pick("apple")
print("a:", a.x, a.y, a.coins_left(), a.items)
print("b:", b.x, b.y, b.coins_left(), b.items)
