Korzystając z poniższej tabeli ( źródła ) napisz kod, który bierze nazwy dwóch planet i zwraca odległość między nimi:
+-------------------+---------------+
| Planets | Distance (km) |
+-------------------+---------------+
| Mercury -> Venus | 50290000 |
| Venus -> Earth | 41400000 |
| Earth -> Mars | 78340000 |
| Mars -> Jupiter | 550390000 |
| Jupiter -> Saturn | 646270000 |
| Saturn -> Uranus | 1448950000 |
| Uranus -> Neptune | 1627450000 |
| Neptune -> Pluto | 1405380000 |
+-------------------+---------------+
Przykłady, dane wejściowe, a następnie dane wyjściowe:
Mercury, Mars
170030000
Neptune, Jupiter
-3722670000
Earth, Earth
0
Zwróć uwagę na znak ujemny, gdy Jowisz pojawia się przed Neptunem. Wszystkie są również liczbami całkowitymi.
Nie trzeba uwzględniać Plutona (głównie z powodu dziwnej orbity, która utrudnia określenie odległości - podana odległość jest moim własnym obliczeniem, ale ponieważ Pluton jest teraz sławny ...).
Przez odległości między planetami rozumiem orbity - nie spodziewam się daty i nie wiem, gdzie one są.
To jest kod golfowy, wygrywa najkrótszy kod.
Mercury, Mars -> 170030000.0
?Odpowiedzi:
CJam,
545144 bajtówWypróbuj online w interpretatorze CJam .
Pomysł
Używamy prostej funkcji mieszającej, aby zidentyfikować wszystkie osiem planet. Rozpatrując każdą nazwę jako tablicę jej punktów kodowych, konwertuje je z bazy 26 na liczbę całkowitą i biorąc wynik modulo 93, a następnie modulo 8, Merkury , Wenus , Ziemia itp. Odwzoruj na 2 , 4 , 0 , 1 , 3 , 5 , 6 i 7 .
Teraz wybieramy punkt leżący 320 000 km za Neptunem i obliczamy odległości wszystkich ośmiu planet do tego punktu. Po usunięciu czterech tylnych zer i zmianie kolejności planet tak, aby pasowały do 8 indeksów z góry, otrzymujemy tablicę
co, jeśli zakodujemy każdą liczbę całkowitą w podstawie 70, daje następujące wyniki:
Pamiętając, że dwie sąsiednie cyfry
(A B)
można zastąpić((A-1) (B+70))
, możemy zmodyfikować tablicę od góry, aby wszystkie liczby całkowite mogły być zakodowane jako drukowalne znaki ASCII:Kod
źródło
Python 2,
149147142138128123119 bajtówWystarczy użyć prostego wyszukiwania, aby dowiedzieć się, z których odległości korzystać :) To definiuje anonimową funkcję, więc aby z niej skorzystać, musisz nadać jej nazwę.
Dzięki Sp3000 za pomysły, które pozwoliły zaoszczędzić sporo bajtów!
Wcięte prawidłowo i nieznacznie odznaczone dla czytelności:
Zadzwoń tak:
źródło
Prolog,
190174151 bajtówDzięki Fatalize za wskazówki.
źródło
s(A, B, R)
zamiast pisaniaR
? Nic nie jest określone dla wyjść, więc zwrot predykatu powinien być w porządku.g
dog(A,X):-sub_atom(A,2,2,_,B),member(B:X,[rc:0,nu:5029,rt:9169,rs:17003,pi:72042,tu:136669,an:281564,pt:444309]).
i wyprowadzenie wszystkich faktów na planetach. To mniej fajne niż,=..
ale krócej uzyskać mapowanie klucz-wartośćJavaScript (ES6),
115110 bajtówJest to funkcja anonimowa, więc musisz ją zapisać w zmiennej (
f=...; f("Earth", "Mercury")
) lub użyć jako wyrażenia w nawiasach ((...)("Earth", "Mercury")
.Ten nieuporządkowany ciąg to dwie pierwsze litery każdej planety, a następnie odległość tej planety od Merkurego (podzielona przez 10000, aby zaoszczędzić miejsce). Funkcja wewnętrzna
g
wykonuje następujące czynności:k
),k[0]+k[1]
),Ea(\d*)
),1e4
) i zwraca wynik.Odejmując jedną odległość Merkurego od drugiej, otrzymujemy odległość między planetami.
źródło
btoa
mają punkty kodowe poniżej 256, więc ISO 8859-1 koduje każdy znak za pomocą jednego bajtu.Java,
274272264 bajtów (obejmuje Pluto!)Wejście wyjście:
Odstępy i zakładki:
źródło
int
iint[]
deklaracje w jednym wierszu, jeśli tablica jest ostatnia: Likeint i=0,j=1,k[]={};
10000
je1e4
.e > w
że można przyciąć postać za pomocą operatora idzie do:while(e-->w)
12 znaków zamiastfor(;e--!=w;)
13.Python, 118 bajtów
n
to funkcja zwracająca odległość od Merkurego.Łańcuch
"VeEaMaJuSaUrNe"
to pierwsze dwa znaki ze wszystkich nazw planet z wyjątkiem Merkurego .find
nie może znaleźć Merkurego, więc zwróci -1. -1/2 wciąż wynosi -1, więc jest to ostatni element w krotce, który wynosi 0.Prosty kod testowy:
źródło
APL,
979585 bajtówTworzy to nienazwaną funkcję dyadyczną, która przyjmuje planetę początkową jako lewy argument, a planetę docelową jako prawą.
Możesz spróbować online !
źródło
J-- , 226 bajtów
Nie sądzę, żeby to się liczyło, ponieważ tworzyłem język, gdy pytanie nie było dostępne, ale był to głównie test tego, jak mały byłbym w stanie skompresować kod Java. Jest to całkowicie i całkowicie oparte na odpowiedzi DeadChex .
Oto jak go użyć:
źródło
Pyth -
5953 bajtówKoduje odległość w punktach kodowych Unicode.
Wyszukiwanie nazw jest całkiem fajne, ponieważ się zapętla. Dzięki @Dennis za zasugerowanie indeksu 14 jako wyszukiwania bezkolizyjnego!
Wypróbuj tutaj online .
źródło
Bash, 140 bajtów
źródło
CoffeeScript,
183180 bajtówUnminified:
źródło
Rubin, 168 bajtów
Został zaprojektowany jako skrypt uruchamiany z wiersza poleceń, dlatego używa
ARGV
. Uruchom jakoźródło
Haskell,
160158157 bajtówPrzykład użycia:
Jak to działa: definiuję nowy typ danych, w
P
którym nazwy konstruktorów są nazwami planet. Umieszczam go również wEnum
klasie, tzn. Otrzymuję mapowanie na liczby całkowite za pośrednictwemfromEnum
(w kolejności definicji, zaczynając odMercury
->0
). Tę liczbę całkowitą można wykorzystać jako indeks listy odległości.Edycja: @Kritzefitz znalazł dwa bajty do zapisania, a @Alchymist kolejny. Dzięki!
źródło
fromEnum x
i zapisać dwa bajty.Julia,
206203190 bajtówTworzy to nienazwaną funkcję, która akceptuje dwa ciągi znaków i zwraca liczbę całkowitą. Aby to nazwać, nadaj mu nazwę.
Niegolfowane + wyjaśnienie:
źródło
Jawa,
257228 bajtówstatic long d(String...s){...}
rozwiązuje wyzwanie. Wejście wymaga, aby nazwy planet dokładnie pasowały do nazw stałych enum. Uwielbiam sposób, w jaki Java zapewnia mi metodę konwersji ciągu na wyliczanie <3Stosowanie:
Z.d("Mercury","Pluto")
zwraca5848470000
Z.d("Pluto","Mercury")
zwraca-5848470000
Z.d("Uranus","Neptune")
zwraca1627450000
Z.d("Mars","Pluto")
zwraca5678440000
źródło
Makro pre-procesora C (gcc) , 146 bajtów
Wypróbuj online!
źródło