Kilka lat temu Hot Wheels stworzyło prostą grę flash o nazwie „Formula Fuelers Racers” *. Aby zagrać w tę grę, wybierasz trzy składniki z lodówki i wkładasz je do samochodu, który następnie ściga się z losowo generowanym samochodem komputera. Okazuje się, że mechanika tej gry jest dość prosta. Po pierwsze, faktyczny „czas” wyścigu twojego samochodu jest generowany losowo i nie ma wpływu na to, czy wygrasz wyścig. Po drugie, zwycięzca wyścigu jest określany na podstawie wyniku obliczonego na podstawie wybranych składników (dozwolone są duplikaty składników i kolejność ma znaczenie). Każdy składnik ma powiązaną „wartość” i powiązaną „operację”, jak pokazano w poniższej tabeli:
# ingredient val op
1 Hot Salsa 2 +
2 Root Beer 1 +
3 Milk 1 +
4 Pickle Juice 2 +
5 Mystery Lunch -3 *
6 BBQ Sauce 2 +
7 Egg 1 +
8 Ketchup 2 +
9 Mustard -1 *
10 Melon 1 +
11 Chocolate Milk 1 +
12 Mayonnaise -2 *
13 Baby Food 0 +
14 Pepper 1 +
15 Salt 2 +
16 Syrup -1 *
17 Salad Dressing 2 +
18 Orange Juice 1 +
19 Soy Sauce 2 +
Dla wygody to wyzwanie będzie dotyczyło składników według ich liczby, a nie nazwy. Oto kroki, aby obliczyć wynik:
- Najpierw zainicjuj wynik wartością pierwszego składnika.
- Następnie użyj operacji drugiego składnika, aby połączyć aktualny wynik z wartością drugiego składnika, aby uzyskać zaktualizowany wynik.
- Na koniec użyj operacji trzeciego składnika, aby połączyć aktualny wynik z wartością trzeciego składnika, aby uzyskać wynik końcowy.
Wyższe wyniki są lepsze i zawsze pokonują niższe wyniki.
Na przykład składniki 1 2 3
mają wynik (2+1)+1 = 4
. Składniki 7 5 6
mają wynik (1*-3)+2 = -1
. Dlatego 1 2 3
bije 7 5 6
.
Wyzwanie
W tym wyzwaniu napiszesz program, który pobierze uporządkowaną listę 3 liczb całkowitych i wyświetli odpowiedni wynik.
Wkład
Twój program może zaakceptować listę trzech liczb całkowitych w najwygodniejszym formacie. Możesz używać indeksowania 1 dla nazw składników (jak wyżej) lub indeksowania 0 (odejmij 1 od każdego indeksu powyżej).
Ouput
Twój program musi wypisać jedną liczbę całkowitą wskazującą wynik.
Przypadki testowe
4 5 5 => 18 // max score
5 5 5 => -27 // min score
13 13 13 => 0
1 2 3 => 4
7 5 6 => -1
16 2 19 => 2
19 7 12 => -6
* Ta strona jest dość przestarzała i nie działa w niektórych przeglądarkach, ale nie musisz grać w tę grę.
źródło
Odpowiedzi:
Galaretka , 24 bajty
Pobiera listę składników o indeksie 0.
Wypróbuj online! lub zobacz zestaw testowy
W jaki sposób?
Używa nieco zawiłej formy kompresji wartości jako liczby podstawowej 6 oraz faktu, że wpisy multiplikatywne są wartościami ujemnymi. Zamiast po prostu przesuwać w górę o 3, aby uzyskać cyfrę podstawową 6, stosuje się uzupełnione wartości przyrostowe - pozwala to zaoszczędzić bajty, umożliwiając
Ị
atomowi wykrycie ujemnych wpisów przed krokiem uzupełniania, jednocześnie oszczędzając bajt w bazie-250 kompresja.źródło
zẈ€$ụ¤
one odczytywane jako ich (1-indeksowane) indeksy na stronie kodowej Jelly, które są[123,188,13,37,226,4]
interpretowane jako liczba podstawowa 250:123*250**5+188*250**4+13*250**3+37*250**2+226*250**1+4*250**0=120851767994004
(patrz część literaturowa ciągu samouczka .)JavaScript (ES6),
8984827873 bajtówPobiera dane wejściowe jako tablicę 3 liczb całkowitych, wykorzystując indeksowanie 0.
Przypadki testowe
Pokaż fragment kodu
Poprzednia wersja, 78 bajtów
Pobiera 3 liczby całkowite w składni curry
(a)(b)(c)
, stosując indeksowanie 0.Jak to działa
Nieco niezwykłą rzeczą w tym kodzie jest to, że wymaga tylko 2 argumentów w „wspólnej” składni curry
a => b =>
i ostatecznie zwraca funkcję, która przyjmuje trzecią.Awaria
Przypadki testowe
Pokaż fragment kodu
źródło
Befunge,
7473 bajtówWypróbuj tutaj! To dziwne, że mój kod działa tylko na tym jednym tłumaczu.
Drugi wiersz zawiera w zasadzie wszystkie wartości z tabeli. Wartości nienumeryczne są w rzeczywistości wartościami ujemnymi, ponieważ występują przed cyframi w tabeli ASCII. Jest trochę logiki, która określa, czy liczba jest ujemna, czy nie, a jeśli tak, to liczba ta jest mnożona przez wynik.
Prawa strona trzeciego rzędu inicjuje pierwszą liczbę. Gdybym nie musiał tego robić, mógłbym zaoszczędzić wiele bajtów.
źródło
PHP, 128 bajtów
PHP, 138 bajtów
Wersja online
Rozszerzony
źródło
Python 2 ,
123110107 bajtówWypróbuj online!
-3 bajty dzięki @mathjunkie
źródło
5445054524413452545
następnie odejmij 3, aby zaoszczędzić tony bajtów.n=[n+i,n*i][i<0]
wewnątrz pętli oszczędzasz 3 bajty05AB1E , 29 bajtów
Wypróbuj online!
To faktycznie działa na tyle lub tak mało danych, ile chcesz, więc możesz mieć samochody z 4 lub więcej cechami lub samochody z zaledwie 2. To nie było zamierzone, po prostu jak to się skończyło.
źródło
CJam ,
4338 bajtówMoże istnieć sposób na dalsze kompresowanie listy ...
Wykorzystuje indeksowanie 0.
Wypróbuj online!
Wyjaśnienie
Ten program korzysta z faktu, że wartość jest multiplikatywna zamiast addytywna wtedy i tylko wtedy, gdy jest ujemna.
źródło
+ *
sztuczka!Lua,
140131 bajtówźródło
JavaScript,
8572 bajtówPobiera dane wejściowe w formacie
[a,b,c]
-13 bajtów dzięki produktom ETH
źródło
x=>(b="...",b<0?"*":"+")+b
aby tego uniknąćreturn
. (Poza tym[... ]
indeksowanie nie działa na łańcuchy)a=a=>eval(a.map(x=>(b="5445054524413452545"[x]-3,b<0?"*":"+")+b)).join``)
działa dla Ciebie?)
po+b
, jak sądzęR,
125123 bajtówAnonimowa funkcja, która przyjmuje trzy liczby całkowite jako dane wejściowe. Definiuje listę wartości i operacji, a następnie po prostu ocenia te wywołane przez dane wejściowe, tj
o3(o2(v1,v2),v3)
. Jest prawie na pewno bardziej golfowy sposób!Aktualizacja: po ponownej obróbce mam alternatywę, również 123 bajty . Ponownie anonimowa funkcja, ale przyjmuje dane wejściowe jako pojedynczy wektor trzech wartości. Stosuje to samo podejście, definiując listę wartości i operacji i oceniając ją.
źródło
Haskell,
186116112108 bajtówGłówną funkcją jest
k
. Nowość w Code Golf, więc jestem pewien, że jest kilka bajtów, które mógłbym się ogolić dzięki sprytnemu użyciu$
operatora i nawiasów. Prawdopodobnie zaktualizuję odpowiedź, gdy będę nadal znajdować ulepszenia.Zasadniczo program można podzielić w następujący sposób:
*
tam, gdzie zawsze są wartości dodatnie+
)v
odwzorowanych na wejściowe liczby całkowite i pobiera z nich odpowiednie operacje i wartości oraz zwraca właściwe dane wyjściowe.AKTUALIZACJA
Specjalne podziękowania za wskazanie sztuczki fromEnum! To działało ładnie. Brakowało mi również części zasad, która mówi, że akceptowalnym rozwiązaniem może być funkcja, która pobiera listę liczb całkowitych. To pozwoliło zaoszczędzić ogromną ilość pracy.
AKTUALIZACJA 2
Zgodnie z innymi sugestiami, ogoliłem garść bajtów, zmieniając kolejność operacji, tworząc inny element zabezpieczający, który zawsze ocenia wartość Prawda, i dopasowujący wzorzec dla W, który wzorzec pasuje do Listy 3 elementów. Dzięki za sugestie!
AKTUALIZACJA 3
Kolejne podziękowania dla Laikoni za wskazanie większej liczby zasad gry w golfa, o których nie wiedziałem. Również mapowanie v do moich danych wejściowych w celu utworzenia listy częściowo zastosowanych funkcji było fenomenalnym pomysłem i pozwoliło mi zaoszczędzić 4 dodatkowe bajty!
źródło
[Int] -> Int
zamiast czytać ze standardowego wejścia i zapisywać na standardowe wyjście. Jest to domyślnie dozwolone, ale w tym przypadku jest nawet wyraźnie wspomniane w wyzwaniu, że wpisanie listy liczb całkowitych jako danych wejściowych jest dopuszczalne.fromEnum
zamiastdigitToInt
jest prawdopodobnie krótsze, ponieważ pozwala upuścić import.v=(map((-51+).fromEnum)"95 ... 5"!!)
zapisuje dwa nawiasy.o x|x<0=(*)|0<1=(+)
zapisuje jeden bajt w drugim strażniku.w
pozostało dodatkowe miejsce. Ponadto, ponieważ musisz obsługiwać tylko listy o długości 3, możesz użyćw[x,y,z]=
jako dopasowania wzorca.Haskell,
9287 bajtówWypróbuj online!
Opierając się na odpowiedzi @ maple_shaft, po prostu trochę to rozłożyłem.
Dzięki @Laikoni za 5 bajtów!
źródło
f=
ponieważ anonimowe funkcje są dozwolone jako przesyłanie. Są one wymagane tylko, aby przykład tio działał.C
171161 bajtówźródło
Kod maszynowy 8086, 62 bajty
Ostatnie trzy bajty zawierają dane wejściowe (indeksowane od zera). Hej, powiedziałeś mi, że mogę użyć najwygodniejszego formatu wejściowego. W tym przypadku to jest na stałe!
Dane wyjściowe to kod błędu zwracany do powłoki.
Jak to działa:
źródło