Otrzymasz nazwę jednego z 20 największych obiektów w Układzie Słonecznym. Twoim zadaniem jest zwrócenie przybliżonego promienia wyrażonego w kilometrach.
Jest to wyzwanie kodowe, w którym wynik składa się z długości kodu (w bajtach) pomnożonej przez współczynnik kar , w oparciu o twoje najgorsze przybliżenie. Dlatego wygrywa najniższy wynik .
„As we travel the universe” to ostatnia linijka piosenki Planet Caravan autorstwa Black Sabbath , również później ujęta przez Pantera .
Obiekty Układu Słonecznego
Źródło: Wikipedia
Uwaga: ranga jest podana wyłącznie w celach informacyjnych. Dane wejściowe to nazwa obiektu.
n | Object | Radius (km)
----+----------+-------------
1 | Sun | 696342
2 | Jupiter | 69911
3 | Saturn | 58232
4 | Uranus | 25362
5 | Neptune | 24622
6 | Earth | 6371
7 | Venus | 6052
8 | Mars | 3390
9 | Ganymede | 2634
10 | Titan | 2575
11 | Mercury | 2440
12 | Callisto | 2410
13 | Io | 1822
14 | Moon | 1737
15 | Europa | 1561
16 | Triton | 1353
17 | Pluto | 1186
18 | Eris | 1163
19 | Haumea | 816
20 | Titania | 788
Lub jako przyjazne listy kopiuj-wklej:
'Sun', 'Jupiter', 'Saturn', 'Uranus', 'Neptune', 'Earth', 'Venus', 'Mars', 'Ganymede', 'Titan', 'Mercury', 'Callisto', 'Io', 'Moon', 'Europa', 'Triton', 'Pluto', 'Eris', 'Haumea', 'Titania'
696342, 69911, 58232, 25362, 24622, 6371, 6052, 3390, 2634, 2575, 2440, 2410, 1822, 1737, 1561, 1353, 1186, 1163, 816, 788
Twój wynik
Niech będzie spodziewanym promieniem obiektu i niech będzie odpowiedzią twojego programu na ten obiekt.
Następnie twój wynik jest zdefiniowany jako:
gdzie jest długością twojego kodu w bajtach.
Przykład:
Jeśli Twój kod ma rozmiar bajtów, a najgorsze przybliżenie dotyczy Księżyca o promieniu szacunkowym km zamiast km, wynik byłby następujący:
Im niższy, tym lepiej.
Zalecany nagłówek odpowiedzi:
Language, 100 bytes, score = 302
Możesz użyć tego skryptu, aby obliczyć swój wynik (pierwsza linia = długość kodu, kolejne 20 linii = Twoje wyniki, od Sun do Titania).
Zasady
- Możesz wziąć nazwę obiektu w całości małymi lub dużymi literami lub dokładnie tak, jak opisano powyżej (wielkość liter). Inne mieszane przypadki są niedozwolone.
- Gwarantowanym wejściem jest jedna z 20 możliwych nazw.
- Możesz zwrócić liczby całkowite lub zmiennoprzecinkowe. W obu przypadkach kara musi być obliczona bezpośrednio na podstawie tych wartości (nie zaokrąglonych wartości w przypadku liczb zmiennoprzecinkowych).
- Musisz zwrócić wartości dodatnie.
- Puste programy są niedozwolone.
źródło
7512
dla wszystkich przypadków testowych. Zobaczę, czy wkrótce zajmę się tworzeniem rozwiązania MathGolf, ale trudno będzie pokonać 05AB1E.Odpowiedzi:
PowerShell , 3 bajty, wynik 3637
Wypróbuj online!
Bardzo naiwna, nudna, realizacja; zwraca tylko
20000
bez względu na dane wejściowe. Eksperymentowanie z takimi rzeczami, jak specjalne osłonięcie słońca lub użycie wartości zmiennoprzecinkowych zamiast2
wszystkich, przyniosło gorsze wyniki, ponieważ długość kodu wzrosła na tyle, aby zrównoważyć wszelkie zyski z porównania wielkości.źródło
Galaretka , 34 bajty, wynik = 37
Dane wejściowe są pisane wielkimi literami, moc wyjściowa to 1,1 z najmniejszym błędem.
Wypróbuj online!
Jak to działa
źródło
Java (JDK) , 90 bajtów, wynik = 97
Wypróbuj online!
Kredyty
String
zamiast na stałe w wyraźnejint
tablicy.źródło
(...-7)
: Postać, której nie można wydrukować,(char)0
jest pusta, więc musiałem coś dodać. Najpierw próbowałem9
i8
będąc pojedynczymi cyframi, ale9
oczywiście podałem tabulatory, wymagające wielu\t
(po 2 bajty) i8
dałem błąd dotyczący użytego znaku nieskalowanego.*100-700
i grając z wartościami jako ciągiem znaków i tymi dwiema liczbami, ale te są najlepsze, w rzeczywistości Niektóre wartości mogą zmniejszyć bajt liczyć, ale wtedy wynik pozostaje taki sam. Tak losowe wskazanie sprawiło, że (jednym z) najlepszych przypadków;)Wolfram Language
114 103 97 88 8682 bajtów. wynik =114 103 97 89 8783 punktówCo najmniej 6 punktów zaoszczędzonych dzięki
Dennis
, jeszcze kilka dziękilirtosiast
i 6 więcej dziękiuser202729
.Chociaż Mathematica może pobierać dane z Układu Słonecznego (a także wiele dodatkowych danych astronomicznych), konieczne są pewne drobne poprawki, jak wyjaśniono poniżej.
Interpreter[#,"AstronomicalObject"]&
zwróci byt (tj. obiekt obliczalny maszynowo) powiązany z terminem reprezentowanym przez#
.EntityValue[AstronomicalObject[],"Radius"]
zwraca promień encji w milach. W przypadku „Haumea” zwracana jest wartość 816,27 (tj. 507 * 1,61).Mnożenie promienia przez
1.61
konwersję z mil na km. Wartości dziesiętne zamiast liczb całkowitych odpowiadają za znacznie mniej niż 1% błędu, nawet w najbardziej ekstremalnych przypadkach.[[1]]
zwraca wielkość bez jednostki, km. Zostało to później zmienione na#&@@
, dając ten sam wynik.źródło
Python 3 , wynik 95, 95 bajtów
Wypróbuj online!
Python 3 , wynik 133, 133 bajtów
Wypróbuj online!
źródło
PowerShell
150141 bajtów, wynik163153Wypróbuj online!
Skrypt testowy:
Wynik:
Wyjaśnienie:
end of line mode
Jest tylko LF.Przykład:
PowerShell, 178 bajtów, wynik 178
źródło
05AB1E , wynik
1006660 (1006156 bajtów )Port odpowiedzi Javy @ OlivierGrégoire , więc jeśli podoba ci się ta pierwsza odpowiedź, pamiętaj, aby go również głosować!
Dane wejściowe w tytule.
Sprawdź wszystkie przypadki testowe.
05AB1E , wynik 100 (100 bajtów )
Wprowadzanie pełnymi małymi literami. Podaje dokładny promień, więc nie dodaje się kary.
Sprawdź wszystkie przypadki testowe.
Wyjaśnienie:
Zobacz moją wskazówkę 05AB1E (sekcje Jak kompresować duże liczby całkowite? I Jak kompresować ciągi znaków nie częścią słownika? ), Aby zrozumieć, jak działa używana kompresja.
Stworzyłem 70-bajtową alternatywę, która odwzorowałaby słońce600,000
; [Jowisz, Saturn] do60,000
; [uran, neptun] do30,000
; [ziemia, Wenus] do6,000
; [mars, ganymede, titan, rtęć, callisto] do3,000
; [io, moon, europa, triton, pluto, eris] to1,500
; i [haumea; titania] do750
. Niestety uzyskał wynik 117. Zobaczę później, czy uda mi się uzyskać mniej niż 100 przy alternatywnym podejściu.źródło
Mathematica, 57 bajtów, wynik =
6258-4 bajty / wynik dzięki lirtosiast !
Po prostu sprawdza Wolfram Alpha dla średniego promienia.
źródło
WolframAlpha
funkcja była używana co najmniej cztery razy ...Galaretka , 28 bajtów, wynik = 31
Wykorzystuje to konfigurowalne wbudowane haszowanie, które dodałem do Jelly na sugestię @ lirtosiast.
Dane wejściowe są w tytule, moc wyjściowa to 1,1 z najmniejszym błędem.
Wypróbuj online!
Jak to działa
Ta odpowiedź składa się tylko z dwóch części.
“__ʋ7ṗ“RUu⁽NM\sOSJj[FL‘ḥ
używa nowego wbudowanego do mapowania każdego z 20 możliwych danych wejściowych na 15 różnych liczb całkowitych.1.1*
podnosi 1,1 do mocy obliczeniowej.“__ʋ7ṗ“RUu⁽NM\sOSJj[FL‘
ḥ
Następnie generujemy 64 64-bitowe liczby całkowite poprzez zastosowanie SHAKE256-4096 do reprezentacji ciągu wewnętrznej reprezentacji
ḥ
prawego argumentu, a następnie pocięcie powstałych 4096 bitów na 64 64-bitowe fragmenty.ḥ
Aby znaleźć odpowiednią konfigurację skrótu, użyłem brutalnego forcera w C, który jest częścią repozytorium Jelly .
źródło
Python 2 , 155 bajtów, wynik = 155
Wypróbuj online!
Zaskakująco dobre dla tego leniwego rozwiązania ... będzie również poprawiać. ;-)
źródło
Japt , 86 bajtów, wynik = 94
Wypróbuj dla wszystkich danych wejściowych , oblicz wynik lub sprawdź najwyższy błąd
Bardzo podobny do oryginalnej odpowiedzi Oliviera. Wszystkie dane są pisane małymi literami.
Po różnych udoskonaleniach wartości wyjściowych bieżącym najwyższym błędem jest Wenus przy nieco ponad 4%.
Wyjaśnienie, że teraz rzeczy są trochę bardziej stabilne:
Ciąg nazw jest
sujusaurneeavemagatimecaiomoeutrplerha
kompresowany przy użyciu wbudowanej kompresji Japt. Liczby reprezentujące promienie są obliczane w następujący sposób:źródło
Japt,
777675 bajtów, wynik = 75Najpierw przejdź; Chciałem wypróbować karę zerową, aby dać sobie punkt wyjścia do pracy. Wrócimy do niego jutro, aby zobaczyć, jakie ulepszenia można wprowadzić, miejmy nadzieję, że nadal za 0 punktów karnych.
Dane wejściowe nie uwzględniają wielkości liter.
Spróbuj lub przetestuj wszystkie wejścia
The
"..."
Reprezentuje ciąg zawierający wiele unprintables. Punkty kodowe to:Aby szybko wyjaśnić: ciąg zostaje podzielony na 2-znakowe części. Następnie indeksujemy do tej tablicy przy użyciu części formuły ovs oraz niektórych zawijania indeksów, a następnie mapujemy 2 znaki na ich współrzędne kodowe.
54 bajty, wynik = 58
Port rozwiązania Oliviera .
Przetestuj wszystkie wejścia
źródło
%24
:-)Rubinowy , 105 bajtów, wynik 109
Wypróbuj online!
Jeśli podzielimy 700000 przez promienie, otrzymamy sekwencję, która rośnie odpowiednio liniowo (choć raczej nierównomiernie). Przyrosty w poniższej tabeli można aproksymować wartościami znaków ASCII. Problem z tym podejściem polega na tym, że wymaga dekodowania danych wejściowych do wartości, która porządkuje różne nazwy według rozmiaru.
Drobny problem polega na tym, że różnica między Eris a Haumeą jest dość duża.
~~d
Aby zakodować ten przyrost w formacie tylko ASCII, wymagane są trzy znaki . Łańcuch od planety do indeksu ma dwie spacje „planety duchów” do wypełnienia indeksu.źródło
T-SQL,
203 202 201196 bajtów, wynik =217 216 212208Podziały linii służą wyłącznie do odczytu.
Dane wejściowe są pobierane za pośrednictwem istniejącej tabeli i z kolumną varchar v , zgodnie z naszymi standardami we / wy .
Łączy tabelę wprowadzania z tabelą w pamięci pierwszych dwóch znaków i zwraca pozostałe cyfry x100.
Traktuje „Tytana” jako specjalny przypadek użycia
IIF
.EDYCJA : Zapisano 1 bajt (i 1 punkt), używając
STUFF
do usunięcia dwóch pierwszych znaków zamiastSUBSTRING
. Dzięki, t-clausen.dk!EDYCJA 2 : Chciałem zobaczyć, co by się stało, gdybym próbował zapisać kolejny bajt, mnożąc każdą wartość wyszukiwania przez 99 zamiast 100, i zdziwiłem się, że faktycznie wzrosła to dokładność (najmniej dokładnego oszacowania) !.
Doprowadziło mnie to do pewnych prób i błędów oraz do niektórych fantazyjnych tabel danych typu „co, jeśli”, w których znalazłem optymalne rozwiązanie przy użyciu mnożnika 89 (co oczywiście zmieniło wszystkie moje przechowywane wartości).
Więc chociaż oszczędza mi to tylko jeden bajt, tak naprawdę poprawia mój wynik o 4,6 w porównaniu z poprzednim rozwiązaniem.
EDYCJA 3 : Wyszukano wyżej zamiast niżej i znalazłem jeszcze lepszy współczynnik mnożenia, 198 . Wartości pozostają w miarę dokładne podczas skracania przechowywanego ciągu o kilka znaków, co poprawia mój wynik.
źródło
PowerShell , 203 bajty, wynik 203
Wypróbuj online!
Bardzo podobny do odpowiedzi Oliviera, teraz kiedy ją widzę, ale rozwinął się niezależnie.
źródło
Węgiel drzewny , 101 bajtów, wynik = 101
Wypróbuj online!Link jest do pełnej wersji kodu. Wyjaśnienie:
Weź 1 i 11 znak (cyklicznie) ciągu wejściowego i połącz je.
Sprawdź je w ciągu
SuJiSrUuNtEEVVMrGnTTMcClIIMoEpToPPEiHeTa
podzielonym na pary znaków.Podziel ciąg
m.w'fv&J|\"l|\"e1 c& _c Ca ;e ;* 9a 9C 31 2; 0I .7 ,N ,7 (X (<
na grupy po trzy znaki i weź odpowiednią grupę.Zdekoduj wynik jako liczbę podstawową-95, używając zestawu znaków drukowalnych ASCII jako cyfr. Przykład:
Io
jedenasta postać toI
, więc patrzymy w góręII
i stwierdzamy, że jest to 13. największy obiekt, a jego rozmiar jest31
zgodny z mapą19 * 95 + 17 = 1822
.źródło
Szybki 4 , 225 bajtów, wynik = 241
Prawdopodobnie grał w golfa więcej (może w obszarze „Ga-Me-Ca”?), Ale Swift nie jest często używany (może z jakiegoś powodu.)
i nie golfił
Wypróbuj online!
Próbowałem różnych „kluczowych rozmiarów” mapy, ale oczywiście 1 ma wiele starć, a użycie trzech znaków nie daje mi
i=="Titan" ?2575:
17 znaków, ponieważ do zarządzania jest „Io” (i zajmie to więcej niż 3 znaki, Myślę).źródło
JavaScript (ES6), 152 bajty, wynik = 163
Cóż, to dość standardowe rozwiązanie, ale i tak mi się podobało!
Mój wynik:
Wypróbuj online!
źródło
FAŁSZ , 152 bajty, wynik = 563
Leniwa odpowiedź przy użyciu długości słów i pierwszych liter, ale usprawiedliwiam się tym, że używam dziwnego języka
Wypróbuj online! (skopiuj wklej kod, naciśnij pokaż, a następnie uruchom)
Moje wyniki:
źródło
C (gcc) , 118 bajtów, wynik = 135
Wypróbuj online!
Punktacja
Zniszczony
Nazwa obiektu jest przekształcana w hasz jednoznakowy poprzez uciążliwy proces
którego wzdęcie wskazuje na „Titan” / „Titania” jako głównych przestępców. Uwzględniono włączenie ostatniej postaci do skrótu, ale nadal wymaga to znaku
strlen()
znaku C. Pierwsze wystąpienie znaku haszowania jest wyszukiwane w łańcuchu hash / data. Kiedy zostanie znaleziony, następny znak jest pobierany i używany do przybliżenia promienia przedmiotowego obiektu.Znak danych zawiera przesunięty, skalowany logarytm naturalny promienia. Wygenerowano tak:
Skala została wybrana na podstawie wysoce naukowych prób i błędów, a także przesunięcia w celu uwzględnienia wartości w zakresie drukowanego zakresu ASCII przy jednoczesnym unikaniu ukośników odwrotnych. Pewne przegrupowanie obiektów w łańcuchu było konieczne z powodu niektórych kolizji mieszania / danych.
źródło
Python 2 , 89 bajtów, wynik = 234
Wypróbuj online!
Wydaje się, że większość opublikowanych odpowiedzi wykorzystała strategię „kodowania / dekodowania”. Zastanawiałem się, jak dobrze mogę to zrobić, szacując średnicę ciał niebieskich za pomocą prostego równania. To było zabawne ćwiczenie, ale umiarkowane oszczędności w bajtach są więcej niż rekompensowane przez karę za dokładność.
Rdzeniem tego rozwiązania jest równanie szacunkowe:
gdzie x jest dwukrotnością rzędu rangi promienia ciała.
Generuję wartość x na podstawie ciągu wejściowego za pomocą modyfikacji rozwiązania @Erik the Outgolfer's Python 2. Zapisałem kilka bajtów w jego kodzie, przekształcając moje równania do pracy z [2..40] zamiast [1..20].
Kod do generowania zamówień rang zajmuje ponad 2/3 bajtów całego rozwiązania. Jeśli ktoś ma bardziej zwarty sposób generowania rang, rozwiązanie to można jeszcze bardziej skrócić. Z powodu kary za celność (około 2,6) wynik znacznie się poprawił.
Generowanie równania
Użyłem metod statystycznych do wyszukiwania prostych równań w celu oszacowania wielkości każdego ciała na podstawie jego rangi. Po części w oparciu o spostrzeżenia w rozwiązaniu Ruby @Level River St i uogólniając, zdecydowałem się na równania postaci:
Pracując w R, użyłem modeli liniowych na logu promieni, aby opracować wstępne szacunki, a następnie zastosowałem optymalizację nieliniową, wypełniając optymalizację wynikami modeli liniowych, aby znaleźć rozwiązania, które zminimalizowały funkcję kary określoną w problem.
Szacunkowa wartość A w powyższym równaniu wynosi siedem cyfr, więc szukałem prostego wyrażenia, aby zapisać kilka bajtów. Szukałem wyrażeń formy
za dwie cyfry x i 1 cyfrę y (w sumie pięć bajtów, oszczędzając dwa bajty lub około pięciu punktów, biorąc pod uwagę karę), która nie była zbyt różna od optymalnej wartości A i nie zawyżała znacznie kary i zakończyła się w górę z (poza tym niewytłumaczalne):
źródło
TI-BASIC (TI-84), 285 bajtów, wynik = 285
Prosty program „indeks w ciągu do listy”. Można dalej grać w golfa.
Wejście jest w
Ans
i jest jednym z nazw obiektów dużymi literami.Wyjście jest włączone
Ans
i jest automatycznie drukowane.Przykład:
Objaśnienie:
(Lista promieni i ciąg nazwy zostały skrócone dla zwięzłości.
...
Służy do wskazania reszty listy / ciągu).Model wizualny:
źródło