Jdi na navigaci předmětu

2. Porovnání (Conwayova hra života)

Porovnání jednotlivých řešení po měkkém deadline druhého úkolu.

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("benchmark02.csv", DataFrame)
df[!, "score"] .= 0
select!(df, Not(:username))
describe(df)
13×7 DataFrame
Rowvariablemeanminmedianmaxnmissingeltype
SymbolUnion…AnyUnion…AnyInt64Type
1nickAerlasYlathriel0String15
2code86.025282.02290Int64
3comment52.875441.51860Int64
4constr_t6.51517e643.2624787162.07.5532e72Union{Missing, Float64}
5constr_m4.04402e6144125420.0332304962Union{Missing, Int64}
6large_t6.48696e92.92773e83.68425e93.89992e102Union{Missing, Float64}
7large_m3.08227e908.00008e8352065248002Union{Missing, Int64}
8glider_t9.77291e898480.05.32382e85.82129e92Union{Missing, Float64}
9glider_m7.41883e801.28667e888033376002Union{Missing, Int64}
10pop_t59994.92.35486055.8365464.02Union{Missing, Float64}
11pop_m54286.700.020000802Union{Missing, Int64}
12pop_c23083.2462923582.0235822Union{Missing, Int64}
13score0.000.000Int64

Dále odstraníme řádky odpovídající studentům, kteří neodevzdali funkční řešení.

dropmissing!(df, :pop_c);

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, tentokrát zdá se se správnými hodnotami.

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 │ Faerlin       42      1
   2 │ Elanoriel     53      2
   3 │ ChatGPT       54      3
   4 │ Elvian        54      3
   5 │ Elirwen       56      4
   6 │ Varnith       58      5
   7 │ Thilwen       61      6
   8 │ Maelis        62      7
   9 │ Ilverion      63      8
  10 │ Thelmir       63      8
  11 │ Calandor      64      9
  12 │ Elindor       66     10
  13 │ Nivareth      66     10
  14 │ Caliriel      67     11
  15 │ Lysindra      67     11
  16 │ Melwenna      69     12
  17 │ Vaelis        75     13
  18 │ Daerlin       80     14
  19 │ Arilien       84     15
  20 │ Faelion       88     16
  21 │ Finariel      89     17
  22 │ Lyrien        91     18
  23 │ Aerlas        96     19
  24 │ Lutharion     99     20
  25 │ Sylweth      100     21
  26 │ Sílion       103     22
  27 │ Valarin      103     22
  28 │ Lorindel     103     22
  29 │ Nymira       107     23
  30 │ Nimlothen    107     23
  31 │ Myrilas      110     24
  32 │ Amarion      117     25
  33 │ Ereniel      124     26
  34 │ Veronil      131     27
  35 │ Tharvel      136     28
  36 │ Kalvotom     149     29
  37 │ Eryndra      151     30
  38 │ Firanel      229     31

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 │ Tharvel        186     29
   2 │ Arilien        131     17
   3 │ Firanel        112     34
   4 │ Eryndra         97     34
   5 │ Faelion         94     21
   6 │ Lutharion       91     26
   7 │ Myrilas         90     31
   8 │ Valarin         86     30
   9 │ Lysindra        82     20
  10 │ Daerlin         82     23
  11 │ Amarion         68     35
  12 │ Nimlothen       55     34
  13 │ Ilverion        54     20
  14 │ Elirwen         53     17
  15 │ Aerlas          50     33
  16 │ Melwenna        46     27
  17 │ Ereniel         46     41
  18 │ Faerlin         44     17
  19 │ Elanoriel       42     19
  20 │ Vaelis          42     30
  21 │ Elvian          41     21
  22 │ Maelis          40     26
  23 │ Nymira          38     43
  24 │ Varnith         37     26
  25 │ Sylweth         37     42
  26 │ Caliriel        35     33
  27 │ Veronil         35     49
  28 │ Kalvotom        35     51
  29 │ Lyrien          34     41
  30 │ Thelmir         32     32
  31 │ Sílion          31     47
  32 │ Calandor        29     35
  33 │ Nivareth        29     36
  34 │ Finariel        23     44
  35 │ Lorindel        23     49
  36 │ Elindor         21     38
  37 │ Thilwen         19     35
  38 │ ChatGPT         17     33

Test: náročnost vytvoření hry

