Problema
En cada movimiento se retiran dos monedas de un montón y una moneda del otro. Se permite cualquiera de las dos orientaciones. Nunca puedes retirar más monedas de las que quedan en un montón. Determina si es posible que ambos montones terminen en cero.
Implementa coin_piles(left, right).
Entrada
left: El número de monedas en el montón izquierdo.
right: El número de monedas en el montón derecho.
Salida
Devuelve true si ambos montones pueden vaciarse; de lo contrario, devuelve false.
Restricciones
0 ≤ left, right ≤ 1,000,000,000. Dos montones vacíos ya se consideran un resultado exitoso.
Ejemplos
Entrada:
left = 4
right = 2
Salida esperada:
expected = True
Entrada:
long long left = 4;
long long right = 2;
Salida esperada:
bool expected = true;
Entrada:
long left = 4;
long right = 2;
Salida esperada:
bool expected = true;
Explicación
Retira (2, 1) dos veces: (4, 2) → (2, 1) → (0, 0).
Entrada:
left = 4
right = 1
Salida esperada:
expected = False
Entrada:
long long left = 4;
long long right = 1;
Salida esperada:
bool expected = false;
Entrada:
long left = 4;
long right = 1;
Salida esperada:
bool expected = false;
Explicación
El único primer movimiento posible deja (2, 0), tras lo cual no hay forma de vaciar el montón izquierdo.
Cómo abordarlo
Inténtalo primero por tu cuenta y luego abre las pistas una a una.
Pista 1
Cada movimiento elimina exactamente tres monedas en total, así que la suma total debe ajustarse a ese patrón.
Pista 2
Ninguna pila puede bajar de cero, así que una pila no puede superar lo que la otra puede soportar.
Pista 3
Comprueba tanto el total como la diferencia entre las pilas.
Complejidad esperada
tiempo O(1), espacio extra O(1)
Referencias
Este reto está adaptado para CodeUtility. Sigue el enunciado y las restricciones indicadas arriba.