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)
Row | variable | mean | min | median | max | nmissing | eltype |
---|---|---|---|---|---|---|---|
Symbol | Union… | Any | Union… | Any | Int64 | Type | |
1 | nick | Aerlas | Ylathriel | 0 | String15 | ||
2 | code | 86.025 | 2 | 82.0 | 229 | 0 | Int64 |
3 | comment | 52.875 | 4 | 41.5 | 186 | 0 | Int64 |
4 | constr_t | 6.51517e6 | 43.2624 | 787162.0 | 7.5532e7 | 2 | Union{Missing, Float64} |
5 | constr_m | 4.04402e6 | 144 | 125420.0 | 33230496 | 2 | Union{Missing, Int64} |
6 | large_t | 6.48696e9 | 2.92773e8 | 3.68425e9 | 3.89992e10 | 2 | Union{Missing, Float64} |
7 | large_m | 3.08227e9 | 0 | 8.00008e8 | 35206524800 | 2 | Union{Missing, Int64} |
8 | glider_t | 9.77291e8 | 98480.0 | 5.32382e8 | 5.82129e9 | 2 | Union{Missing, Float64} |
9 | glider_m | 7.41883e8 | 0 | 1.28667e8 | 8803337600 | 2 | Union{Missing, Int64} |
10 | pop_t | 59994.9 | 2.354 | 86055.8 | 365464.0 | 2 | Union{Missing, Float64} |
11 | pop_m | 54286.7 | 0 | 0.0 | 2000080 | 2 | Union{Missing, Int64} |
12 | pop_c | 23083.2 | 4629 | 23582.0 | 23582 | 2 | Union{Missing, Int64} |
13 | score | 0.0 | 0 | 0.0 | 0 | 0 | Int64 |
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
population
Test: výpočet parametru 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