W grach wideo Pokemon gracz zostaje wysłany w świat, aby zmusić dzikie zwierzęta do drobnych piłek i wyszkolić je do walki. Oczywiście wszyscy wiedzą, że nikt nie gra w Pokemona podczas bitwy. Prawdziwym losowaniem tej serii jest złapanie pokemona! Twoim zadaniem jest symulacja pokeball podczas próby schwytania. W tym wyzwaniu zostanie wykorzystana formuła przechwytywania generacji V, która wygląda następująco:
HP_max
jest równa maksymalnej wartości HP docelowego pokemona. HP_current
jest równy bieżącemu HP HP docelowego pokemona. rate
to współczynnik połowu pokemona, bonus_ball
to mnożnik rzuconego pokeballa, i bonus_status
wynosi 2,5, jeśli docelowy pokemon śpi lub jest zamrożony, 1,5, jeśli docelowy pokemon jest sparaliżowany, otruty lub spalony, i 1 w innym przypadku.
Po znalezieniu a
masz wykonać do trzech „kontroli wstrząsów”. Prawdopodobieństwo powodzenia testu wstrząsania jest następujące 65536 / (255 / a)^(1/4)
. Jeśli którykolwiek z tych testów nie powiedzie się, pokemon ucieka swoją piłką. Jeśli wszystkie trzy testy zakończą się powodzeniem, pokemon zostanie złapany!
Uwaga: Ilekroć wykonywany jest jakikolwiek podział, wynik jest zaokrąglany w dół do wielokrotności 1/4096. Jest to na ogół nieznaczący szczegół, ale należy to uwzględnić w programie.
Wyzwanie polega na napisaniu programu, który wykona testy wstrząsów i wydrukuje je w celu sprawdzenia statusu kontroli. Na standardowym poziomie twój program otrzyma (przynajmniej szczegóły poniżej) maksymalne HP pokemona, współczynnik połowu docelowego pokemona i nazwę pokeball. Maksymalne HP i wskaźnik połowu są gwarantowane jako liczby całkowite, a nazwa pokeball jest zawsze ciągiem znaków. Dane wejściowe mogą występować w dowolnej kolejności, a dowolne znaki ograniczające są dla Ciebie wygodne, o ile są spójne. Załóżmy, że dane wejściowe są prawidłowe, nie jest wymagana obsługa błędów.
Nazwy pokeballi, które musisz wspierać, oraz ich mnożniki połowu są wymienione tutaj:
Poke | 1
Great | 1.5
Ultra | 2
Master | 255
Możesz założyć, że cel śpi i ma 1 HP. Oczekiwany format danych wyjściowych jest następujący:
(First check failed)
(no output)
(Second check failed)
*shake*
(Third check failed)
*shake*
*shake*
*shake*
(All checks pass)
*shake*
*shake*
*shake*
Click!
(To nie jest literówka, twój program nigdy nie powinien generować tylko dwóch wstrząsów.)
To jest golf golfowy , więc twój wynik jest liczbą bajtów kodu źródłowego twojego programu. Najniższy wynik wygrywa.
Bonusy!
Powiedziałem, że może zakładać pokemon jest w 1 HP i śpi. Alternatywnie możesz zezwolić użytkownikowi na wprowadzenie aktualnego HP pokemona i bonus_status
. Bieżące HP pokemona będzie zawsze liczbą całkowitą równą lub mniejszą niż jego maksymalne HP i bonus_status
zawsze będzie wynosić 2,5, 1,5 lub 1. Jeśli tak, musisz mieć te wartości na końcu danych wejściowych, a domyślnie 1 i 2.5, jeśli nie są dostarczone. Możesz odjąć 15 punktów od swojego wyniku za wdrożenie jednego z nich lub 25 punktów za oba.
Dodatkowo możesz zaimplementować przechwytywanie krytyczne. Jeśli nastąpi przechwycenie krytyczne, wykonywany jest tylko jeden test wstrząsania. Jeśli się nie powiedzie, program zostanie zamknięty. Jeśli zostanie przekazany, wyprowadza:
*shake*
Click!
Krytyczne przechwytywania stają się bardziej powszechne, gdy gracz zbiera więcej pokemonów, ale dla uproszczenia możemy założyć, że już ich „złapali”. Jeśli losowo wygenerowana liczba z przedziału od 0 do 2047 jest mniejsza niż a
(wynik pierwszego obliczenia) pomnożona przez 2,5, jest to krytyczne przejęcie. Obsługa przechwytywania krytycznego pozwala usunąć 25 punktów z twojego wyniku.
Istnieje wiele innych pokeballi, które możesz wspierać. Ich nazwy i mnożniki połowów są wymienione tutaj:
Safari | 1.5
Sport | 1.5
Lure | 3
Net | 3
Dusk | 3.5
Dive | 3.5
Moon | 4
Fast | 4
Quick | 5
Love | 8
Dla każdej z tych kul, do których dodajesz wsparcie, możesz odjąć (5 + długość nazwy piłki) od swojego wyniku.
Wreszcie, za kopnięcia, osiągnięcie wszystkich tych bonusów (bieżące HP i bonus_status od standardowego, krytycznych przechwytów i wszystkie 10 opcjonalnych piłek) przyniesie ci dodatkową nagrodę w wysokości 7 punktów usuniętych z twojego wyniku, co daje nawet 150 premii ogółem.
Przykład wejścia / wyjścia
Aby upewnić się, że wszyscy jesteśmy na tej samej stronie.
$ ./balls <<< "19,Ultra,255"
*shake*
*shake*
*shake*
Click!
Powodzenia i udanej gry w golfa!
65536 / (255 / a)^(1/4)
ale moje odwagi mówią, że jest ono większe niż 1. Czy porównujesz z liczbą losową z zakresu od 0 do 65536? Czy sprawdzenie się powiedzie, jeśli liczba losowa jest większa lub niższa?65536 / (255 / a)^(1/4)
jest większa niż 1, sprawdzanie automatycznie się powiedzie. Nie jestem pewien, co masz na myśli przez drugie pytanie.rnd < p
pomocą czek jest udana zernd
w przedziale od 0 do 1.65536 / (255 / a)^(1/4)
, a jeśli liczba losowa jest mniejsza, test wstrząsania powiódł sięOdpowiedzi:
J 301-150 = 151
W przypadku sportu wszystkie bonusy zostały wdrożone, choć pewnie lepiej bym tego nie robił :). Wyjaśniłem krótko rzeczy poniżej, ale ten jest zbyt długi, aby go szczegółowo wyjaśnić, chyba że ktoś wyraźnie tego zażąda. Implementuje wszystkie piłki, przechwyty krytyczne i opcjonalne dane wejściowe.
Oto wersja golfowa
źródło
PYTHON 249 bajtów - 75 dla bonusów = 174
Moja pierwsza gra w golfa.
Bonus za włączenie wybranych piłek: Safari, Sport, Lure, Net, Dusk, Dive, Fast, Quick
Daje mi 8 * 5 + 6 + 5 + 4 + 3 + 4 + 4 + 4 + 5 = 75 punktów bonusowych
[edytuj] Zaokrąglaj w dół do 12 bitów ułamkowych za każdym razem, gdy używany jest podział, nie używając go
[edit2] zoptymalizuj słownik pokeball
źródło
Note: Whenever any division is performed, the result is rounded down to a multiple of 1/4096.
)r < 65536/(255/a)^(0.25) <=> r*255^(0.25)/a^(0.25) < 65536 <=> r*255^(0.25) < 65536*a^(0.25)
wykluczyć wszystkie podziały?floor(x*4096)*4096
samo, jak zaokrąglanie w dół do np. miejsc po przecinku.Perl 1 (374-150 = 224 + brak brakujących bajtów)
Lista argumentów:
Tak, wiem, że to całkowicie łamie zasady, ale mnie to nie obchodzi. Jeśli nie zauważyłeś, jest to pierwszy algorytm przechwytywania Pokémon ze wszystkimi jego dziwactwami (Great Balls są lepsze niż Ultra Balls, pod pewnymi warunkami). To implementuje wszystkie funkcje, w tym te, które nie zostały uwzględnione (i tak postanowiłem uwzględnić dla nich punkty). Krytyczne przechwytywania są ignorowane (ale są implementowane - po prostu nie wpływają na szybkość przechwytywania), nowsze Poké Balls ładują dane innych Poké Balls.
Pamiętaj, że choć ta odpowiedź jest krótka, łamie wszystkie zasady, więc uważaj ją za zabawną odpowiedź, nie akceptuj jej. Początkowo zamierzałem zaimplementować algorytm Gen5 w Perlu 5, ale zdecydowałem - dlaczego nie zabawić się. I tak, skompilowałem Perl 1 i ten kod działa. Jeśli uruchomisz go w nowszej wersji Perla, możesz otrzymać ostrzeżenia o przestarzałym używaniu
do
, ale bądźmy szczerzy - to jedyny sposób na uruchomienie funkcji w Perlu 1. Perl 1 również ma pewne dziwactwa (na przykład nie mogę przenieś linię zaczynając od/M/
poprzedniej linii - dlaczego? - nie wiem).Poza tym w Perlu 1 nie ma losowych liczb, więc mam nadzieję, że mnie nie zabijesz za modulo
$$
. To najbliższa losowa liczba, którą mogłem znaleźć.Edycja: Wygląda na to, że starsza
do call()
składnia została usunięta w Perlu 5.19.8. Upewnij się, że używasz starszej wersji Perla do uruchomienia tego skryptu, ponieważ wygląda na to, że Perl 5.20 nie będzie kompatybilny ze skryptami Perla 1.źródło
PHP (
746763 bajty - wszystkie bonusy):Aby tego użyć, musisz podać dane wejściowe jako „ball = poke & status = sleep” na STDIN.
HP należy podać jako „hp [max]” lub „hp [current]”.
Ten kod działa zgodnie z testem tutaj .
Możesz podać status według jego nazwy lub mnożnika. ( niewymagane w pytaniu ).
Oto czytelna wersja:
Musiałem to edytować, ponieważ korzystałem ze znacznie większej precyzji niż wymagana.
Poprawka została dostarczona przez TheConstructor .
źródło
Whenever any division is performed, the result is rounded down to a multiple of 1/4096.
)floor(x*4096)/4096
lub wdrożyć podział punktu stałego, tak jak ja.Java, 611
Wynik:
=> 611
Program wykorzystuje arytmetykę punktów stałych z 12 bitami ułamkowymi (
1/4096
jest to wartość najbardziej prawego bitu). Ponieważ Java zwykle nie używa stałego punktu, wewnątrz kodu występują pewne zmiany, aby osiągnąć oczekiwane wyniki. Zobacz długą wersję używanych funkcji arytmetycznych, które zostały wprowadzone do gry w golfa.Podczas gdy większość obliczeń można było wykonać na
int
wartościach, działy działają lepiej zlong
s, ponieważ musisz przesunąć dywidendę o kolejne 12 bitów w lewo, aby zachować pożądaną precyzję (w przeciwnym razie stracisz wszystkie bity ułamkowe).Przykładowe dane wejściowe (
;
wymagane tylko, jeśli są uruchamiane interaktywnie, tj. STDIN nie otrzymał EOF): Ball, catch_rate, max_hpPrzykładowe dane wyjściowe:
Przykładowe dane wejściowe: Ball, catch_rate, max_hp, current_hp, bonus_state
Przykładowe dane wyjściowe:
źródło
CoffeeScript -
317313310307306294270250242 bajtów342 - 25 (parametry) - 75 (12 piłek) = 242
Oczekuje wkładu
HP_max,Rate,Ball[,HP_current[,status]]
. Nie obsługujeMoon
aniLove
piłek.To pierwsza rzecz, jaką kiedykolwiek grałem w golfa, która nie jest wyrażeniem regularnym, więc prawdopodobnie jest miejsce na ulepszenia. Bezwstydnie skopiowałem pomysł przechowywania tylko częściowych nazw piłek. ;) Wspieranie pozostałych dwóch piłek po prostu nie jest tego warte, nawet przy dodatkowym +7 za uzyskanie wszystkich bonusów.
Wersja bez golfa
Ta wersja pomija wszystkie krótkie aliasy, które zdefiniowałem na początku, ale osobno definiuje wyszukiwanie piłki.
Uwaga na temat wzoru prawdopodobieństwa: Zmieniłem pełną formułę (z wypisanym
a
), aby nie było podziałów, i obliczam(...)^(1/4)
, biorąc dwukrotnie pierwiastek kwadratowy.źródło
p-=p%1/4096
naprawdę działa. (Zgadłbym, że musiałbyś przynajmniej napisać,p-=p%(1/4096)
a mimo to nie byłbym pewien, czy moduł zostanie zaimplementowany dla ułamków po obu stronach. Fajnie!%
można je wykorzystać do zabawnych rzeczy w JS. Po ponownym przeczytaniu pytania myślę, że ta odpowiedź nie do końca spełnia wymagania dotyczące zaokrąglania. Myślę, że zaokrąglanie powinno być stosowane po każdym podziale. Być może będę musiał trochę zrestrukturyzować swoje obliczenia. ^^p%(1/4096)
. Sprawdziłem to nawet przed opublikowaniem, ale jakoś źle zapamiętałem wynik mojego testu.Aktualizacja: (C #)
Liczba bajtów: 3600
Kryt.: -25
Wszystkie poke-kule: -91
Razem = 3484
[grał w golfa]
[regularny]
źródło