Przejdź do zawartości

Moduł:HistoriaWystepow

Z Encyklopedia Poznanskiego Sportu

Dokumentacja dla tego modułu może zostać utworzona pod nazwą Moduł:HistoriaWystepow/opis

local p = {}

function p.main(frame)

    local zawodnik = frame.args.zawodnik

    if not zawodnik or zawodnik == "" then
        zawodnik = mw.title.getCurrentTitle().text
    end

    -- =====================================================
    -- BEZPIECZNE PRZYGOTOWANIE NAZWY ZAWODNIKA
    -- =====================================================

    local zawodnikSQL =
        mw.ustring.gsub(zawodnik, "'", "''")

    -- =====================================================
    -- POLA POBIERANE Z CARGO
    -- =====================================================

    local fields = table.concat({

        "UdzialZawodnika.mecz=mecz",
        "UdzialZawodnika.druzyna=druzyna",

        "UdzialZawodnika.minuty=minuty",
        "UdzialZawodnika.minuty_format=minuty_format",

        "UdzialZawodnika.gol=gol",
        "UdzialZawodnika.asysta=asysta",
        "UdzialZawodnika.zbiorka=zbiorka",

        "UdzialZawodnika.eval=eval",
        "UdzialZawodnika.plusminus=plusminus",

        "Mecze.data=data",
        "Mecze.sezon=sezon",

        "Mecze.druzyna1=druzyna1",
        "Mecze.druzyna2=druzyna2",

        "Mecze.wynik=wynik",
        "Mecze.strona_meczu=strona_meczu"

    }, ",")

    -- =====================================================
    -- ZAPYTANIE CARGO
    -- =====================================================

    local args = {

        join =
            "UdzialZawodnika.mecz=Mecze.id",

        where =
            "UdzialZawodnika.zawodnik='"
            .. zawodnikSQL
            .. "' AND UdzialZawodnika.minuty > 0",

        orderBy =
            "Mecze.data ASC",

        limit = 5000

    }

    local rows = mw.ext.cargo.query(
        "UdzialZawodnika,Mecze",
        fields,
        args
    )

    -- =====================================================
    -- BRAK DANYCH
    -- =====================================================

    if not rows or #rows == 0 then

        return "''Brak wprowadzonych występów w bazie.''"

    end

    -- =====================================================
    -- NOWE PODSUMOWANIE
    -- =====================================================

    local function nowePodsumowanie()

        return {

            wystepy = 0,

            zwyciestwa = 0,
            porazki = 0,
            remisy = 0,

            punkty = 0,
            minuty = 0,

            asysty = 0,
            zbiorki = 0,

            eval = 0,
            plusminus = 0

        }

    end

    -- =====================================================
    -- PODSUMOWANIA
    -- =====================================================

    local suma =
        nowePodsumowanie()

    local dom =
        nowePodsumowanie()

    local wyjazd =
        nowePodsumowanie()

    -- sezony
    local sezony = {}

    -- kluby
    local kluby = {}

    -- =====================================================
    -- OKREŚLENIE WYNIKU MECZU
    -- =====================================================

    local function okreslWynik(row)

        local d1 =
            row.druzyna1 or ""

        local d2 =
            row.druzyna2 or ""

        local druzyna =
            row.druzyna or ""

        local wynikMeczu =
            row.wynik or ""

        local g1, g2 =
            wynikMeczu:match(
                "(%d+)%s*:%s*(%d+)"
            )

        if not g1 or not g2 then
            return nil
        end

        g1 = tonumber(g1)
        g2 = tonumber(g2)

        if druzyna == d1 then

            if g1 > g2 then
                return "W"

            elseif g1 < g2 then
                return "P"

            else
                return "R"
            end

        elseif druzyna == d2 then

            if g2 > g1 then
                return "W"

            elseif g2 < g1 then
                return "P"

            else
                return "R"
            end

        end

        return nil

    end

    -- =====================================================
    -- DODANIE MECZU DO PODSUMOWANIA
    -- =====================================================

    local function dodajDoPodsumowania(
        stat,
        row
    )

        stat.wystepy =
            stat.wystepy + 1

        stat.punkty =
            stat.punkty
            + tonumber(row.gol or 0)

        stat.minuty =
            stat.minuty
            + tonumber(row.minuty or 0)

        stat.asysty =
            stat.asysty
            + tonumber(row.asysta or 0)

        stat.zbiorki =
            stat.zbiorki
            + tonumber(row.zbiorka or 0)

        stat.eval =
            stat.eval
            + tonumber(row.eval or 0)

        stat.plusminus =
            stat.plusminus
            + tonumber(row.plusminus or 0)

        local wynik =
            okreslWynik(row)

        if wynik == "W" then

            stat.zwyciestwa =
                stat.zwyciestwa + 1

        elseif wynik == "P" then

            stat.porazki =
                stat.porazki + 1

        elseif wynik == "R" then

            stat.remisy =
                stat.remisy + 1

        end

    end

    -- =====================================================
    -- PRZEJŚCIE PRZEZ WSZYSTKIE MECZE
    -- =====================================================

    for _, row in ipairs(rows) do

        -- -----------------------------------------------
        -- WSZYSTKIE
        -- -----------------------------------------------

        dodajDoPodsumowania(
            suma,
            row
        )

        -- -----------------------------------------------
        -- DOM / WYJAZD
        -- -----------------------------------------------

        local d1 =
            row.druzyna1 or ""

        local d2 =
            row.druzyna2 or ""

        local druzyna =
            row.druzyna or ""

        if druzyna == d1 then

            dodajDoPodsumowania(
                dom,
                row
            )

        elseif druzyna == d2 then

            dodajDoPodsumowania(
                wyjazd,
                row
            )

        end

        -- -----------------------------------------------
        -- SEZON
        -- -----------------------------------------------

        local sezon =
            row.sezon or ""

        if sezon == "" then
            sezon = "Brak sezonu"
        end

        if not sezony[sezon] then

            sezony[sezon] =
                nowePodsumowanie()

        end

        dodajDoPodsumowania(
            sezony[sezon],
            row
        )

        -- -----------------------------------------------
        -- KLUB
        -- -----------------------------------------------

        if druzyna == "" then
            druzyna = "Brak klubu"
        end

        if not kluby[druzyna] then

            kluby[druzyna] =
                nowePodsumowanie()

        end

        dodajDoPodsumowania(
            kluby[druzyna],
            row
        )

    end

    -- =====================================================
    -- FORMATOWANIE MINUT
    -- =====================================================

    local function formatujMinuty(minuty)

        local godziny =
            math.floor(minuty / 60)

        local min =
            minuty % 60

        return string.format(
            "%d:%02d",
            godziny,
            min
        )

    end

    -- =====================================================
    -- SORTOWANIE SEZONÓW
    -- =====================================================

    local listaSezonow = {}

    for sezon, _ in pairs(sezony) do

        table.insert(
            listaSezonow,
            sezon
        )

    end

    table.sort(
        listaSezonow,
        function(a, b)

            return a > b

        end
    )

    -- =====================================================
    -- SORTOWANIE KLUBÓW
    -- =====================================================

    local listaKlubow = {}

    for klub, _ in pairs(kluby) do

        table.insert(
            listaKlubow,
            klub
        )

    end

    table.sort(
        listaKlubow
    )

    -- =====================================================
    -- FUNKCJA: CZY JEST MECZ DOMOWY?
    -- =====================================================

    local function czyDom(row)

        local druzyna =
            row.druzyna or ""

        local d1 =
            row.druzyna1 or ""

        return druzyna == d1

    end

    -- =====================================================
    -- FUNKCJA OPISUJĄCA MECZ
    --
    -- WAŻNE:
    -- ZAWSZE GOSPODARZ – GOŚĆ
    -- =====================================================

    local function rekordMecz(row)

        local d1 =
            row.druzyna1 or ""

        local d2 =
            row.druzyna2 or ""

        local data =
            row.data or ""

        local wynikMeczu =
            row.wynik or ""

        local strona =
            row.strona_meczu or ""

        -- -----------------------------------------------
        -- FAKTYCZNY ZAPIS MECZU
        -- -----------------------------------------------

        local meczTekst =
            d1
            .. " – "
            .. d2

        -- -----------------------------------------------
        -- LINK DO STRONY MECZU
        -- -----------------------------------------------

        if strona ~= "" then

            meczTekst =
                "[["
                .. strona
                .. "|"
                .. d1
                .. " – "
                .. d2
                .. "]]"

        end

        -- -----------------------------------------------
        -- DATA
        -- -----------------------------------------------

        if data ~= "" then

            meczTekst =
                meczTekst
                .. " ("
                .. data
                .. ")"

        end

        -- -----------------------------------------------
        -- WYNIK
        -- -----------------------------------------------

        if wynikMeczu ~= "" then

            meczTekst =
                meczTekst
                .. " "
                .. wynikMeczu

        end

        return meczTekst

    end

    -- =====================================================
    -- REKORDY
    -- =====================================================

    local rekordPunkty = -1
    local rekordMinuty = -1
    local rekordAsysty = -1
    local rekordZbiorki = -1

    local meczePunkty = {}
    local meczeMinuty = {}
    local meczeAsysty = {}
    local meczeZbiorki = {}

    -- =====================================================
    -- WYSZUKIWANIE REKORDÓW
    -- =====================================================

    for _, row in ipairs(rows) do

        local punkty =
            tonumber(row.gol or 0)

        local minuty =
            tonumber(row.minuty or 0)

        local asysty =
            tonumber(row.asysta or 0)

        local zbiorki =
            tonumber(row.zbiorka or 0)

        -- -----------------------------------------------
        -- PUNKTY
        -- -----------------------------------------------

        if punkty > rekordPunkty then

            rekordPunkty = punkty

            meczePunkty = { row }

        elseif punkty == rekordPunkty then

            table.insert(
                meczePunkty,
                row
            )

        end

        -- -----------------------------------------------
        -- MINUTY
        -- -----------------------------------------------

        if minuty > rekordMinuty then

            rekordMinuty = minuty

            meczeMinuty = { row }

        elseif minuty == rekordMinuty then

            table.insert(
                meczeMinuty,
                row
            )

        end

        -- -----------------------------------------------
        -- ASYSTY
        -- -----------------------------------------------

        if asysty > rekordAsysty then

            rekordAsysty = asysty

            meczeAsysty = { row }

        elseif asysty == rekordAsysty then

            table.insert(
                meczeAsysty,
                row
            )

        end

        -- -----------------------------------------------
        -- ZBIÓRKI
        -- -----------------------------------------------

        if zbiorki > rekordZbiorki then

            rekordZbiorki = zbiorki

            meczeZbiorki = { row }

        elseif zbiorki == rekordZbiorki then

            table.insert(
                meczeZbiorki,
                row
            )

        end

    end

    -- =====================================================
    -- LISTA MECZÓW W REKORDZIE
    -- =====================================================

    local function listaRekordow(lista)

        local wynikRekordu = {}

        for _, row in ipairs(lista) do

            table.insert(
                wynikRekordu,
                rekordMecz(row)
            )

        end

        return table.concat(
            wynikRekordu,
            "<br>"
        )

    end

    -- =====================================================
    -- WYNIK
    -- =====================================================

    local wynik = {}

    -- =====================================================
    -- HISTORIA
    -- =====================================================

    table.insert(
        wynik,
        "== Historia występów =="
    )

    table.insert(
        wynik,
        ""
    )

    -- =====================================================
    -- PODSUMOWANIE WSZYSTKICH / DOM / WYJAZD
    -- =====================================================

    table.insert(
        wynik,
        "=== Podsumowanie wszystkich spotkań ==="
    )

    table.insert(
        wynik,
        ""
    )

    table.insert(
        wynik,
        '{| class="wikitable" style="width:100%; text-align:center;"'
    )

    table.insert(
        wynik,
        "! "
    )

    table.insert(
        wynik,
        "! Wszystkie spotkania"
    )

    table.insert(
        wynik,
        "! 🏠 Mecze domowe"
    )

    table.insert(
        wynik,
        "! ✈️ Mecze wyjazdowe"
    )

    -- WYSTĘPY

    table.insert(wynik, "|-")
    table.insert(wynik, "! Występy")
    table.insert(wynik, "| '''" .. suma.wystepy .. "'''")
    table.insert(wynik, "| '''" .. dom.wystepy .. "'''")
    table.insert(wynik, "| '''" .. wyjazd.wystepy .. "'''")

    -- ZWYCIĘSTWA

    table.insert(wynik, "|-")
    table.insert(wynik, "! Zwycięstwa")
    table.insert(wynik, "| '''" .. suma.zwyciestwa .. "'''")
    table.insert(wynik, "| '''" .. dom.zwyciestwa .. "'''")
    table.insert(wynik, "| '''" .. wyjazd.zwyciestwa .. "'''")

    -- PORAŻKI

    table.insert(wynik, "|-")
    table.insert(wynik, "! Porażki")
    table.insert(wynik, "| '''" .. suma.porazki .. "'''")
    table.insert(wynik, "| '''" .. dom.porazki .. "'''")
    table.insert(wynik, "| '''" .. wyjazd.porazki .. "'''")

    -- REMISY

    table.insert(wynik, "|-")
    table.insert(wynik, "! Remisy")
    table.insert(wynik, "| '''" .. suma.remisy .. "'''")
    table.insert(wynik, "| '''" .. dom.remisy .. "'''")
    table.insert(wynik, "| '''" .. wyjazd.remisy .. "'''")

    -- PUNKTY

    table.insert(wynik, "|-")
    table.insert(wynik, "! Punkty")
    table.insert(wynik, "| '''" .. suma.punkty .. "'''")
    table.insert(wynik, "| '''" .. dom.punkty .. "'''")
    table.insert(wynik, "| '''" .. wyjazd.punkty .. "'''")

    -- MINUTY

    table.insert(wynik, "|-")
    table.insert(wynik, "! Minuty")
    table.insert(wynik, "| '''" .. formatujMinuty(suma.minuty) .. "'''")
    table.insert(wynik, "| '''" .. formatujMinuty(dom.minuty) .. "'''")
    table.insert(wynik, "| '''" .. formatujMinuty(wyjazd.minuty) .. "'''")

    -- ASYSTY

    table.insert(wynik, "|-")
    table.insert(wynik, "! Asysty")
    table.insert(wynik, "| '''" .. suma.asysty .. "'''")
    table.insert(wynik, "| '''" .. dom.asysty .. "'''")
    table.insert(wynik, "| '''" .. wyjazd.asysty .. "'''")

    -- ZBIÓRKI

    table.insert(wynik, "|-")
    table.insert(wynik, "! Zbiórki")
    table.insert(wynik, "| '''" .. suma.zbiorki .. "'''")
    table.insert(wynik, "| '''" .. dom.zbiorki .. "'''")
    table.insert(wynik, "| '''" .. wyjazd.zbiorki .. "'''")

    -- EVAL

    table.insert(wynik, "|-")
    table.insert(wynik, "! EVAL")
    table.insert(wynik, "| '''" .. suma.eval .. "'''")
    table.insert(wynik, "| '''" .. dom.eval .. "'''")
    table.insert(wynik, "| '''" .. wyjazd.eval .. "'''")

    -- PLUS/MINUS

    table.insert(wynik, "|-")
    table.insert(wynik, "! +/-")
    table.insert(wynik, "| '''" .. suma.plusminus .. "'''")
    table.insert(wynik, "| '''" .. dom.plusminus .. "'''")
    table.insert(wynik, "| '''" .. wyjazd.plusminus .. "'''")

    table.insert(
        wynik,
        "|}"
    )

    table.insert(
        wynik,
        ""
    )

    -- =====================================================
    -- REKORDY ZAWODNIKA
    -- =====================================================

    table.insert(
        wynik,
        "=== Najlepsze występy ==="
    )

    table.insert(
        wynik,
        ""
    )

    table.insert(
        wynik,
        '{| class="wikitable" style="width:100%;"'
    )

    table.insert(
        wynik,
        "! Rekord"
    )

    table.insert(
        wynik,
        "! Wynik"
    )

    table.insert(
        wynik,
        "! Mecz / mecze"
    )

    -- PUNKTY

    table.insert(wynik, "|-")
    table.insert(wynik, "! 🏀 Najwięcej punktów")
    table.insert(wynik, "| '''" .. rekordPunkty .. "'''")
    table.insert(wynik, "| " .. listaRekordow(meczePunkty))

    -- MINUTY

    table.insert(wynik, "|-")
    table.insert(wynik, "! ⏱ Najwięcej minut")
    table.insert(wynik, "| '''" .. formatujMinuty(rekordMinuty) .. "'''")
    table.insert(wynik, "| " .. listaRekordow(meczeMinuty))

    -- ASYSTY

    table.insert(wynik, "|-")
    table.insert(wynik, "! 🎯 Najwięcej asyst")
    table.insert(wynik, "| '''" .. rekordAsysty .. "'''")
    table.insert(wynik, "| " .. listaRekordow(meczeAsysty))

    -- ZBIÓRKI

    table.insert(wynik, "|-")
    table.insert(wynik, "! 🏀 Najwięcej zbiórek")
    table.insert(wynik, "| '''" .. rekordZbiorki .. "'''")
    table.insert(wynik, "| " .. listaRekordow(meczeZbiorki))

    table.insert(
        wynik,
        "|}"
    )

    table.insert(
        wynik,
        ""
    )

    -- =====================================================
    -- PODSUMOWANIE SEZONÓW
    -- =====================================================

    table.insert(
        wynik,
        "=== Podsumowanie sezonów ==="
    )

    table.insert(
        wynik,
        ""
    )

    table.insert(
        wynik,
        '{| class="wikitable sortable" style="width:100%; text-align:center;"'
    )

    table.insert(wynik, "! Sezon")
    table.insert(wynik, "! Występy")
    table.insert(wynik, "! Zwycięstwa")
    table.insert(wynik, "! Porażki")
    table.insert(wynik, "! Remisy")
    table.insert(wynik, "! Punkty")
    table.insert(wynik, "! Minuty")
    table.insert(wynik, "! Asysty")
    table.insert(wynik, "! Zbiórki")
    table.insert(wynik, "! EVAL")
    table.insert(wynik, "! +/-")

    for _, sezon in ipairs(listaSezonow) do

        local stat =
            sezony[sezon]

        table.insert(wynik, "|-")

        table.insert(
            wynik,
            "| '''" .. sezon .. "'''"
        )

        table.insert(
            wynik,
            "| " .. stat.wystepy
        )

        table.insert(
            wynik,
            "| " .. stat.zwyciestwa
        )

        table.insert(
            wynik,
            "| " .. stat.porazki
        )

        table.insert(
            wynik,
            "| " .. stat.remisy
        )

        table.insert(
            wynik,
            "| " .. stat.punkty
        )

        table.insert(
            wynik,
            "| " .. formatujMinuty(stat.minuty)
        )

        table.insert(
            wynik,
            "| " .. stat.asysty
        )

        table.insert(
            wynik,
            "| " .. stat.zbiorki
        )

        table.insert(
            wynik,
            "| " .. stat.eval
        )

        table.insert(
            wynik,
            "| " .. stat.plusminus
        )

    end

    table.insert(
        wynik,
        "|}"
    )

    table.insert(
        wynik,
        ""
    )

    -- =====================================================
    -- PODSUMOWANIE WEDŁUG KLUBU
    -- =====================================================

    table.insert(
        wynik,
        "=== Podsumowanie według klubu ==="
    )

    table.insert(
        wynik,
        ""
    )

    table.insert(
        wynik,
        '{| class="wikitable sortable" style="width:100%; text-align:center;"'
    )

    table.insert(wynik, "! Klub")
    table.insert(wynik, "! Występy")
    table.insert(wynik, "! Zwycięstwa")
    table.insert(wynik, "! Porażki")
    table.insert(wynik, "! Remisy")
    table.insert(wynik, "! Punkty")
    table.insert(wynik, "! Minuty")
    table.insert(wynik, "! Asysty")
    table.insert(wynik, "! Zbiórki")
    table.insert(wynik, "! EVAL")
    table.insert(wynik, "! +/-")

    for _, klub in ipairs(listaKlubow) do

        local stat =
            kluby[klub]

        table.insert(
            wynik,
            "|-"
        )

        table.insert(
            wynik,
            "| '''" .. klub .. "'''"
        )

        table.insert(
            wynik,
            "| " .. stat.wystepy
        )

        table.insert(
            wynik,
            "| " .. stat.zwyciestwa
        )

        table.insert(
            wynik,
            "| " .. stat.porazki
        )

        table.insert(
            wynik,
            "| " .. stat.remisy
        )

        table.insert(
            wynik,
            "| " .. stat.punkty
        )

        table.insert(
            wynik,
            "| " .. formatujMinuty(stat.minuty)
        )

        table.insert(
            wynik,
            "| " .. stat.asysty
        )

        table.insert(
            wynik,
            "| " .. stat.zbiorki
        )

        table.insert(
            wynik,
            "| " .. stat.eval
        )

        table.insert(
            wynik,
            "| " .. stat.plusminus
        )

    end

    table.insert(
        wynik,
        "|}"
    )

    table.insert(
        wynik,
        ""
    )

    -- =====================================================
    -- TABELA WSZYSTKICH WYSTĘPÓW
    -- =====================================================

    table.insert(
        wynik,
        "=== Mecze ==="
    )

    table.insert(
        wynik,
        ""
    )

    table.insert(
        wynik,
        '{| class="wikitable sortable" style="width:100%;"'
    )

    table.insert(wynik, "! Nr")
    table.insert(wynik, "! Sezon")
    table.insert(wynik, "! Data")
    table.insert(wynik, "! Miejsce")
    table.insert(wynik, "! Przeciwnik")
    table.insert(wynik, "! Wynik")
    table.insert(wynik, "! Min.")
    table.insert(wynik, "! Pkt")
    table.insert(wynik, "! As.")
    table.insert(wynik, "! Zb.")
    table.insert(wynik, "! EVAL")
    table.insert(wynik, "! +/-")
    table.insert(wynik, "! Jubileusz")

    -- =====================================================
    -- POSZCZEGÓLNE MECZE
    -- =====================================================

    for i, row in ipairs(rows) do

        local data =
            row.data or ""

        local sezon =
            row.sezon or ""

        local d1 =
            row.druzyna1 or ""

        local d2 =
            row.druzyna2 or ""

        local druzyna =
            row.druzyna or ""

        local wynikMeczu =
            row.wynik or ""

        local strona =
            row.strona_meczu or ""

        local minutyFormat =
            row.minuty_format or ""

        local pkt =
            row.gol or "0"

        local asysty =
            row.asysta or "0"

        local zbiorki =
            row.zbiorka or "0"

        local eval =
            row.eval or "0"

        local plusminus =
            row.plusminus or "0"

        -- -----------------------------------------------
        -- DOM / WYJAZD
        -- -----------------------------------------------

        local miejsce = ""

        if druzyna == d1 then

            miejsce =
                "🏠 Dom"

        elseif druzyna == d2 then

            miejsce =
                "✈️ Wyjazd"

        end

        -- -----------------------------------------------
        -- PRZECIWNIK
        -- -----------------------------------------------

        local przeciwnik = ""

        if druzyna == d1 then

            przeciwnik =
                d2

        elseif druzyna == d2 then

            przeciwnik =
                d1

        else

            przeciwnik =
                d1

        end

        -- -----------------------------------------------
        -- LINK DO MECZU
        -- -----------------------------------------------

        local meczTekst =
            przeciwnik

        if strona ~= "" then

            meczTekst =
                "[["
                .. strona
                .. "|"
                .. przeciwnik
                .. "]]"

        end

        -- -----------------------------------------------
        -- JUBILEUSZ
        -- -----------------------------------------------

        local jubileusz = ""

        if i % 50 == 0 then

            jubileusz =
                "'''🏆 "
                .. i
                .. ". występ'''"

        end

        -- -----------------------------------------------
        -- WIERSZ
        -- -----------------------------------------------

        table.insert(
            wynik,
            "|-"
        )

        table.insert(
            wynik,
            "| " .. i
        )

        table.insert(
            wynik,
            "| " .. sezon
        )

        table.insert(
            wynik,
            "| " .. data
        )

        table.insert(
            wynik,
            "| " .. miejsce
        )

        table.insert(
            wynik,
            "| " .. meczTekst
        )

        table.insert(
            wynik,
            "| " .. wynikMeczu
        )

        table.insert(
            wynik,
            "| " .. minutyFormat
        )

        table.insert(
            wynik,
            "| " .. pkt
        )

        table.insert(
            wynik,
            "| " .. asysty
        )

        table.insert(
            wynik,
            "| " .. zbiorki
        )

        table.insert(
            wynik,
            "| " .. eval
        )

        table.insert(
            wynik,
            "| " .. plusminus
        )

        table.insert(
            wynik,
            "| " .. jubileusz
        )

    end

    -- =====================================================
    -- KONIEC TABELI
    -- =====================================================

    table.insert(
        wynik,
        "|}"
    )

    -- =====================================================
    -- ZWRÓCENIE WYNIKU
    -- =====================================================

    return table.concat(
        wynik,
        "\n"
    )

end

return p