Jak wszyscy wiemy, meta jest przepełnione ze skargami o zabicie kodu golfa między językami (tak, każde słowo jest link indywidualne, a te mogą być tylko wierzchołkiem góry lodowej).
Mając tak dużo zazdrości wobec tych, którzy rzeczywiście próbowali przejrzeć dokumentację Pyth, pomyślałem, że byłoby miło mieć trochę bardziej konstruktywnego wyzwania, jakim jest strona internetowa specjalizująca się w wyzwaniach kodu.
Wyzwanie jest raczej proste. Jako dane wejściowe mamy nazwę języka i liczbę bajtów . Możesz je traktować jako dane wejściowe funkcji stdin
lub domyślną metodę wprowadzania w swoich językach.
Jako wynik mamy poprawioną liczbę bajtów , tj. Twój wynik z zastosowanym handicapem. Odpowiednio, wyjście powinno być wyjściem funkcji stdout
lub domyślną metodą wyjścia twojego języka. Dane wyjściowe zostaną zaokrąglone do liczb całkowitych, ponieważ uwielbiamy tiebreakers.
Korzystając z najbardziej brzydkiego, zhakowanego zapytania ( link - nie krępuj się go wyczyścić), udało mi się stworzyć zestaw danych (zip z .xslx, .ods i .csv), który zawiera migawkę wszystkich odpowiedzi na pytania związane z golfem . Można użyć tego pliku (a zakładamy, że będzie dostępny do programu, na przykład, jest w tym samym folderze) lub przekonwertować ten plik na inny format konwencjonalnej ( .xls
, .mat
, .sav
itd - ale może zawierać tylko oryginalne dane!). Nazwa powinna pozostać QueryResults.ext
z ext
rozszerzeniem wyboru.
Teraz szczegóły. Dla każdego języka istnieją parametry Boilerplate B
i Verbosity V
. Razem można je wykorzystać do stworzenia liniowego modelu języka. Niech n
będzie rzeczywistą liczbą bajtów i c
będzie poprawionym wynikiem. Korzystając z prostego modelu n=Vc+B
, otrzymujemy skorygowany wynik:
n-B
c = ---
V
Dość proste, prawda? Teraz do ustalenia V
i B
. Jak można się spodziewać, przeprowadzimy regresję liniową, a dokładniej regresję liniową ważoną metodą najmniejszych kwadratów. Nie zamierzam wyjaśniać szczegółów na ten temat - jeśli nie jesteś pewien, jak to zrobić, Wikipedia jest twoim przyjacielem , a jeśli masz szczęście, dokumentacją Twojego języka.
Dane będą następujące. Każdy punkt danych będzie liczbą bajtów n
i średnią liczbą bajtów pytania c
. Aby uwzględnić głosy, punkty będą ważone według liczby głosów plus jeden (w celu uwzględnienia 0 głosów), nazwijmy to v
. Odpowiedzi negatywne powinny zostać odrzucone. Mówiąc najprościej, odpowiedź z 1 głosem powinna liczyć się tak samo jak dwie odpowiedzi z 0 głosem.
Dane te są następnie dopasowywane do wyżej wspomnianego modelu n=Vc+B
przy użyciu ważonej regresji liniowej.
Na przykład , biorąc pod uwagę dane dla danego języka
n1=20, c1=8.2, v1=1
n2=25, c2=10.3, v2=2
n3=15, c3=5.7, v3=5
Teraz tworzymy odpowiednie macierze i wektory A
, y
a W
wraz z naszymi parametrami w wektorze
[1 c1] [n1] [1 0 0] x=[B]
A=[1 c2] y=[n2] W=[0 2 0], [V]
[1 c3] [n3] [0 0 5]
rozwiązujemy równanie macierzowe (z '
oznaczeniem transpozycji)
A'WAx=A'Wy
dla x
(i w konsekwencji otrzymujemy nasz B
i V
parametr).
Twój wynik będzie wynikiem twojego programu, jeśli podasz własną nazwę języka i liczbę bajtów. Tak, tym razem nawet użytkownicy Java i C ++ mogą wygrać!
UWAGA: Zapytanie generuje zestaw danych z wielu wierszy z powodu nieprawidłowych osób korzystających z „cool” i formatowaniem ludzi nagłówek znakowaniu ich kod prowokacji pytania jak code-golf . Pobrane przeze mnie pliki usunęły większość wartości odstających. NIE używaj pliku CSV dostarczonego z zapytaniem.
Miłego kodowania!
źródło
C++ <s>6 bytes</s>
. Poza tym nigdy wcześniej nie korzystałem z T-SQL i już jestem pod wrażeniem, że udało mi się wyodrębnić bajt.Odpowiedzi:
Mathematica, 244,719 (245 bajtów)
Przypadek testowy
Co z innymi językami?
Alternatywny model :
log(c)=log((n-B)/V)
Jedną z godnych uwagi cech kodowego golfa (i prawdopodobnie innych problemów z kodowaniem) jest to, że rozkład długości programów ma tendencję do rozkładu wykładniczego (w przeciwieństwie do rozkładu jednolitego). W związku z tym model
log(n)=log(Vc+B)
znacznie bardziej równoważy wpływy między punktami z dużymic
i małymic
.Jak widać na poniższych wykresach, rozkład punktów jest odpowiedni do dopasowania w skali logarytmicznej.
Wyniki nowego modelu
Znaleźliśmy dwa wyjątkowe języki - Ruby
V=0.724
zi RetinaV=1.322
oraz kryterium bycia popularnym językiem golfa - mające duży ujemny talerz.źródło
csv
.Python3, 765.19 (765) bajtów
Prawdopodobnie jest tu miejsce na grę w golfa. Wymaga numpy dla macierzy. Odczytuje ze standardowego formatu, sformatowany w następujący sposób: [język] [bajtów / n]. Zatrzymuje się podczas wysyłania q.
Wyniki
W pewnym momencie mogłem zrobić coś złego; Otrzymuję inne wyniki niż odpowiedź Mathematica:
źródło