Obliczanie czasu w którym gracz wygrywał

0

Mam dane z zewnątrz, mianowicie pary tablic. W pierwszej siedzą czasy (w sekundach) w których pierwszy gracz zdobywał punkty, a w drugiej czasy w których punktował drugi. Ilość zdobytych punktów jest nieograniczona, rozgrywkę ogranicza czas gry (600 sekund). Dane są oczywiście posegregowane rosnąco.
Na przykład:


gracz2 = [150, 345, 401, 481, 521]```

Muszę obliczyć czas przez jaki dany gracz wygrywał (dla obu graczy, bez wliczania czasu w którym gracz remisował). Rozgrywka zaczyna się od remisu 0:0.
Wymiękam zupełnie przy tym zadaniu. Wie ktoś jak to napisać, albo chociaż co wyszukiwać?
1

Rozpisz to sobie po kroku, tj. gracz1 wygrywał od 27 do 150 sekundy, następnie przez 39 sekund był remis itd. potem będzie Ci łatwiej to przerobić na właściwy algorytm.

2

Dokładnie - tak, jak pisał @Markuz - zastanów się, jak to ugryźć w sposób bezkomputerowy ;)

Najpierw ważne, żebyś zrozumiał sam sposób, w jaki bys to liczył na kartce / ręcznie. Jakie kroki byś podjął, jak byś to ugryzł pisząc sobie ołówkiem w zeszyciku.
Potem, jak to w pełni zrozumiesz, przerobienie na prawdziwy program powinno być dość proste (oczywiście zakładając, że masz jakieś pojęcie o programowaniu).

0

Usiadłem jeszcze na chwilę i wydaje mi się teraz, że konieczne będzie wykorzystanie rekurencji. Dobrze kombinuję?

2

Napisz krok po kroku (ale "ludzkim" językiem, nie żadnym pseudokodem lub schematem blokowym) jak widzisz rozwiązanie zadania, w jaki sposób chcesz to zrobić.
A potem skomentujemy i doradzimy albo damy inną opcję :)

Co do rekurencji - pewnie też jest to jakaś opcja (aczkolwiek rekurencja to bardzo ogólne stwierdzenie, nie napisałeś konkretnie co i jak chcesz zrobić). Ale równie dobrze można to (w mało elegancki, ale skuteczny sposób) zrobić poprzez pętle od 1 do 600 i sprawdzać w każdej sekundzie, jak wygląda sytuacja. Albo przesuwać sie po kolei po tablicach i porównywać czasy.

Jeszcze taka uwaga - piszesz o zdobywaniu punktów. O ile proste jest to w sytuacji, gdy mamy 1:0, potem 1:1, a potem 2:1, to przecież mogą być także sytuacje, w których masz 2:7, potem pierwszy zawodnik zdobywa punkt i się robi 3:7 - ale mimo zdobycia punktu, nadal wygrywa drugi. Może to być oczywiste, ale czasami takie "oczywistości" potrafią gdzieś umknąć i popsuć zabawę ;)

1

Spróbuj spojrzeć na to zadanie z mniej oczywistej strony, zauważ że czas jest skończoną dość małą liczbą, więc spokojnie możesz iterować od 0 do 600 i dla każdej sekundy sprawdzać kto w niej zdobył punkty, co pozwoli na odtworzenie stanu gry z danej sekundy.

0

Iterowanie przez 600 przedziałów 1-sekundowych w pythonie:

gracz1 = []
gracz2 = []
wynikg1 = 0
wynikg2 = 0
czaswygrywaniag1 = 0
czaswygrywaniag2 = 0

for i in range(0, 600):
    if wynikg1 > wynikg2:
        czaswygrywaniag1 += 1
    elif wynikg1 < wynikg2:
        czaswygrywaniag2 += 1
    if gracz1.count(i):
        wynikg1 += 1
    elif gracz2.count(i):
        wynikg2 += 1

Chyba o niczym nie zapomniałem? Nieeleganckie, ale chyba najkrótsze i najmniej wymagające intelektualnie. Pomyślę jeszcze nad innymi sposobami.

1

Rozwiązanie z iterowanie po czasie jest jak najbardziej eleganckie i sprytne, natomiast w Twojej implementacji nie wykorzystujesz faktu że masz już posortowane tablice na wejściu, które możesz potraktować jako stosy, i patrzeć tylko na element na szczycie stosu w danej sekundzie, a nie cale tablice przeglądać za każdym razem.

0
gracz1 = [] 
gracz2 = []
wynikg1 = 0
wynikg2 = 0
czaswygrywaniag1 = 0
czaswygrywaniag2 = 0

for i in range(0, 601):
    if wynikg1 > wynikg2:
        czaswygrywaniag1 += 1
    elif wynikg2 > wynikg1:
        czaswygrywaniag2 += 1
    try:
        gracz1.remove(i)
        wynikg1 += 1
    except:
        pass
    try:
        gracz2.remove(i)
        wynikg2 += 1
    except:
        pass

for i in range(0, 601):
    if wynikg1 > wynikg2:
        czaswygrywaniag1 += 1
    elif wynikg2 > wynikg1:
        czaswygrywaniag2 += 1
    if len(gracz1) > 0:
        if gracz1[0] == i:
            wynikg1 += 1
            gracz1.pop(0)
    if len(gracz2) > 0:
        if gracz2[0] == i:
            wynikg2 += 1
            gracz2.pop(0)

Który sposób jest lepszy i dlaczego?

1
bkruczyński napisał(a):

Który sposób jest lepszy i dlaczego?

Oba są złe, bo po co pętla ma się obracać 601 razy??? Weź poszukaj takiego hasła jak merging i spróbuj przeglądać jednocześnie obie tablice, ale nie w taki sposób...

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0