Kolik času a paměti zabere připravení hry pomocí konstruktoru Conway. Toto měření ukazuje, zda-li řešitel pouze přijme data, nebo připravuje svoji zvolenou vnitřní reprezentaci hry. Ztracený čas a paměť pravděpodobně zužitkuje v dalším počítání.

Uvádíme hodnoty relativní vůči nejnižšímu (prvnímu) výsledku. Podobně u dalších měření.

sort!(df, :constr_t)
df.constr_t ./= minimum(df.constr_t)
record_rank!(df, :constr_t)
show(df[!,[:nick, :constr_t, :score]], allrows=true)
38×3 DataFrame
 Row  nick       constr_t       score  String15   Float64        Int64 
─────┼─────────────────────────────────
   1 │ Lorindel       1.0           50
   2 │ Vaelis         1.05198       32
   3 │ Elindor        1.05276       41
   4 │ Ilverion       1.05642       24
   5 │ Maelis         1.06681       31
   6 │ Sylweth        1.06919       48
   7 │ Elirwen        1.08866       24
   8 │ Nivareth       1.09478       44
   9 │ Varnith        1.0955        35
  10 │ Elvian         1.11109       31
  11 │ Aerlas         1.11992       44
  12 │ ChatGPT        1.12179       45
  13 │ Thilwen        1.15993       48
  14 │ Caliriel       1.17385       47
  15 │ Elanoriel      1.56778       34
  16 │ Arilien    10417.6           33
  17 │ Lysindra   11174.5           37
  18 │ Thelmir    11717.6           50
  19 │ Faelion    15253.2           40
  20 │ Calandor   21137.0           55
  21 │ Tharvel    28734.2           50
  22 │ Amarion    38695.3           57
  23 │ Eryndra    43995.0           57
  24 │ Finariel   53156.0           68
  25 │ Nymira     54156.0           68
  26 │ Melwenna   59194.1           53
  27 │ Ereniel    69622.8           68
  28 │ Lutharion  90081.3           54
  29 │ Veronil    95157.8           78
  30 │ Faerlin        1.05547e5     47
  31 │ Firanel        1.0663e5      65
  32 │ Sílion         1.10205e5     79
  33 │ Valarin        2.36669e5     63
  34 │ Lyrien         2.41573e5     75
  35 │ Kalvotom       3.21634e5     86
  36 │ Myrilas        9.80773e5     67
  37 │ Nimlothen      1.27123e6     71
  38 │ Daerlin        1.74591e6     61

A pak paměť, čím méně, tím lépe (ve smyslu měření). Velké číslo zde nutně neznamená špatnost, jde o investici do dalšího počítání.

sort!(df, :constr_m)
df.constr_m ./= minimum(df.constr_m)
record_rank!(df, :constr_m)
show(df[!,[:nick, :constr_m, :score]], allrows=true)
38×3 DataFrame
 Row  nick       constr_m       score  String15   Float64        Int64 
─────┼─────────────────────────────────
   1 │ Lorindel       1.0           51
   2 │ Maelis         1.0           32
   3 │ Lysindra       1.0           38
   4 │ Vaelis         1.22222       34
   5 │ Elindor        1.22222       43
   6 │ Ilverion       1.22222       26
   7 │ Sylweth        1.22222       50
   8 │ Elirwen        1.22222       26
   9 │ Nivareth       1.22222       46
  10 │ Varnith        1.22222       37
  11 │ Elvian         1.22222       33
  12 │ Aerlas         1.22222       46
  13 │ ChatGPT        1.22222       47
  14 │ Thilwen        1.22222       50
  15 │ Caliriel       1.33333       50
  16 │ Elanoriel      1.33333       37
  17 │ Nymira         1.33333       71
  18 │ Thelmir      870.222         54
  19 │ Calandor     870.833         60
  20 │ Amarion      871.111         63
  21 │ Ereniel      876.444         75
  22 │ Faelion     1739.67          48
  23 │ Arilien     2609.0           42
  24 │ Faerlin     6946.22          57
  25 │ Veronil     6947.89          89
  26 │ Tharvel     7816.44          62
  27 │ Nimlothen  13891.4           84
  28 │ Firanel    14380.3           79
  29 │ Lutharion  56004.0           69
  30 │ Melwenna   56426.7           69
  31 │ Finariel   56429.2           85
  32 │ Sílion     57295.9           97
  33 │ Myrilas    66759.3           86
  34 │ Lyrien     69447.4           95
  35 │ Kalvotom   78131.1          107
  36 │ Eryndra        1.11114e5     79
  37 │ Daerlin        2.26957e5     84
  38 │ Valarin        2.30767e5     87

