Nei videogiochi Pokemon, il giocatore viene inviato nel mondo per forzare gli animali selvatici in minuscole palline e addestrarli a combattere. Naturalmente, tutti sanno che nessuno gioca a Pokemon per la battaglia. Il vero pareggio che la serie ha è che il pokemon si prende da solo! Il tuo compito è simulare il pokeball durante un tentativo di acquisizione. Questa sfida utilizzerà la formula di acquisizione di generazione V, che è la seguente:

HP_maxè uguale all'HP massimo del pokemon di destinazione. HP_currentè uguale agli HP attuali del pokemon di destinazione. rateè il tasso di cattura del pokemon, bonus_ballè il moltiplicatore del pokeball lanciato ed bonus_statusè 2,5 se il pokemon bersaglio è addormentato o congelato, 1,5 se il pokemon bersaglio è paralizzato, avvelenato o bruciato e 1 altrimenti.
Dopo averlo trovato a, devi eseguire fino a tre "shake check". La probabilità di successo di un controllo di vibrazione è 65536 / (255 / a)^(1/4). Se uno di questi controlli fallisce, il Pokemon sfugge alla sua palla. Se tutti e tre i controlli hanno esito positivo, il pokemon viene catturato!
Nota: ogni volta che viene eseguita una divisione, il risultato viene arrotondato per difetto a un multiplo di 1/4096. Questo è generalmente un dettaglio insignificante, ma deve essere preso in considerazione nel tuo programma.
La tua sfida è quella di scrivere un programma che esegue i controlli di scuotimento e stampa per stdout lo stato dei controlli. Su stdin, il tuo programma riceverà (almeno, i dettagli di seguito) gli HP massimi del pokemon, il tasso di cattura del pokemon di destinazione e il nome della pokeball. Il massimo HP e il tasso di cattura sono entrambi garantiti come numeri interi, mentre il nome del pokeball è sempre una stringa. Questo input può arrivare in qualsiasi ordine e con qualsiasi carattere di delimitazione è conveniente per te, purché sia coerente. Supponiamo che l'input sia corretto, non è richiesta la gestione degli errori.
I nomi delle pokeball che devi supportare e i loro moltiplicatori di cattura sono elencati qui:
Poke | 1
Great | 1.5
Ultra | 2
Master | 255
Puoi presumere che il bersaglio sia addormentato e con 1 HP. Il formato previsto per l'output è questo:
(First check failed)
(no output)
(Second check failed)
*shake*
(Third check failed)
*shake*
*shake*
*shake*
(All checks pass)
*shake*
*shake*
*shake*
Click!
(Questo non è un refuso, il tuo programma non dovrebbe mai produrre solo due frullati.)
Questo è code-golf , quindi il tuo punteggio è il conteggio dei byte del codice sorgente del tuo programma. Il punteggio più basso vince.
Bonus!
Ho detto che si può assumere il Pokémon è a 1 HP e addormentato. In alternativa, puoi consentire all'utente di inserire gli HP e il pokemon correnti bonus_status. Gli HP attuali del pokemon saranno sempre un numero intero uguale o inferiore ai suoi HP massimi e bonus_statussaranno sempre 2,5, 1,5 o 1. In tal caso, è necessario disporre di questi valori alla fine dell'input e il valore predefinito è 1 e 2.5 se non vengono forniti. Puoi sottrarre 15 punti dal tuo punteggio per aver implementato uno di questi, o 25 per entrambi.
Inoltre, è possibile implementare acquisizioni critiche. Se si verifica una cattura critica, viene eseguito un solo test di vibrazione. Se fallito, il programma si chiude silenziosamente. Se superato, genera:
*shake*
Click!
Le catture critiche diventano più comuni man mano che il giocatore raccoglie più pokemon, ma per semplicità possiamo supporre che abbiano già "catturato tutti". Se un numero generato casualmente tra 0 e 2047 è inferiore di a(il risultato del primo calcolo) moltiplicato per 2,5, questa è una cattura critica. Il supporto per le acquisizioni critiche ti consente di rimuovere 25 punti dal tuo punteggio.
Ci sono un certo numero di altre pokeball che potresti scegliere di supportare. I loro nomi e moltiplicatori di cattura sono elencati qui:
Safari | 1.5
Sport | 1.5
Lure | 3
Net | 3
Dusk | 3.5
Dive | 3.5
Moon | 4
Fast | 4
Quick | 5
Love | 8
Per ognuna di queste palline per cui aggiungi il supporto, puoi sottrarre (5 + la lunghezza del nome della pallina) dal tuo punteggio.
Infine, per i calci, il raggiungimento di tutti questi bonus (HP attuali e bonus_status da stdin, catture critiche e tutte e 10 le palline opzionali) ti farà guadagnare un ulteriore bonus di 7 punti rimossi dal tuo punteggio, per un bonus totale di 150 .
Esempio di input / output
Solo per essere sicuri che siamo tutti sulla stessa pagina.
$ ./balls <<< "19,Ultra,255"
*shake*
*shake*
*shake*
Click!
Buona fortuna e buon golf!
65536 / (255 / a)^(1/4)è maggiore di 1, il controllo ha esito positivo. Non sono sicuro di cosa intendi con la seconda domanda.
rnd < psignifica che il controllo ha esito positivo con un rndintervallo compreso tra 0 e 1.
65536 / (255 / a)^(1/4), quindi se il numero casuale è minore il test di scuotimento ha avuto successo
65536 / (255 / a)^(1/4)ma il mio istinto dice che è maggiore di 1. Verifichi un numero casuale compreso tra 0 e 65536? Il controllo ha esito positivo se il numero casuale è maggiore o se è inferiore?