Wprowadzenie
Ta strona szybko buduje ogromny zbiór danych fragmentów kodu, więc zróbmy coś z tym!
Oto plik danych . Zawiera 9 066 unikalnych par język + fragment kodu dla 113 języków, wszystkie pobrane z tej witryny. Format jest rozdzielony tabulatorami (język-TAB-urywek), wszystkie znaki nowego wiersza we urywkach są zastąpione <LF>
, a wszystkie tabulacje zastąpione 4 spacjami. Istnieje co najmniej 5 fragmentów dla każdego języka.
[aktualizacja: Wprowadziłem niewielką zmianę w pliku danych, aby scalić niektóre wersje Pythona i RegExp, które wcześniej mi brakowały - powyższy link został zaktualizowany]
Wyzwanie
Napisz program lub funkcję, która pobiera fragment kodu i wyświetla język, w którym jest napisany (szczegóły poniżej). Całkowity rozmiar źródła + wszelkie wymagane dane muszą wynosić 300 bajtów lub mniej, a program musi wyświetlać poprawny język, jeśli otrzyma własny kod źródłowy. Wygrywa najwyższa dokładność (najbardziej poprawne odpowiedzi w powyższym zestawie danych).
Zasady
- Całkowity rozmiar kodu źródłowego, zasobów i wymaganych flag kompilacji / środowiska wykonawczego nie może przekraczać 300 bajtów.
- Twoja odpowiedź zostanie przetestowana w oparciu o powyższy zestaw danych; otrzyma jedną z wartości „Snippet” jako dane wejściowe, a jego wyniki zostaną porównane z „poprawnymi” danymi wyjściowymi zgodnie z zestawem danych. Zostanie to powtórzone dla wszystkich wpisów w zbiorze danych, a ostateczna liczba poprawnych odpowiedzi to Twój wynik.
- Możesz wybrać kodowanie wejściowe - zakładam UTF-8, więc jeśli potrzebujesz innego kodowania, podaj je w swojej odpowiedzi.
- Nie musisz używać
<LF>
zamiennika dla nowych linii; jeśli twój wpis spodziewa się otrzymywać nowe wiersze jako dosłowne nowe znaki (znak 10), określ to w swojej odpowiedzi. - Wpis musi zawierać język, w którym według niego jest wpisany fragment kodu. Aby uniknąć konieczności kompresji wielu ciągów językowych, pozwolę na odwzorowania (jeśli chcesz wypisać 3 dla „Java”, to w porządku); zwróć uwagę na mapowania w swojej odpowiedzi.
- Możesz mieć tylko 1 mapowanie wyjściowe dla każdego języka (tzn. Jeśli 3 oznacza „Java”, nie możesz również mieć 4 oznaczenia „Java”).
- Po otrzymaniu własnego kodu źródłowego twój program musi uzyskać poprawną odpowiedź (musi wypisać język, w którym jest napisany).
- Nie musisz obsługiwać wszystkich języków w zbiorze danych i możesz wesprzeć dodatkowe języki, jeśli chcesz (np. Jeśli twój wpis nie jest w jednym z języków w zbiorze danych).
- Twój program musi być deterministyczny (dwukrotne podanie tego samego sygnału wejściowego musi dać ten sam wynik).
Łamanie krawatów
- Decyzje dotyczące remisów będą redukowane przez zestaw danych do momentu wygrania jednego wpisu. Zestaw danych zostanie zmniejszony przez usunięcie wszystkich fragmentów dla najpopularniejszego języka (tzn. Powiązania są przerywane przez dokładność w rzadszych językach). Na przykład, jeśli A i B uzyskają 70% wyniku w pełnym zbiorze danych, wszystkie fragmenty Pythona zostaną usunięte. Jeśli oba A i B zdobędą teraz 60%, CJam zostanie usunięty. Jeśli A uzyska teraz 50%, a B 55%, B jest zwycięzcą.
- Jeśli zostanie osiągnięta 100% dokładność, decyzje o powiązaniach zostaną ustalone na podstawie drugiego (ślepego) zestawu danych zawierającego więcej próbek dla tych samych języków.
Przykład 1
Skrypt Pythona:
print("python")
Skrypt z powodzeniem tworzy „python”, gdy otrzymuje swój własny kod źródłowy, więc jest poprawny. W zbiorze danych wynik wynosi 1008/9066 = 11,1%
Przykład 2
Funkcja JavaScript:
function f(s){return /function/.test(s)?1:2}
Z mapowaniami 1 → javascript, 2 → python. Ponownie z powodzeniem produkuje 1 („javascript”) dla własnego źródła, a w zestawie danych osiąga wynik 1092/9066 = 12,0%
Skąd pochodzą dane?
Utworzyłem zapytanie SEDE, aby pobrać próbki z [golf-golfa] wyzwań na tej stronie. Z uzyskanych 10 000 odpowiedzi użyłem zhakowanego skryptu python, aby znaleźć kod i nazwę języka dla każdego z nich, a następnie odfiltrowałem dowolny język z mniej niż 5 przykładami. Dane nie są w 100% czyste (wiem, że zostały wyciągnięte niektóre fragmenty kodu), ale powinny być wystarczająco dobre.
Zainspirowany tym wyzwaniem z początku roku: kto to powiedział? Wybory prezydenckie w 2016 r
Również częściowo związany z tym, co to jest język?
Odpowiedzi:
C, 297 bajtów, dopasowanie 43.194351% (v2)
To pierwsze wyzwanie, w którym nie brałem udziału w golfie. Zaskakujące jest to, że języki gry w golfa są dość łatwe do rozdzielenia, z dokładnością około 60% dla każdego języka.
Kod wymaga wprowadzenia jako ciągu UTF-8, wyniki oparte na wersji 2 dostarczonego zestawu danych. Ten kod nie wymaga
<LF>
zastąpienia rzeczywistymi znakami nowej linii.Tabela mapowania:
Procent oparty jest na moich trafieniach / obliczeniach ogółem: 3916 trafień / 9066 łącznie.
źródło
define S(x)
i 1, gdziekolwiek masz?1
.?1
sztuczce i zapomniałem o drugiej. ;-)Python 3,
271278 bajtów, dopasowane 25,049636% (wersja 2, niezweryfikowana)mapa:
znacznie lepiej grał w golfa (prawdopodobnie nadal nie jest świetny), w końcu przekroczył barierę 25%! Dane wejściowe zostały
<LF>
zastąpione przez newline (\n
)źródło
exec
próba. Nawiasem mówiąc, możesz poprosić o dane wejściowe, które zostały<LF>
wcześniej zastąpione\n
, więc możesz zapisać tam kilka bajtów, aby potencjalnie dodać trochę więcej dostrajania.decode('utf-8')
do przekonwertowania surowej wejściowej tablicy bajtów na natywny ciąg Unicode (utf-16?) W Pythonie przed przekazaniem jej do mojej funkcji.