Test: Časový vývoj hry na větší ploše s větším časem a náhodným počátečním stavem

Náhodný počáteční stav mají všichni stejný, ale jde o matici s přibližně polovinou živých a polovinou mrtvých buněk. Opět relativně měříme čas, paměť neukazuji relativní, neboť nulou dělit nelze. Testujeme metodu tick!.

V tomto režimu se ve hře tedy skoro všude "něco děje", minimálně ze začátku.

sort!(df, :large_t)
df.large_t ./= minimum(df.large_t)
record_rank!(df, :large_t)
show(df[!,[:nick, :large_t, :score]], allrows=true)
38×3 DataFrame
 Row  nick       large_t    score  String15   Float64    Int64 
─────┼─────────────────────────────
   1 │ Elanoriel    1.0         38
   2 │ Kalvotom     2.64193    109
   3 │ Faerlin      3.02283     60
   4 │ Nimlothen    5.15752     88
   5 │ Firanel      5.35402     84
   6 │ Calandor     6.04293     66
   7 │ Tharvel      6.1321      69
   8 │ Arilien      6.73097     50
   9 │ Myrilas      7.19268     95
  10 │ Lyrien       7.43022    105
  11 │ Faelion      8.08787     59
  12 │ Sílion       8.37149    109
  13 │ Ereniel      8.54478     88
  14 │ Elindor      9.62474     57
  15 │ Maelis       9.945       47
  16 │ Caliriel    10.2243      66
  17 │ Thelmir     10.4478      71
  18 │ ChatGPT     12.0278      65
  19 │ Valarin     12.0968     106
  20 │ Amarion     13.0712      83
  21 │ Nymira      15.1881      92
  22 │ Lysindra    18.078       60
  23 │ Veronil     18.6701     112
  24 │ Lutharion   20.3101      93
  25 │ Elirwen     21.813       51
  26 │ Aerlas      22.004       72
  27 │ Eryndra     23.2878     106
  28 │ Ilverion    23.8599      54
  29 │ Vaelis      26.4397      63
  30 │ Melwenna    27.0393      99
  31 │ Varnith     30.0671      68
  32 │ Sylweth     30.3874      82
  33 │ Finariel    30.5428     118
  34 │ Thilwen     52.9268      84
  35 │ Lorindel    58.132       86
  36 │ Nivareth    62.0769      82
  37 │ Daerlin     74.787      121
  38 │ Elvian     133.206       71

A paměť.

sort!(df, :large_m)
record_rank!(df, :large_m)
show(df[!,[:nick, :large_m, :score]], allrows=true)
38×3 DataFrame
 Row  nick       large_m      score  String15   Int64?       Int64 
─────┼───────────────────────────────
   1 │ Kalvotom             0    110
   2 │ Nimlothen            0     89
   3 │ Arilien              0     51
   4 │ Lyrien               0    106
   5 │ Eryndra              0    107
   6 │ Firanel         163104     86
   7 │ Faerlin        1000080     63
   8 │ Faelion        1328480     63
   9 │ Elanoriel      2125328     43
  10 │ Nymira         8000080     98
  11 │ Finariel       8016080    125
  12 │ Myrilas       11361536    103
  13 │ Ereniel       12556800     97
  14 │ Amarion       21498048     93
  15 │ Tharvel      100008080     80
  16 │ Veronil      100008080    123
  17 │ Valarin      208316864    118
  18 │ Calandor     227078776     79
  19 │ Elindor      800008000     71
  20 │ Maelis       800008000     61
  21 │ ChatGPT      800008000     79
  22 │ Lysindra     800008000     74
  23 │ Elirwen      800008000     65
  24 │ Ilverion     800008000     68
  25 │ Vaelis       800008000     77
  26 │ Varnith      808008032     83
  27 │ Sílion       825041600    125
  28 │ Caliriel    1600016000     83
  29 │ Aerlas      1600016000     89
  30 │ Sylweth     1600016000     99
  31 │ Thelmir     1613120176     89
  32 │ Daerlin     4310533984    140
  33 │ Melwenna    5600084800    119
  34 │ Lutharion  11245068800    114
  35 │ Thilwen    13600008000    106
  36 │ Lorindel   16006448000    109
  37 │ Nivareth   16809688000    106
  38 │ Elvian     35206524800     96

Test: Časový vývoj hry na větší ploše s větším časem a gliderem

