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_maxjest równa maksymalnej wartości HP docelowego pokemona. HP_currentjest równy bieżącemu HP HP docelowego pokemona. rateto współczynnik połowu pokemona, bonus_ballto mnożnik rzuconego pokeballa, i bonus_statuswynosi 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 amasz 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_statuszawsze 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)jest większa niż 1, sprawdzanie automatycznie się powiedzie. Nie jestem pewien, co masz na myśli przez drugie pytanie.
rnd < ppomocą czek jest udana ze rndw przedziale od 0 do 1.
65536 / (255 / a)^(1/4), a jeśli liczba losowa jest mniejsza, test wstrząsania powiódł się
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?