Jdi na navigaci předmětu

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)
11×7 DataFrame
Rowvariablemeanminmedianmaxnmissingeltype
SymbolUnion…AnyUnion…AnyInt64Type
1nickAerlasYlathriel0String15
2code69.65568.51571Union{Missing, Int64}
3comment10.819.5361Union{Missing, Int64}
4euler_t46132.5127.7971858.65429864.03Union{Missing, Float64}
5euler_m429.474160160.027523Union{Missing, Int64}
6euler_c1.0true1.0true3Union{Missing, Bool}
7carmi_t3.65178e6177.506782.9677.54991e73Union{Missing, Float64}
8carmi_m7.30673e5160968.0218741443Union{Missing, Int64}
9carmi_c1.0true1.0true3Union{Missing, Bool}
10primesAnoNe1Union{Missing, String3}
11score0.000.000Int64

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