Tento test se zaměřuje na druhý extrém, kdy na větší ploše pouze cestuje jeden malý titěrný samotinký glider. Jde v jistém smyslu o opak předchozí situace. Nyní je na ploše prakticky mrtvo, až na pár buněk. Testujeme metodu tick!.

Opět měříme čas relativně a paměť absolutně.

sort!(df, :glider_t)
df.glider_t ./= minimum(coalesce.(df.glider_t, Inf))
record_rank!(df, :glider_t)
show(df[!,[:nick, :glider_t, :score]], allrows=true)
38×3 DataFrame
 Row  nick       glider_t     score  String15   Float64      Int64 
─────┼───────────────────────────────
   1 │ Valarin        1.0        119
   2 │ Daerlin        3.80068    142
   3 │ Myrilas        6.98391    106
   4 │ Firanel       51.3666      90
   5 │ Tharvel      151.599       85
   6 │ Veronil      175.028      129
   7 │ Nimlothen    665.814       96
   8 │ Elanoriel    732.407       51
   9 │ Kalvotom     792.154      119
  10 │ Sílion       926.31       135
  11 │ Caliriel    1636.65        94
  12 │ ChatGPT     1662.64        91
  13 │ Faerlin     1866.8         76
  14 │ Thelmir     4208.47       103
  15 │ Calandor    4536.9         94
  16 │ Elindor     4646.06        87
  17 │ Arilien     4756.95        68
  18 │ Lyrien      4869.09       124
  19 │ Maelis      5388.0         80
  20 │ Faelion     5423.99        83
  21 │ Ereniel     5612.09       118
  22 │ Nymira      6383.08       120
  23 │ Lutharion   6814.16       137
  24 │ Amarion     8745.32       117
  25 │ Lysindra   10339.9         99
  26 │ Elirwen    12102.6         91
  27 │ Aerlas     13063.1        116
  28 │ Eryndra    14173.4        135
  29 │ Ilverion   15821.2         97
  30 │ Vaelis     16964.6        107
  31 │ Sylweth    17451.7        130
  32 │ Melwenna   17989.3        151
  33 │ Finariel   20182.1        158
  34 │ Varnith    20397.2        117
  35 │ Nivareth   28760.2        141
  36 │ Thilwen    29175.7        142
  37 │ Lorindel   31513.8        146
  38 │ Elvian     59111.4        134

A paměť.

sort!(df, :glider_m)
record_rank!(df, :glider_m)
show(df[!,[:nick, :glider_m, :score]], allrows=true)
38×3 DataFrame
 Row  nick       glider_m    score  String15   Int64?      Int64 
─────┼──────────────────────────────
   1 │ Nimlothen           0     97
   2 │ Kalvotom            0    120
   3 │ Arilien             0     69
   4 │ Lyrien              0    125
   5 │ Eryndra             0    136
   6 │ Amarion           320    119
   7 │ Firanel           448     93
   8 │ Myrilas           928    110
   9 │ Valarin         12816    124
  10 │ Daerlin        219200    148
  11 │ Faerlin        250128     83
  12 │ Faelion        383392     91
  13 │ Elanoriel      531664     60
  14 │ Nymira        2000080    130
  15 │ Finariel      2016080    169
  16 │ Ereniel       3180800    130
  17 │ Tharvel      28253872     98
  18 │ Veronil      50037552    143
  19 │ Calandor     57325176    109
  20 │ ChatGPT     200008000    107
  21 │ Elindor     200008000    103
  22 │ Maelis      200008000     96
  23 │ Lysindra    200008000    115
  24 │ Elirwen     200008000    107
  25 │ Ilverion    200008000    113
  26 │ Vaelis      200008000    123
  27 │ Varnith     202008032    134
  28 │ Sílion      206289600    153
  29 │ Caliriel    400016000    113
  30 │ Aerlas      400016000    135
  31 │ Sylweth     400016000    149
  32 │ Thelmir     404713776    123
  33 │ Melwenna   1400084800    172
  34 │ Lutharion  2822656000    159
  35 │ Thilwen    3400008000    165
  36 │ Lorindel   4003260800    170
  37 │ Nivareth   4204875200    166
  38 │ Elvian     8803337600    160

Test: výpočet parametru population

Konkrétně na větší (pro všechny stejné) matici po delším časovém vývoji, kontrolujeme i hodnotu (sloupec pop_c).

