1. Porovnání (Eulerova a Carmichaelova funkce)
Porovnání jednotlivých řešení po tvrdém deadline prvního rozcvičkového a seznamovacího úkolu.
Ačkoliv to zadání navyžadovalo, tak jste se do řešení pustili velmi kompetitivně. Do mého bodování se benchmark zásadně promítat nebude, nebylo to zatím součástí zadání.
using CSV, DataFrames
"""
record_rank!(data_frame, column)
Pomocná hodnotící funkce přidělující body do sloupce `score` tabulky
`data_frame` podle pořadí ve sloupci `column` (seřazeném).
"""
function record_rank!(data_frame::DataFrame, column::Symbol)
rank = 1
value = first(data_frame[!, column])
for row in eachrow(data_frame)
if ismissing(row[column])
row[:score] += 42
continue
elseif ismissing(value)
value = row[column]
elseif row[column] != value
value = row[column]
rank += 1
end
row[:score] += rank
end
end;
Načtení dat, smazání username a přidání "skórovacího" sloupce a výpis základních statistik datasetu.
df = CSV.read("benchmark01.csv", DataFrame)
df[!, "score"] .= 0
select!(df, Not(:username))
describe(df)
Row | variable | mean | min | median | max | nmissing | eltype |
---|---|---|---|---|---|---|---|
Symbol | Union… | Any | Union… | Any | Int64 | Type | |
1 | nick | Aerlas | Ylathriel | 0 | String15 | ||
2 | code | 69.65 | 5 | 68.5 | 157 | 1 | Union{Missing, Int64} |
3 | comment | 10.8 | 1 | 9.5 | 36 | 1 | Union{Missing, Int64} |
4 | euler_t | 46132.5 | 127.797 | 1858.65 | 429864.0 | 3 | Union{Missing, Float64} |
5 | euler_m | 429.474 | 160 | 160.0 | 2752 | 3 | Union{Missing, Int64} |
6 | euler_c | 1.0 | true | 1.0 | true | 3 | Union{Missing, Bool} |
7 | carmi_t | 3.65178e6 | 177.506 | 782.967 | 7.54991e7 | 3 | Union{Missing, Float64} |
8 | carmi_m | 7.30673e5 | 160 | 968.0 | 21874144 | 3 | Union{Missing, Int64} |
9 | carmi_c | 1.0 | true | 1.0 | true | 3 | Union{Missing, Bool} |
10 | primes | Ano | Ne | 1 | Union{Missing, String3} | ||
11 | score | 0.0 | 0 | 0.0 | 0 | 0 | Int64 |
Dále odstraníme řádky odpovídající studentům, kteří neodevzdali žádné řešení.
dropmissing!(df, :euler_t);
Parametry kódu
Počet řádek kódu. Čím méně, tím lépe, což ale vždy neplatí, že. Měření pomocí nástroje cloc.
sort!(df, :code)
record_rank!(df, :code)
show(df[!,[:nick, :code, :score]], allrows=true)
38×3 DataFrame Row │ nick code score │ String15 Int64? Int64 ─────┼────────────────────────── 1 │ Melwenna 28 1 2 │ Arilien 40 2 3 │ Eryndra 41 3 4 │ Elirwen 42 4 5 │ ChatGPT 45 5 6 │ Finariel 49 6 7 │ Lyrien 52 7 8 │ Sílion 52 7 9 │ Faerlin 52 7 10 │ Elindor 53 8 11 │ Ilverion 58 9 12 │ Calandor 58 9 13 │ Nimlothen 60 10 14 │ Elvian 61 11 15 │ Faelion 63 12 16 │ Ereniel 66 13 17 │ Aerlas 67 14 18 │ Sylweth 68 15 19 │ Amarion 69 16 20 │ Caliriel 70 17 21 │ Daerlin 70 17 22 │ Kalvotom 73 18 23 │ Lorindel 74 19 24 │ Vaelis 75 20 25 │ Maelis 78 21 26 │ Nymira 78 21 27 │ Elanoriel 78 21 28 │ Valarin 79 22 29 │ Nivareth 86 23 30 │ Thelmir 87 24 31 │ Tharvel 88 25 32 │ Lysindra 97 26 33 │ Firanel 98 27 34 │ Veronil 101 28 35 │ Varnith 106 29 36 │ Thilwen 115 30 37 │ Myrilas 142 31 38 │ Lutharion 157 32
Počet řádek komentářů (včetně docstringů). Zde naopak čím více, tím lépe.
sort!(df, :comment, rev=true)
record_rank!(df, :comment)
show(df[!,[:nick, :comment, :score]], allrows=true)
38×3 DataFrame Row │ nick comment score │ String15 Int64? Int64 ─────┼─────────────────────────── 1 │ Finariel 36 7 2 │ Lutharion 33 34 3 │ Veronil 30 31 4 │ Faelion 18 16 5 │ Aerlas 17 19 6 │ Nymira 17 26 7 │ Elanoriel 17 26 8 │ Tharvel 16 31 9 │ Lysindra 16 32 10 │ Myrilas 16 37 11 │ Nimlothen 15 17 12 │ Faerlin 14 15 13 │ Lyrien 12 16 14 │ Sylweth 12 24 15 │ Daerlin 12 26 16 │ Valarin 11 32 17 │ Sílion 10 18 18 │ Elindor 10 19 19 │ Elvian 10 22 20 │ Thelmir 10 35 21 │ Ereniel 9 25 22 │ Lorindel 9 31 23 │ Vaelis 9 32 24 │ Firanel 9 39 25 │ Amarion 7 29 26 │ Calandor 6 23 27 │ Eryndra 5 18 28 │ Melwenna 4 17 29 │ Arilien 4 18 30 │ Elirwen 4 20 31 │ ChatGPT 4 21 32 │ Ilverion 4 25 33 │ Caliriel 4 33 34 │ Kalvotom 4 34 35 │ Maelis 4 37 36 │ Nivareth 4 39 37 │ Varnith 4 45 38 │ Thilwen 4 46
Euler
Měření výpočtu na třech různě hladkých číslech (mocnina dvou, prvočíslo, součin dvou prvočísel).
Nejprve čas, čím méně, tím lépe. Dále ve sloupci primes
uvádím, zda dotyčný/á řešitel/ka použil/a balíček Primes.jl (typicky k hledání faktorizace zadaného čísla) a pro jistotu kontroluji správnost výsledku (sloupec euler_c
).
sort!(df, :euler_t)
record_rank!(df, :euler_t)
show(df[!,[:nick, :euler_t, :score, :primes, :euler_c]], allrows=true)
38×5 DataFrame Row │ nick euler_t score primes euler_c │ String15 Float64 Int64 String3? Bool? ─────┼───────────────────────────────────────────────── 1 │ Amarion 127.797 30 Ne true 2 │ Elanoriel 138.514 28 Ne true 3 │ Finariel 203.972 10 Ano true 4 │ Valarin 205.447 36 Ano true 5 │ Melwenna 207.64 22 Ano true 6 │ Lutharion 249.477 40 Ano true 7 │ Maelis 251.247 44 Ne true 8 │ Elindor 314.898 27 Ano true 9 │ Vaelis 317.873 41 Ne true 10 │ Nimlothen 321.234 27 Ano true 11 │ Lysindra 322.494 43 Ne true 12 │ Sílion 341.145 30 Ano true 13 │ Veronil 357.855 44 Ne true 14 │ Faerlin 528.246 29 Ne true 15 │ Calandor 601.819 38 Ano true 16 │ Caliriel 656.061 49 Ne true 17 │ Myrilas 771.735 54 Ne true 18 │ Firanel 1034.7 57 Ne true 19 │ Tharvel 1783.0 50 Ne true 20 │ Thelmir 1934.3 55 Ne true 21 │ Ereniel 2411.67 46 Ne true 22 │ Eryndra 2517.33 40 Ne true 23 │ Lorindel 2630.22 54 Ne true 24 │ Kalvotom 2656.56 58 Ne true 25 │ Daerlin 93602.0 51 Ne true 26 │ Aerlas 94165.0 45 Ne true 27 │ Sylweth 94266.0 51 Ne true 28 │ Nymira 94659.0 54 Ne true 29 │ Elirwen 96769.0 49 Ano true 30 │ Elvian 96836.0 52 Ne true 31 │ Lyrien 96987.0 47 Ne true 32 │ Arilien 102069.0 50 Ne true 33 │ ChatGPT 105138.0 54 Ano true 34 │ Ilverion 105507.0 59 Ano true 35 │ Faelion 105742.0 51 Ne true 36 │ Nivareth 105944.0 75 Ne true 37 │ Varnith 110602.0 82 Ano true 38 │ Thilwen 429864.0 84 Ne true
A pak paměť, čím méně, tím lépe.
sort!(df, :euler_m)
record_rank!(df, :euler_m)
show(df[!, [:nick, :euler_m, :score]], allrows=true)
38×3 DataFrame Row │ nick euler_m score │ String15 Int64? Int64 ─────┼─────────────────────────── 1 │ Amarion 160 31 2 │ Elanoriel 160 29 3 │ Maelis 160 45 4 │ Nimlothen 160 28 5 │ Lysindra 160 44 6 │ Sílion 160 31 7 │ Veronil 160 45 8 │ Faerlin 160 30 9 │ Thelmir 160 56 10 │ Ereniel 160 47 11 │ Eryndra 160 41 12 │ Lorindel 160 55 13 │ Kalvotom 160 59 14 │ Daerlin 160 52 15 │ Aerlas 160 46 16 │ Sylweth 160 52 17 │ Elirwen 160 50 18 │ Arilien 160 51 19 │ ChatGPT 160 55 20 │ Ilverion 160 60 21 │ Faelion 160 52 22 │ Varnith 160 83 23 │ Thilwen 160 85 24 │ Lyrien 176 49 25 │ Nymira 208 57 26 │ Elvian 256 56 27 │ Nivareth 256 79 28 │ Finariel 544 15 29 │ Valarin 544 41 30 │ Melwenna 544 27 31 │ Elindor 544 32 32 │ Lutharion 640 46 33 │ Vaelis 736 48 34 │ Caliriel 736 56 35 │ Myrilas 1056 62 36 │ Firanel 1760 66 37 │ Calandor 1888 48 38 │ Tharvel 2752 61
Carmichael
To samé pro Carmichaelovu funkci. Nejprve čas a poté paměť.
sort!(df, :carmi_t)
record_rank!(df, :carmi_t)
show(df[!,[:nick, :carmi_t, :score, :primes, :carmi_c]], allrows=true)
38×5 DataFrame Row │ nick carmi_t score primes carmi_c │ String15 Float64? Int64 String3? Bool? ─────┼───────────────────────────────────────────────────── 1 │ Amarion 177.506 32 Ne true 2 │ Lysindra 190.321 46 Ne true 3 │ Varnith 201.271 86 Ano true 4 │ Elanoriel 210.318 33 Ne true 5 │ Ilverion 246.085 65 Ano true 6 │ Elirwen 246.431 56 Ano true 7 │ Sílion 246.717 38 Ano true 8 │ Finariel 248.236 23 Ano true 9 │ ChatGPT 325.134 64 Ano true 10 │ Maelis 374.262 55 Ne true 11 │ Veronil 484.179 56 Ne true 12 │ Nimlothen 515.207 40 Ano true 13 │ Lutharion 595.304 59 Ano true 14 │ Aerlas 607.753 60 Ne true 15 │ Elindor 608.46 47 Ano true 16 │ Valarin 622.744 57 Ano true 17 │ Calandor 670.578 65 Ano true 18 │ Vaelis 684.713 66 Ne true 19 │ Caliriel 750.064 75 Ne true 20 │ Tharvel 815.87 81 Ne true 21 │ Firanel 1150.0 87 Ne true 22 │ Myrilas 1396.7 84 Ne true 23 │ Sylweth 1646.6 75 Ne true 24 │ Lorindel 1893.3 79 Ne true 25 │ Ereniel 2315.22 72 Ne true 26 │ Thelmir 2374.22 82 Ne true 27 │ Nivareth 120182.0 106 Ne true 28 │ Thilwen 273057.0 113 Ne true 29 │ Nymira 709763.0 86 Ne true 30 │ Daerlin 1.25072e6 82 Ne true 31 │ Arilien 1.29164e6 82 Ne true 32 │ Kalvotom 1.59597e6 91 Ne true 33 │ Eryndra 1.64557e6 74 Ne true 34 │ Melwenna 6.18962e6 61 Ano true 35 │ Elvian 1.09221e7 91 Ne true 36 │ Lyrien 1.35132e7 85 Ne true 37 │ Faelion 2.5737e7 89 Ne true 38 │ Faerlin 7.54991e7 68 Ne true
sort!(df, :carmi_m)
record_rank!(df, :carmi_m)
show(df[!,[:nick, :carmi_m, :score]], allrows=true)
38×3 DataFrame Row │ nick carmi_m score │ String15 Int64? Int64 ─────┼──────────────────────────── 1 │ Amarion 160 33 2 │ Lysindra 160 47 3 │ Elanoriel 160 34 4 │ Maelis 160 56 5 │ Lorindel 160 80 6 │ Ereniel 160 73 7 │ Daerlin 160 83 8 │ Faelion 160 90 9 │ Nymira 208 88 10 │ Varnith 416 89 11 │ Ilverion 544 69 12 │ Elirwen 544 60 13 │ Sílion 544 42 14 │ Finariel 544 27 15 │ Veronil 544 60 16 │ Thelmir 544 86 17 │ ChatGPT 752 69 18 │ Valarin 784 63 19 │ Caliriel 944 82 20 │ Nimlothen 992 48 21 │ Nivareth 1152 115 22 │ Kalvotom 1376 101 23 │ Myrilas 1392 95 24 │ Elindor 1440 59 25 │ Sylweth 1440 87 26 │ Lutharion 1488 72 27 │ Aerlas 1504 74 28 │ Tharvel 1504 95 29 │ Vaelis 1888 81 30 │ Firanel 1968 103 31 │ Calandor 2176 82 32 │ Thilwen 2688 131 33 │ Arilien 118240 101 34 │ Eryndra 118240 93 35 │ Melwenna 160352 81 36 │ Faerlin 280192 89 37 │ Elvian 5185760 113 38 │ Lyrien 21874144 108
Závěrečná tabulka
Zaznamenávali jsme v každé kategorii (sdílené) pořadí. Čím nižší hodnota, tím lepší výsledek.
sort!(df, :score)
show(df[!,[:nick, :score, :primes]], allrows=true)
38×3 DataFrame Row │ nick score primes │ String15 Int64 String3? ─────┼──────────────────────────── 1 │ Finariel 27 Ano 2 │ Amarion 33 Ne 3 │ Elanoriel 34 Ne 4 │ Sílion 42 Ano 5 │ Lysindra 47 Ne 6 │ Nimlothen 48 Ano 7 │ Maelis 56 Ne 8 │ Elindor 59 Ano 9 │ Elirwen 60 Ano 10 │ Veronil 60 Ne 11 │ Valarin 63 Ano 12 │ Ilverion 69 Ano 13 │ ChatGPT 69 Ano 14 │ Lutharion 72 Ano 15 │ Ereniel 73 Ne 16 │ Aerlas 74 Ne 17 │ Lorindel 80 Ne 18 │ Vaelis 81 Ne 19 │ Melwenna 81 Ano 20 │ Caliriel 82 Ne 21 │ Calandor 82 Ano 22 │ Daerlin 83 Ne 23 │ Thelmir 86 Ne 24 │ Sylweth 87 Ne 25 │ Nymira 88 Ne 26 │ Varnith 89 Ano 27 │ Faerlin 89 Ne 28 │ Faelion 90 Ne 29 │ Eryndra 93 Ne 30 │ Myrilas 95 Ne 31 │ Tharvel 95 Ne 32 │ Kalvotom 101 Ne 33 │ Arilien 101 Ne 34 │ Firanel 103 Ne 35 │ Lyrien 108 Ne 36 │ Elvian 113 Ne 37 │ Nivareth 115 Ne 38 │ Thilwen 131 Ne
A pro zajímavost celá tabulka s nejzajímavějšími sloupci.
show(df[!,[:nick, :code, :euler_t, :carmi_t, :primes, :score]], allrows=true)
38×6 DataFrame Row │ nick code euler_t carmi_t primes score │ String15 Int64? Float64 Float64? String3? Int64 ─────┼──────────────────────────────────────────────────────────────── 1 │ Finariel 49 203.972 248.236 Ano 27 2 │ Amarion 69 127.797 177.506 Ne 33 3 │ Elanoriel 78 138.514 210.318 Ne 34 4 │ Sílion 52 341.145 246.717 Ano 42 5 │ Lysindra 97 322.494 190.321 Ne 47 6 │ Nimlothen 60 321.234 515.207 Ano 48 7 │ Maelis 78 251.247 374.262 Ne 56 8 │ Elindor 53 314.898 608.46 Ano 59 9 │ Elirwen 42 96769.0 246.431 Ano 60 10 │ Veronil 101 357.855 484.179 Ne 60 11 │ Valarin 79 205.447 622.744 Ano 63 12 │ Ilverion 58 105507.0 246.085 Ano 69 13 │ ChatGPT 45 105138.0 325.134 Ano 69 14 │ Lutharion 157 249.477 595.304 Ano 72 15 │ Ereniel 66 2411.67 2315.22 Ne 73 16 │ Aerlas 67 94165.0 607.753 Ne 74 17 │ Lorindel 74 2630.22 1893.3 Ne 80 18 │ Vaelis 75 317.873 684.713 Ne 81 19 │ Melwenna 28 207.64 6.18962e6 Ano 81 20 │ Caliriel 70 656.061 750.064 Ne 82 21 │ Calandor 58 601.819 670.578 Ano 82 22 │ Daerlin 70 93602.0 1.25072e6 Ne 83 23 │ Thelmir 87 1934.3 2374.22 Ne 86 24 │ Sylweth 68 94266.0 1646.6 Ne 87 25 │ Nymira 78 94659.0 709763.0 Ne 88 26 │ Varnith 106 110602.0 201.271 Ano 89 27 │ Faerlin 52 528.246 7.54991e7 Ne 89 28 │ Faelion 63 105742.0 2.5737e7 Ne 90 29 │ Eryndra 41 2517.33 1.64557e6 Ne 93 30 │ Myrilas 142 771.735 1396.7 Ne 95 31 │ Tharvel 88 1783.0 815.87 Ne 95 32 │ Kalvotom 73 2656.56 1.59597e6 Ne 101 33 │ Arilien 40 102069.0 1.29164e6 Ne 101 34 │ Firanel 98 1034.7 1150.0 Ne 103 35 │ Lyrien 52 96987.0 1.35132e7 Ne 108 36 │ Elvian 61 96836.0 1.09221e7 Ne 113 37 │ Nivareth 86 105944.0 120182.0 Ne 115 38 │ Thilwen 115 429864.0 273057.0 Ne 131