CSES - Listapeli

Listapelissä kaksi pelaajaa poistaa vuorotellen lukuja listasta. Joka vuorolla pelaajan tulee poistaa listalta joko ensimmäinen tai viimeinen luku. Peli päättyy, kun kaikki luvut on poistettu.

Pelin voittaa pelaaja, jonka poistamien lukujen summa on suurempi. Jos kummankin pelaajan lukujen summa on sama, tuloksena on tasapeli. Tehtäväsi on selvittää, voittaako pelin aloittaja varmasti, jos hän pelaa optimaalisesti.

Esimerkiksi jos lista on [2,1,3][2,1,3], aloittaja voittaa varmasti, koska hän voi poistaa ensin luvun 33 ja sitten luvun 11. Pelin lopussa aloittajan lukujen summa on 44 ja toisen pelaajan lukujen summa on 22.

Jos taas lista on [1,3,1][1,3,1], aloittaja ei voita varmasti, koska hänen täytyy poistaa ensin luku 11. Tämän jälkeen toinen pelaaja voi poistaa luvun 33, mikä takaa hänelle pelin voiton.

Toteuta tiedostoon listgame.py funktio first_wins, jolle annetaan lista kokonaislukuja. Funktion tulee palauttaa True, jos pelin aloittaja voittaa varmasti, ja muuten False.

Funktion tulee toimia tehokkaasti, kun listalla on 1501 \dots 50 lukua.

def first_wins(numbers):
    # TODO

if __name__ == "__main__":
    print(first_wins([2, 1, 3])) # True
    print(first_wins([1, 3, 1])) # False

    print(first_wins([1])) # True
    print(first_wins([1, 1])) # False
    print(first_wins([1, 5])) # True
    print(first_wins([1, 1, 1])) # True
    print(first_wins([1, 2, 3, 4])) # True
    print(first_wins([1, 3, 3, 7, 4, 2, 1])) # False

    print(first_wins([1] * 50)) # False
    print(first_wins([1, 2] * 25)) # True