sort!(df, :pop_t)
df.pop_t ./= minimum(df.pop_t)
record_rank!(df, :pop_t)
show(df[!,[:nick, :pop_t, :pop_c, :score]], allrows=true)
38×4 DataFrame
 Row  nick       pop_t          pop_c  score  String15   Float64        Int64  Int64 
─────┼────────────────────────────────────────
   1 │ Valarin        1.0        23582    125
   2 │ Veronil        1.00042    23582    145
   3 │ Myrilas        1.00382     4629    113
   4 │ Tharvel        1.00425    23582    102
   5 │ Amarion        1.01699    23582    124
   6 │ Nymira         1.01699    23582    135
   7 │ Lyrien         1.10875    23582    131
   8 │ Calandor       1.10875    23582    115
   9 │ Kalvotom       1.10918    23582    127
  10 │ Daerlin        1.11895    23582    156
  11 │ Melwenna       1.12404    23582    181
  12 │ Sílion       330.798      23582    163
  13 │ Ereniel      331.232      23582    141
  14 │ Faelion      345.574      23582    103
  15 │ Arilien      352.582      23582     82
  16 │ Faerlin     2169.68       23582     97
  17 │ Firanel     2280.5        23582    108
  18 │ Nimlothen   8160.58       23582    113
  19 │ Sylweth    36513.8        23582    166
  20 │ Vaelis     36600.7        23582    141
  21 │ Lorindel   36698.2        23582    189
  22 │ Elindor    37035.9        23582    123
  23 │ Lysindra   37267.0        23582    136
  24 │ Varnith    37795.7        23582    156
  25 │ Ilverion   38366.0        23582    136
  26 │ Elirwen    38401.0        23582    131
  27 │ Elvian     39959.6        23582    185
  28 │ Thilwen    40501.3        23582    191
  29 │ Nivareth   41891.7        23582    193
  30 │ Thelmir    42780.6        23582    151
  31 │ Maelis     43260.2        23582    125
  32 │ Finariel   45806.9        23582    199
  33 │ Caliriel   46760.0        23582    144
  34 │ Aerlas     48226.6        23582    167
  35 │ Eryndra    48362.4        23582    169
  36 │ ChatGPT    48841.5        23582    141
  37 │ Elanoriel  54178.4        23582     95
  38 │ Lutharion      1.55252e5  23582    195

Zdá se, že dvě řešení se zvláštně odchylují! To bude samozřejmě podrobenou zkoumání před tvrdým deadline! :-)

Ještě paměť.

sort!(df, :pop_m)
record_rank!(df, :pop_m)
show(df[!,[:nick, :pop_m, :score]], allrows=true)
38×3 DataFrame
 Row  nick       pop_m    score  String15   Int64?   Int64 
─────┼───────────────────────────
   1 │ Valarin          0    126
   2 │ Veronil          0    146
   3 │ Myrilas          0    114
   4 │ Tharvel          0    103
   5 │ Amarion          0    125
   6 │ Nymira           0    136
   7 │ Lyrien           0    132
   8 │ Calandor         0    116
   9 │ Kalvotom         0    128
  10 │ Daerlin          0    157
  11 │ Melwenna         0    182
  12 │ Sílion           0    164
  13 │ Ereniel          0    142
  14 │ Faelion          0    104
  15 │ Arilien          0     83
  16 │ Faerlin          0     98
  17 │ Firanel          0    109
  18 │ Nimlothen        0    114
  19 │ Sylweth          0    167
  20 │ Vaelis           0    142
  21 │ Lorindel         0    190
  22 │ Elindor          0    124
  23 │ Lysindra         0    137
  24 │ Varnith          0    157
  25 │ Ilverion         0    137
  26 │ Elirwen          0    132
  27 │ Elvian           0    186
  28 │ Thilwen          0    192
  29 │ Nivareth         0    194
  30 │ Thelmir          0    152
  31 │ Maelis           0    126
  32 │ Caliriel         0    145
  33 │ Aerlas           0    168
  34 │ Eryndra          0    170
  35 │ Elanoriel        0     96
  36 │ Finariel     31408    201
  37 │ ChatGPT      31408    143
  38 │ Lutharion  2000080    198

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]], allrows=true)
38×2 DataFrame
 Row  nick       score  String15   Int64 
