Jest to inny rodzaj wyzwania kompresji. W normalnym wyzwaniu złożoności Kołmogorowa wymagane jest dokładne odtworzenie listy. Tutaj możesz zaokrąglać wartości w dowolny sposób. Jaki jest haczyk? Twój wynik jest karany na podstawie tego, jak błędny jest twój wynik.
Na dole tego pytania znajduje się lista pierwszych energii jonizacji dla pierwszych 108 pierwiastków. Twój program po uruchomieniu powinien wypisać dość dokładną kopię tej listy. Nie będzie żadnych danych wejściowych ani argumentów. Dla celów punktacji twój wynik powinien być deterministyczny (ten sam wynik za każdym razem).
Format wyjściowy
Twój program / funkcja musi wypisać listę 108 liczb, posortowaną według rosnącej liczby atomowej. Ta lista może mieć dowolny odpowiedni format. Poniższe dane źródłowe podano we właściwej kolejności, od wodoru po hass.
Punktacja
Twój wynik będzie równy długości twojego programu w bajtach plus kara zaokrąglająca. Kara zaokrąglająca jest obliczana dla każdego elementu i sumowana, aby dać karę całkowitą.
Jako przykład weźmy liczbę 11.81381
. Powiedzmy, że twój program wyświetla niepoprawną wartość 11.81299999
.
Po pierwsze, oba numery są mnożone przez tę samą moc 10 tak, że nie ma już punkt dziesiętny w prawdziwej wartości:
1181381, 1181299.999
. Zera końcowe w prawdziwej wartości są uważane za znaczące.Następnie, bezwzględna różnica zostanie podjęta w celu określenia bezwzględnej błędu:
81.001
.Na koniec obliczamy karę tego elementu jako
max(0, log10(err * 4 - 1)) -> 2.50921
. Ta formuła została wybrana w taki sposób, że błąd <0,5 nie daje żadnej kary (ponieważ odpowiedź jest poprawna w zaokrąglaniu), a jednocześnie daje asymptotyczną 50% szansę, że zaokrąglenie liczby do dowolnego miejsca po przecinku zapewni korzyść netto w wyniku (zakładając, że nie inna kompresja).
Oto implementacja programu do obliczania kar w Try-It-Online . Dane wejściowe do tego programu są dostarczane jako lista liczb, po jednej w wierszu. Rezultatem tego programu jest łączna kara i podział punktacji na element.
Dane
Poniższa lista liczb to dane docelowe w prawidłowej kolejności od liczby atomowej 1 do 108.
13.598434005136
24.587387936
5.391714761
9.322699
8.2980190
11.260296
14.53413
13.618054
17.42282
21.564540
5.1390767
7.646235
5.985768
8.151683
10.486686
10.36001
12.96763
15.7596112
4.34066354
6.11315520
6.56149
6.82812
6.746187
6.76651
7.434018
7.9024678
7.88101
7.639877
7.726380
9.3941990
5.9993018
7.899435
9.7886
9.752392
11.81381
13.9996049
4.177128
5.69486720
6.21726
6.63390
6.75885
7.09243
7.11938
7.36050
7.45890
8.33686
7.576234
8.993822
5.7863552
7.343917
8.608389
9.00966
10.45126
12.1298431
3.893905548
5.211664
5.5769
5.5386
5.473
5.5250
5.582
5.64371
5.670385
6.14980
5.8638
5.93905
6.0215
6.1077
6.18431
6.254159
5.425871
6.825069
7.549571
7.86403
7.83352
8.43823
8.96702
8.95883
9.225553
10.437504
6.1082871
7.4166796
7.285516
8.414
9.31751
10.7485
4.0727409
5.278424
5.380226
6.3067
5.89
6.19405
6.2655
6.0258
5.9738
5.9914
6.1978
6.2817
6.3676
6.50
6.58
6.65
4.90
6.01
6.8
7.8
7.7
7.6
Linie podstawowe i wskazówki
Powyższe dane źródłowe to 906 bajtów, a niektóre narzędzia do kompresji są w stanie doprowadzić je do mniej niż 500 bajtów. Ciekawymi rozwiązaniami są te, które próbują wykonać inteligentne zaokrąglanie, użyć wzorów algebraicznych lub innych technik w celu uzyskania przybliżonych wartości w mniejszej liczbie bajtów niż sama kompresja. Trudno jest jednak ocenić te kompromisy między językami: dla niektórych języków sama kompresja może być optymalna, podczas gdy w wielu innych językach mogą brakować narzędzi do kompresji, więc spodziewam się dużej różnorodności wyników w różnych językach. To dobrze, ponieważ przechodzę przez filozofię „rywalizacji w językach, a nie między nimi”.
Przewiduję, że przydatne może być wykorzystanie trendów w układzie okresowym. Poniżej znajduje się wykres energii jonizacji, dzięki czemu można zobaczyć niektóre z tych trendów.
źródło
Odpowiedzi:
Czysty , 540 bajtów + 64,396 Kara = 604,396
Uwaga: ze względu na czytelność uniknąłem każdego bajtu w
[Char]
literale, ponieważ większości z nich nie można wydrukować. Są one jednak liczone jako jeden bajt na znak zmiany znaczenia (z wyjątkiem wartości null, quote i newline), ponieważ Clean naturalnie pobiera pliki źródłowe kodowane niezależnie (z wyjątkiem wartości null).Wypróbuj online!
To pierwsze wyzwanie, w którym mogłem wykorzystać ogólną zdolność kompresji Clean (technicznie nie kompresującą, to jest binarna serializacja), aby uzyskać rzeczywistą korzyść.
Zacząłem od
[Real]
- listy 64-bitowych liczb zmiennoprzecinkowych, tych z pytania. Po serializacji tej listy uprościłem 10 górnych bitów (które były takie same dla każdej liczby) i optymalną konfigurację dolnych 32 bitów na stałą7<<29+2^62
. Pozostałe 22 bity na liczbę zostały przetłumaczone na 2,75 znaków i zakodowane w postaci ciągu.Pozostawia to całą skompresowaną stałą na zaledwie 302 bajtach , włączając każdą ucieczkę!
źródło
Python 3 ,
355 + 202353 bajtów + 198 kara = 551Wypróbuj online!
Użyłem
0xffff (65535)
jako górnej granicy, ponieważ jest to maksymalna wartość, którą można zapisać w jednym 3-bajtowym znaku Unicode.Ponieważ najwyższa energia jonizacji wynosi ~ 24,587, daje to stosunek
2665
.Aby wygenerować sam łańcuch, użyłem fragmentu
''.join([chr(int(round(n*2665)))for n in ionization_energies])
kodu (na python2 musisz użyćunichr
), twoja konsola może, ale nie musi, być w stanie wydrukować znaków.4-bajtowe znaki, 462 bajty + 99 kar = 561
Wypróbuj online!
Ten sam pomysł, ale maksymalna wartość to
0x110000
źródło
0x100**2
wartości, a nie0x100**3
?C, 49 bajtów + 626,048 kary = 675,048
Wypróbuj online!
źródło
f(i){for(i=0;i++<108;)printf("6\n");}
; kara: 625.173330827107; ogółem = 662,173330827f(i){for(i=0;i<108;)puts("6");}
robi to samo w 31 bajtach.i++
(w „31”), alef(i){for(i=108;i;i--)puts("6");}
ma 32.f(i){for(i=108;i--;)puts("6");}
wraca do 31.CJam (389 bajtów + 33,09 kary => 422,09)
kodowane xxd:
Zasadniczo tak jest
Używa niestandardowego formatu zmiennoprzecinkowego o zmiennej szerokości do przechowywania liczb. Wystarczą dwa bity wykładnika; mantysa dostaje od 5 do 47 bitów, w wielokrotnościach 7. Pozostały bit na bajt służy jako separator.
Wydaje się, że dochodzi do korupcji, gdy kopiuję magiczny ciąg, aby stworzyć demo online , dzięki czemu zyskuje około 2 punkty karne więcej. Będę musiał dowiedzieć się, jak zbudować adres URL bezpośrednio ...
Program generacyjny:
Demo online
źródło
"
powoduje zbyt duży błąd, aby był tego wart?Galaretka ,
379 361360 bajtów + 0 Kara = 360-18 używając obserwacji Petera Taylora (wartości rzędu 10 mają wiodące 1 lub 2, podczas gdy wartości rzędu 1 nie mają).
Wypróbuj online!
W jaki sposób?
Tworzy te dwie stałe (AKA nilads):
Następnie wykorzystuje je do zrekonstruowania reprezentacji liczb zmiennoprzecinkowych.
Pełny program ma następującą postać:
(gdzie
...
są zakodowane liczby do budowy B i A)i działa w następujący sposób:
źródło
Galaretka , 116 bajtów + 429,796016684433 Kara = 545,796016684433
Wypróbuj online!
Nic szczególnie spektakularne, lista indeks kodu strony,
“...‘
(liczby z zakresu od 0 do 249), do których każdy dodamy 47 ,+47
a następnie podzielić przez 12 ,÷12
.źródło
Galaretka , 164 bajty + 409,846 = 573,846
Wypróbuj online!
Jest tam skompresowana liczba, która jest konkatenacją pierwszych trzech cyfr każdej energii (łącznie z końcowymi zerami). Otrzymuję listę tych trzycyfrowych liczb, a
Ds3Ḍ
następnie dzielę każdą przez 100 za pomocą÷³
. Niektóre liczby powinny być podzielone tylko przez 10, więc mnożę niektóre z nich przez 10, aby nieznacznie poprawić wynik (×⁵$2R;6r⁵¤¤;15r18¤¤¦
).Poprzednia wersja :
Galaretka , 50 bajtów + 571,482 kary = 621,482
Wypróbuj online!
Zaokrąglono każdą energię do najbliższej jednocyfrowej liczby całkowitej. Po połączeniu daje to
995989999958689999467777788889689999466777777889679999456656666666666657888899996778994556666666666677567888
.“¡9;ẋkñ¬nƑḳ_gÐ.RḊụʠṁṬl⁾l>ɼXZĖSṠƈ;cḶ=ß³ṾAiʠʠɼZÞ⁹’
to podstawowa liczba 250, która to daje.DY
łączy cyfry tego numeru z znakami nowej linii.źródło
Java 8, 48 bajtów + 625,173330827107 Kara = 673,173330827107
Wypróbuj online.
Pierwsza wersja, która drukuje 108 razy
6
. Spróbuję ulepszyć stąd.źródło
J , 390 bajtów + 183,319 Kara = 573,319
Wypróbuj online!
Zaokrągliłem liczby do czterech cyfr dziesiętnych i podzieliłem je na jedną listę dla liczb całkowitych, jedną listę dla pierwszych 2 cyfr ułamkowych i jedną dla drugich 2 cyfr ułamkowych. Każdą cyfrę zakodowałem za pomocą znaku do wydrukowania. Aby zdekodować, po prostu wydobywam elementy łączące i ułamkowe pewnej liczby z powiązanych list znaków i składam je z powrotem do pływaka.
J , 602 bajtów + 0 Kara = 602
Wypróbuj online!
Tym razem wybrałem nieco inne podejście. Dzielę liczby na 2 strumienie - pierwszy zawiera części całkowite, które są po prostu zakodowane za pomocą pojedynczego znaku do wydrukowania. Drugi strumień zawiera całe części ułamkowe. Usunąłem wszystkie odstępy między cyframi i dodałem każdy podciąg o długości 1-9 (poprawiłem pierwszą frakcję, która ma 13 cyfr). Następnie zakodowałem tę listę jako podstawową liczbę 94, przedstawiłem ją jako listę znaków.
Można zapisać około 20 bajtów, jeśli czasownik zostanie przepisany jako cichy.
źródło
Bubblegum , 403 + 9,12 = 412.12
Wypróbuj online!
źródło