Piirissä on leikkijää, jotka on numeroitu . Vuoro kiertää piirissä ja joka toinen leikkijä lähtee pois, kunnes piiri on tyhjä. Tehtäväsi on selvittää järjestys, jossa leikkijät poistuvat.
Esimerkiksi kun , alkutilanne näyttää tältä:
Leikki alkaa leikkijästä ja vuoro kiertää myötäpäivään. Ensin piiristä poistuu leikkijä ja siitä eteenpäin joka toinen leikkijä. Tässä tapauksessa leikkijät poistuvat järjestyksessä .
Toteuta tiedostoon circlegame.py
funktio find_order
, jolle annetaan parametrina leikkijöiden määrä . Funktion tulee palauttaa listana poistumisjärjestys.
Funktiosi tulee toimia tehokkaasti myös suurilla :n arvoilla. Leikkijöiden poistaminen listan keskeltä olisi liian hidasta. Parempi tapa on esimerkiksi lisätä kierroksen aikana jäljelle jäävät leikkijät uuteen listaan.
Seuraavassa koodipohjassa viimeisessä testissä ja näytetään viisi viimeistä poistujaa. Funktiosi tulee toimia tehokkaasti tässäkin tapauksessa.
def find_order(n): # TODO if __name__ == "__main__": print(find_order(1)) # [1] print(find_order(2)) # [2, 1] print(find_order(3)) # [2, 1, 3] print(find_order(7)) # [2, 4, 6, 1, 5, 3, 7] order = find_order(10**5) print(order[-5:]) # [52545, 85313, 36161, 3393, 68929]