─────┼──────────────────
   1 │ Arilien       83
   2 │ Elanoriel     96
   3 │ Faerlin       98
   4 │ Tharvel      103
   5 │ Faelion      104
   6 │ Firanel      109
   7 │ Myrilas      114
   8 │ Nimlothen    114
   9 │ Calandor     116
  10 │ Elindor      124
  11 │ Amarion      125
  12 │ Valarin      126
  13 │ Maelis       126
  14 │ Kalvotom     128
  15 │ Lyrien       132
  16 │ Elirwen      132
  17 │ Nymira       136
  18 │ Lysindra     137
  19 │ Ilverion     137
  20 │ Ereniel      142
  21 │ Vaelis       142
  22 │ ChatGPT      143
  23 │ Caliriel     145
  24 │ Veronil      146
  25 │ Thelmir      152
  26 │ Daerlin      157
  27 │ Varnith      157
  28 │ Sílion       164
  29 │ Sylweth      167
  30 │ Aerlas       168
  31 │ Eryndra      170
  32 │ Melwenna     182
  33 │ Elvian       186
  34 │ Lorindel     190
  35 │ Thilwen      192
  36 │ Nivareth     194
  37 │ Lutharion    198
  38 │ Finariel     201

A pro zajímavost celá tabulka s nejzajímavějšími sloupci, v závěrečném pořadí.

show(df[!,[:nick, :code, :constr_m, :large_t, :glider_t, :pop_t]], allrows=true)
38×6 DataFrame
 Row  nick       code   constr_m       large_t    glider_t     pop_t          String15   Int64  Float64        Float64    Float64      Float64       
─────┼────────────────────────────────────────────────────────────────────────
   1 │ Arilien       84   2609.0          6.73097   4756.95       352.582
   2 │ Elanoriel     53      1.33333      1.0        732.407    54178.4
   3 │ Faerlin       42   6946.22         3.02283   1866.8       2169.68
   4 │ Tharvel      136   7816.44         6.1321     151.599        1.00425
   5 │ Faelion       88   1739.67         8.08787   5423.99       345.574
   6 │ Firanel      229  14380.3          5.35402     51.3666    2280.5
   7 │ Myrilas      110  66759.3          7.19268      6.98391      1.00382
   8 │ Nimlothen    107  13891.4          5.15752    665.814     8160.58
   9 │ Calandor      64    870.833        6.04293   4536.9          1.10875
  10 │ Elindor       66      1.22222      9.62474   4646.06     37035.9
  11 │ Amarion      117    871.111       13.0712    8745.32         1.01699
  12 │ Valarin      103      2.30767e5   12.0968       1.0          1.0
  13 │ Maelis        62      1.0          9.945     5388.0      43260.2
  14 │ Kalvotom     149  78131.1          2.64193    792.154        1.10918
  15 │ Lyrien        91  69447.4          7.43022   4869.09         1.10875
  16 │ Elirwen       56      1.22222     21.813    12102.6      38401.0
  17 │ Nymira       107      1.33333     15.1881    6383.08         1.01699
  18 │ Lysindra      67      1.0         18.078    10339.9      37267.0
  19 │ Ilverion      63      1.22222     23.8599   15821.2      38366.0
  20 │ Ereniel      124    876.444        8.54478   5612.09       331.232
  21 │ Vaelis        75      1.22222     26.4397   16964.6      36600.7
  22 │ ChatGPT       54      1.22222     12.0278    1662.64     48841.5
  23 │ Caliriel      67      1.33333     10.2243    1636.65     46760.0
  24 │ Veronil      131   6947.89        18.6701     175.028        1.00042
  25 │ Thelmir       63    870.222       10.4478    4208.47     42780.6
  26 │ Daerlin       80      2.26957e5   74.787        3.80068      1.11895
  27 │ Varnith       58      1.22222     30.0671   20397.2      37795.7
  28 │ Sílion       103  57295.9          8.37149    926.31       330.798
  29 │ Sylweth      100      1.22222     30.3874   17451.7      36513.8
  30 │ Aerlas        96      1.22222     22.004    13063.1      48226.6
  31 │ Eryndra      151      1.11114e5   23.2878   14173.4      48362.4
  32 │ Melwenna      69  56426.7         27.0393   17989.3          1.12404
  33 │ Elvian        54      1.22222    133.206    59111.4      39959.6
  34 │ Lorindel     103      1.0         58.132    31513.8      36698.2
  35 │ Thilwen       61      1.22222     52.9268   29175.7      40501.3
  36 │ Nivareth      66      1.22222     62.0769   28760.2      41891.7
  37 │ Lutharion     99  56004.0         20.3101    6814.16         1.55252e5
  38 │ Finariel      89  56429.2         30.5428   20182.1      45806.9