Autorské riešenie
[stiahni py]                                       

  • Počet riešiteľov: 47 / 52 = 90 %                       

  • Úspešnosť riešenia:  5.28 / 6 = 88 %                   

Vstupom pre túto úlohu boli dva rovnako dlhé reťazce výsledkov PCR a antigénového testu (znak P predstavuje pozitívny výsledok, znak N negatívny). Pre určenie správneho riešenia bolo potrebné postupne skontrolovať všetky znaky PCR a antigénového testu na rovnakých pozíciách. Na každej pozícii môžu nastať vo všeobecnosti 4 situácie:

  • ak PCR test je pozitívny a súčasne antigénový test je pozitívny, dostávame skutočne pozitívny (true positive, TP) príklad;

  • ak PCR test je pozitívny a súčasne antigénový test je negatívny, dostávame falošne negatívny (false negative, FN) príklad;

  • ak PCR test je negatívny a súčasne antigénový test je pozitívny, dostávame falošne pozitívny (false positive, FP) príklad;

  • ak PCR test je negatívny a súčasne antigénový test je negatívny, dostávame skutočne negatívny (true negative, TN) príklad;

Ak súčasným prechodom oboch reťazcov s výsledkami spočítame počty TP, FN, FP a TN, výsledné ukazovatele výkonnosti už vypočítame ľahko:

  • relatívna citlivosť = počet TP / (počet TP + počet FN);

  • relatívna špecifickosť = počet TN / (počet TN + počet FP);

  • celková zhoda = (počet TP + počet TN) / (počet TP + počet TN + počet FN + počet FP);

Nasleduje možný zdrojový kód v jazyku Python:  

def vykonnost_testu(pcr, antigen):
    pocet_skutocne_pozitivnych = 0
    pocet_falosne_negativnych = 0
    pocet_falosne_pozitivnych = 0
    pocet_skutocne_negativnych = 0
    for i in range(len(pcr)):
        if (pcr[i] == 'P' and antigen[i] == 'P'):
            pocet_skutocne_pozitivnych += 1
        elif (pcr[i] == 'P' and antigen[i] == 'N'):
            pocet_falosne_negativnych += 1
        elif (pcr[i] == 'N' and antigen[i] == 'P'):
            pocet_falosne_pozitivnych += 1
        else:
            pocet_skutocne_negativnych += 1
    relativna_citlivost = round(
        pocet_skutocne_pozitivnych * 100 /
        (pocet_skutocne_pozitivnych + pocet_falosne_negativnych), 2)
    relativna_specifickost = round(
        pocet_skutocne_negativnych * 100 /
        (pocet_skutocne_negativnych + pocet_falosne_pozitivnych), 2)
    celkova_zhoda = round(
        (pocet_skutocne_pozitivnych + pocet_skutocne_negativnych) * 100 /
        len(pcr), 2)
    return relativna_citlivost, relativna_specifickost, celkova_zhoda

Vaše zaujímavé riešenia a najčastejšie chyby

Úlohu riešilo 47 tímov. Väčšina tímov použila správny postup na dosiahnutie vhodného riešenia a využilo postup uvedený v autorskom riešení. Niektoré tímy si vytvorili vlastné pomocné funkcie pre načítanie vstupov. Viaceré riešenia boli výborne okomentované. V niektorých riešeniach chýbal súčasný prechod reťazcami pri určovaní pozitívnych a negatívnych príkladov, pričom bolo potrebné vypočítať, kedy sú pozitívne oba testy súčasne (PCR=Antigen=true) a tiež kedy sú negatívne oba testy súčasne (PCR=antigen=false). Následne by boli správne vypočítané aj hodnoty relatívnej citlivosti, špecificity a celkovej zhody podľa zadania. Dva tímy namiesto reťazcov použili na vstupe iba konštantne zadané hodnoty počtu pozitívnych, či negatívnych príkladov. Niektoré tímy počítali citlivosť z celkového počtu všetkých testov, pričom správne by sa mala počítať iba z celkového počtu pozitívnych PCR testov.