Pokeball Simulator


26

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:

a = (((3 * HP_max - 2 * HP_current) * rate * bonus_ball) / 3 * HP_max) * bonus_status

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 è , 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!


Al momento non riesco a giudicare l'entità della probabilità che dai, 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?
TheConstructor

Se 65536 / (255 / a)^(1/4)è maggiore di 1, il controllo ha esito positivo. Non sono sicuro di cosa intendi con la seconda domanda.
undergroundmonorail

Quindi rnd < psignifica che il controllo ha esito positivo con un rndintervallo compreso tra 0 e 1.
TheConstructor

1
@IsmaelMiguel vedi i miei commenti: generi un numero casuale nell'intervallo da 0 a 1 e lo confronti con 65536 / (255 / a)^(1/4), quindi se il numero casuale è minore il test di scuotimento ha avuto successo
TheConstructor

1
Come indicato nel testo, il tipo testuale di pokeball, CV massimo e tasso di cattura sono passati come input al programma. Se lo desideri, puoi richiedere l'attuale HP (valore predefinito 1) o il bonus stato (valore predefinito 2.5)
TheConstructor

Risposte:


3

J 301-150 = 151

Per gli sport, tutti i bonus implementati, anche se probabilmente starei meglio a non :). Di seguito ho spiegato brevemente le cose, ma questa è troppo lunga per essere spiegata in dettaglio, a meno che qualcuno non lo richieda esplicitamente. Implementa tutte le sfere, acquisizioni critiche e input opzionali.

tm =: =*./@:+.' '=] NB. Template match, match non-blanks in right with left
balls  =: 'MMLLPGSUNDFQ',.12{.'oauo' NB. space = wildcard.
NB. lookup function: name -> bonus_ball
lookup =: 4 255 3 8 1 1.5 1.5 2 3 3.5 4 5 #~ (tm"1&balls)@(2&{.) 

NB. convert given option
options =: ;".`lookup@.(_=_&".);._2 ,&',' i3 NB. parse options to numeric values
NB. add defaults if necessary
complete =: (, 1 2.5{.~(5-$)) options         
NB. formula
r=: <.&.(*&4096)                              NB. round to 1/4096
NB. a=: ((3*zeroth - 2*thirth)*first*second*fourth)/(3*zeroth)
a=:r(1-3%~2*%/3 0{complete)**/1 2 4{complete  NB. A prime, already divided by 255

NB. Critical captures
crit =: >2r5*[:?11^~2: NB. check for critical, k a
mess =: 2 7$'*shake*Click! '"_ NB. Message template
check =: >"0 [:?(4$2^16)"_     NB. Perform 4 checks
mes2 =: mess#~3(<.,<)]          NB. Construct message from number of passed checks
NB. If critical, just output the message array, else do the 4 tests, and execute mes2 on their running and (meaning count the number of uninterrupted trues)
echo mes2@(+/)@(*./\)@(check"0)@(65536%4%:[:r 255%])`mess@.crit a

Qui la versione golfizzata

NB. Golfed verion
echo(m#~3(<.,<)])@(+/)@(*./\)@(>"0[:?(4$2^16)"_)@(65536%4%:[:r 255%])`(m=:2 7$'*shake*Click! '"_)@.(>2r5*[:?11^~2:)(r=:<.&.(*&4096))(1-3%~2*%/3 0{co)**/1 2 4{co=:(,1 2.5{.~(5-$));(".`(4 255 3 8 1 1.5 1.5 2 3 3.5 4 5 #~((=*./@:+.' '=])"1)&('MMLLPGSUNDFQ',.12{.'oauo')@(2&{.)))@.(_=_&".);._2,&','stdin''

6

PYTHON 249 byte - 75 per i bonus = 174

Il mio primo tentativo di giocare a golf.

import sys,random
y=sys.argv
d,b,f={10:1,1:1.5,15:2,7:1.5,13:255,-2:3.5,6:3,8:3,0:4,11:5},3*int(y[1]),"*shake*\n"
s=lambda:random.random()*(255*b)**.25<65536*((b-2)*int(y[3])*d[ord(y[2][0])-70]*2.5)**.25
if s():print f*3+"Click!" if s()and s()else f

Bonus per l'inclusione di palline selezionate: Safari, Sport, Esca, Rete, Crepuscolo, Immersione, Veloce, Veloce

Dandomi 8 * 5 + 6 + 5 + 4 + 3 + 4 + 4 + 4 + 5 = 75 punti bonus

[modifica] Arrotondare per difetto a 12 bit frazionari ogni volta che viene utilizzata la divisione non utilizzandola

[edit2] ottimizza il dizionario di pokeball


Penso che tu stia usando una precisione superiore a 1/4096 (stati delle domande Note: Whenever any division is performed, the result is rounded down to a multiple of 1/4096.)
TheConstructor

Probabilmente hai ragione, non ho capito bene quella parte e le altre risposte sembravano fare allo stesso modo. Immagino di dover fare qualcosa del genere: r < 65536/(255/a)^(0.25) <=> r*255^(0.25)/a^(0.25) < 65536 <=> r*255^(0.25) < 65536*a^(0.25)escludere tutte le divisioni?
Þorsteinn

1/4096 significa 12 bit frazionari. Dai un'occhiata alla mia soluzione; un approccio più diretto sarebbe floor(x*4096)*4096proprio come arrotondare ad esempio alle cifre decimali.
TheConstructor

Ohh capisco, grazie. Ciò dovrebbe probabilmente valere anche per la moltiplicazione come sembra che tu l'abbia fatto, ma dal momento che ciò non è indicato nelle regole non me ne preoccuperò. :)
teinorsteinn

Sì, probabilmente usano l'aritmetica a punto fisso. Ma OP ha solo chiesto di arrotondare la divisione.
TheConstructor

6

Perl 1 (374-150 = 224 + Numero di byte mancanti)

sub h{print "*shake*
";}($x,$h,$_,$c,$s)=split(/,/,<>);$G=$$%(/P/?256:/U/?151:201);$S=$G-($s==1?0:$s==1.5?12:25);
$F=255&int(int($h*255/(/G|S/?8:12))/(int($x/4)||1));sub c{for($i=0;$i<3;$i++){do h();}print "Click!
";exit;}
/M/||$S<0||$S<$c&&$F>$$*$$%255&&do c();$W=int(int($c*100/(/P/?255:/U/?150:200))*$F/255)+($s==1?0:$s==1.5?5:10);$W>9&&do h();$W>29&&do h();$W>69&&do h();

Elenco degli argomenti:

current hp, max hp, pokéball, catch rate, status, critical capture

Sì, sono consapevole che questo infrange completamente le regole, ma non mi interessa. Nel caso non l'avessi notato, questo è il primo algoritmo di acquisizione della generazione di Pokémon, con tutte le sue peculiarità (le Great Balls sono migliori delle Ultra Ball, in determinate condizioni). Questo implementa tutte le funzionalità, comprese quelle che non sono incluse (e ho deciso di includere comunque dei punti). Le acquisizioni critiche vengono ignorate (ma sono implementate - solo per non influenzare la velocità di acquisizione), le nuove Poké Ball caricano i dati di altre Poké Ball.

Tieni presente che, sebbene questa risposta sia breve, infrange tutte le regole, quindi considera solo una risposta divertente, non accettarla. Inizialmente stavo implementando l'algoritmo Gen5 in Perl 5, ma ho deciso - perché non divertirmi un po '. E sì, in realtà ho compilato Perl 1 e questo codice funziona. Se lo esegui nella versione più recente di Perl, potresti ricevere avvisi sull'uso deprecato di do, ma siamo onesti: è l'unico modo per eseguire le funzioni in Perl 1. Perl 1 ha anche alcune stranezze da solo (ad esempio, non posso spostare la linea che inizia con la /M/riga precedente - perché? - Non lo so).

Inoltre, non ci sono numeri casuali in Perl 1, quindi spero che non mi ucciderai per il modulo di $$. È la cosa più vicina al numero casuale che avrei potuto trovare.

Modifica: sembra che la vecchia do call()sintassi sia stata rimossa in Perl 5.19.8. Assicurati di utilizzare una versione precedente di Perl per eseguire questo script, poiché sembra che Perl 5.20 non sia compatibile con gli script Perl 1.


5

PHP (746 763 byte - tutti i bonus):

<?if(!$i=fgets(STDIN))die('');parse_str($i,$i);$b=array('poke'=>1,'great'=>1.5,'ultra'=>2,'master'=>255,'safari'=>1.5,'sport'=>1.5,'lure'=>3,'net'=>3,'dusk'=>3.5,'dive'=>3.5,'moon'=>4,'fast'=>4,'quick'=>5,'love'=>8);$s=array('sleep'=>2.5,'frozen'=>2.5,'paralyzed'=>1.5,'poisoned'=>1.5,'burnt'=>1.5,''=>1);$i=array_merge(array('ball'=>'poke','hp'=>array('max'=>25,'current'=>1),'status'=>2.5,'rate'=>255),$i);$l='strtolower';$r='mt_rand';$x='*shake*'.PHP_EOL;$c='Click!'.PHP_EOL;$a=(((3*$i[hp][max])-(2*$i[hp][current]))*$i[rate]*$b[$l($i[ball])])/(3*$i[hp][max])*(is_numeric($i[status])?$i[status]:$s[$l($i[status])]);$a=((pow(65536/(255/$a),0.25)*4096)<<0)/4096;if($r(0,1)>$a)die();echo$x;if($a>1)die($c);if($r(0,1)>$a)die();echo$x,$x;if($r(0,1)>$a)die();echo$c;

Per usarlo, devi fornire l'input come 'ball = poke & status = sleep' su STDIN.

L'HP deve essere fornito come 'hp [max]' o 'hp [current]'.

Questo codice funziona, come testato qui .

È possibile fornire lo stato in base al nome o al moltiplicatore. ( non richiesto nella domanda ).

Ecco una versione leggibile:

if(!$info=fgets(STDIN))die('');
parse_str($info,$info);
$balls=array(//list of pokeballs
    'poke'=>1,
    'great'=>1.5,
    'ultra'=>2,
    'master'=>255,
    'safari'=>1.5,
    'sport'=>1.5,
    'lure'=>3,
    'net'=>3,
    'dusk'=>3.5,
    'dive'=>3.5,
    'moon'=>4,
    'fast'=>4,
    'quick'=>5,
    'love'=>8
);
$status=array(//list of status
    'sleep'=>2.5,
    'frozen'=>2.5,
    'paralyzed'=>1.5,
    'poisoned'=>1.5,
    'burnt'=>1.5,
    ''=>1 //in case there is no status
);
$info=array_merge(//this will set the default values
    array(
        'ball'=>'poke',
        'hp'=>array('max'=>25,'current'=>1),
        'status'=>2.5,
        'rate'=>255
    ),
    $info
);
$a=(((3*$info['hp']['max'])-(2*$info['hp']['current']))*$info['rate']*$balls[strtolower($info['ball'])])/(3*$info['hp']['max'])*(is_numeric($info['status'])?$info['status']:$status[strtolower($info['status'])]);
$a=((pow(65536/(255/$a),0.25)*4096)<<0)/4096;//same as $a=floor(pow(65536/(255/$a),0.25)*4096)/4096;

if(mt_rand(0,1)>$a) die();//test 1
echo '*shake*',PHP_EOL;
if($a>1)die('Click!'.PHP_EOL);//if $a>1, catch it (critical catch)

if(mt_rand(0,1)>$a) die();//test 2
echo'*shake*',PHP_EOL,'*shake*',PHP_EOL;

if(mt_rand(0,1)>$a) die();//test 3
echo 'Click!',PHP_EOL;//passed all tests

Ho dovuto modificare questo perché stavo usando una precisione molto più elevata di quella richiesta.

La correzione è stata fornita da TheConstructor .


Penso che si sta utilizzando un precission superiore a 1/4096 (domanda stati Nota: Whenever any division is performed, the result is rounded down to a multiple of 1/4096.)
TheConstructor

E hai ragione. Ho notato che sto usando qualunque valore provenga dalla divisione. Se vuoi, puoi darmi un po 'di aiuto perché non ho la minima idea di come "arrotondare" a una precisione minore in PHP.
Ismael Miguel,

Puoi fare floor(x*4096)/4096o implementare la divisione in virgola fissa come ho fatto io.
TheConstructor

Grazie per l'aiuto. Non ci penserei mai. Ho corretto la mia risposta.
Ismael Miguel,

3

Java, 611

import java.util.*;class P{enum B{DI(35),DU(35),FA(40),GR(15),LO(80),LU(30),MA(2550),MO(40),NE(30),PO(10),QU(50),SA(15),SP(15),UL(20);long v;B(int i){v=((long)i<<12)/(long)10;}}public static void main(String[]y){Scanner s=new Scanner(System.in);B b=B.valueOf(s.next().toUpperCase().substring(0,2));long c=(long)(s.nextDouble()*4096);long m=s.nextLong()<<12;long h=(s.hasNextInt()?s.nextLong():1)<<12;long S=(long)((s.hasNextDouble()?s.nextDouble():2.5)*4096);long p=(65536L<<12)/(long)(Math.sqrt(Math.sqrt((255L<<24)/((((3L*m-2L*h)*c>>12)*b.v>>12<<12)/(3L*m)*S>>12)))*512);Random r=new Random();System.out.print(r.nextInt(65536)<p?"*shake*\n"+(r.nextInt(65536)<p?"*shake*\n*shake*\n"+(r.nextInt(65536)<p?"Click!\n":""):""):"");}}

Punto:

  • 729 byte
  • -93 tutte le palle
  • -25 opzionale current_hp e bonus_state

=> 611

Il programma utilizza aritmetiche a punto fisso con 12 bit di frazione ( 1/4096è il valore del bit più a destra). Dato che Java di solito non usa il punto fisso, ci sono alcuni cambiamenti all'interno del codice per ottenere i risultati previsti. Vedi la versione lunga per le funzioni aritmetiche utilizzate, che sono state integrate per scopi di golf.

Mentre la maggior parte dei calcoli avrebbe potuto essere effettuata su intvalori, le divisioni funzionano meglio con longs poiché è necessario spostare il dividendo di un altro 12 bit a sinistra per mantenere la precisione desiderata (altrimenti si perdono tutti i bit di frazione).

Input di esempio ( ;richiesto solo se eseguito in modo interattivo, ad esempio STDIN non ha ricevuto EOF): Ball, catch_rate, max_hp

Poke 15 255 ;

Uscita campione:

*shake*

Input di esempio: Ball, catch_rate, max_hp, current_hp, bonus_state

Moon 42 255 50 1.5

Uscita campione:

*shake*
*shake*
*shake*
Click!
import java.math.BigDecimal;
import java.util.Random;
import java.util.Scanner;

class Pokeball {
    static long shift(long i) {
        return i << 12;
    }
    enum B {
        DI(35),DU(35),FA(40),GR(15),LO(80),LU(30),MA(2550),MO(40),NE(30),PO(10),QU(50),SA(15),SP(15),UL(20);
        long v;
        B(int i) {
            v = semiFixedDivision(shift(i),10);
        }
    }

    public static void main(String[] args) {
        final Scanner s = new Scanner(System.in);
        B b = B.valueOf(s.next().toUpperCase().substring(0, 2));
        long catchRate = (long) (s.nextDouble() * 4096);
        long maxHp = shift(s.nextLong());
        long currentHp = shift(s.hasNextInt()?s.nextInt():1);
        long statusBonus = (long) ((s.hasNextDouble()?s.nextDouble():2.5) * 4096);
        long a = fixedMultiplication(fixedDivision(fixedMultiplication(fixedMultiplication(
                semiFixedMultiplication(3, maxHp) - semiFixedMultiplication(2, currentHp), catchRate), b.v),
                                                   semiFixedMultiplication(3, maxHp)), statusBonus);
        println("a=",a);
        long x = fixedFourthRoot(fixedDivision(shift(255), a));
        println("x=",x);
        println("x^4=",fixedMultiplication(fixedMultiplication(x,x), fixedMultiplication(x,x)));
        long p = semiFixedDivision(shift(65536), fixedFourthRoot(fixedDivision(shift(255), a)));
        Random r = new Random();
        System.out.print(r.nextInt(65536) < p ?
                         "*shake*\n" + (r.nextInt(65536) < p ?
                                        "*shake*\n*shake*\n" + (r.nextInt(65536) < p ?
                                                                "Click!\n" :
                                                                "") :
                                        "") :
                         "");
    }

    private static long unshift(long p) {
        return p >> 12;
    }

    private static void println(String s, long v) {
        System.out.print(s);
        println(v);
    }

    private static void println(long v) {
        System.out.printf("%s%n", BigDecimal.valueOf(v).divide(BigDecimal.valueOf(4096)));
    }

    /**
     * Calculates division of {@code a/b} with both number last 12 bits treated as being "right of the dot"
     */
    static long fixedDivision(long a, long b) {
        return (a<<12)/b;
    }

    /**
     * Calculates division of {@code a/b} with {@code a}'s last 12 bits treated as being "right of the dot"
     */
    static long semiFixedDivision(long a, long b) {
        return a/b;
    }
    static long fixedMultiplication(long a, long b) {
        return (a*b) >> 12;
    }
    static long semiFixedMultiplication(long a, long b) {
        return a*b;
    }
    static long fixedFourthRoot(long a) {
        return (long)(Math.sqrt(Math.sqrt(a)) * 512);
    }
}

1

CoffeeScript - 317 313 310 307 306 294 270 250 242 byte

342-25 (parametri) - 75 (12 palline) = 242

_=process.stdin
l=console.log
m=Math
s=m.sqrt
t=['*shake*','Click!']
n=65536
_.resume()
_.setEncoding 'utf8'
_.on 'data',(d)=>
 [A,B,C,E,F]=d.match /\w+/g;E||=1;F||=2.5;i=0;while i++<3
  if n*(s s (3*A-2*E)*B*{P:1,G:1.5,U:2,M:255,S:1.5,L:3,N:3,D:3.5,F:4,Q:5}[C.charAt 0]*F)<m.floor(m.random()*n)*s s 765*A
   break
  l t[0]
 if i>2
  l t[i-3]

Si aspetta input HP_max,Rate,Ball[,HP_current[,status]]. Non supporta Moono Lovepalle.

Questa è la prima cosa che abbia mai giocato a golf che non è una regex, quindi probabilmente c'è spazio per miglioramenti. Ho copiato spudoratamente l'idea di memorizzare solo nomi di palle parziali. ;) Sostenere le altre due palle semplicemente non ne vale la pena, nemmeno con l'aggiunta di +7 per ottenere tutti i bonus.

Versione Ungolfed

Questa versione omette tutti gli alias brevi che definisco all'inizio, ma definisce la ricerca palla separatamente.

balls =
  P: 1
  G: 1.5
  U: 2
  M: 255
  S: 1.5
  L: 3
  N: 3
  D: 3.5
  F: 4
  Q: 5

messages = ['*shake*', 'Click!']

process.stdin.resume()
process.stdin.setEncoding 'utf8'
process.stdin.on 'data', (data) =>
  [HP_max, rate, ball, HP_current, status] = data.match /\w+/g
  HP_current ||= 1
  HP_status ||= 2.5
  i = 0
  while i++ < 3
    if 65536 * (Math.sqrt Math.sqrt (3*HP_max - 2*HP_current)*rate*status*balls[ball.charAt 0]) < Math.floor(Math.random()*65536) * Math.sqrt Math.sqrt 765*HP_max
      break
    console.log messages[0]
  if i > 2
    console.log messages[i-3]

Una nota sulla formula di probabilità: ho riorganizzato la formula completa (con la scritta a) in modo che non ci siano divisioni e sto calcolando (...)^(1/4)prendendo la radice quadrata due volte.


1
Sembra che la precendenza sia dalla tua parte Oo p-=p%1/4096sembra davvero funzionare. (Avrei immaginato che avresti almeno bisogno di scrivere p-=p%(1/4096)e poi non sarei sicuro che il modulo sia implementato per le frazioni da entrambe le parti. Bello!
TheConstructor

@TheConstructor Haha, sì, in realtà ho dovuto controllare che ... sembrava davvero strano anche per me, ma %può essere usato per alcune cose divertenti in JS. Dopo aver riletto la domanda, penso che questa risposta non soddisfi del tutto il requisito di arrotondamento. Penso che l'arrotondamento dovrebbe essere applicato dopo ogni divisione. Potrei dover ristrutturare un po 'il mio calcolo. ^^
Martin Ender,

Sì, probabilmente è ancora una buona idea
TheConstructor l'

@TheConstructor In realtà, ho bisogno di scrivere p%(1/4096). Ho anche controllato questo prima di pubblicare, ma in qualche modo ricordato il risultato del mio test sbagliato.
Martin Ender,

Provato in Chrome; ha funzionato senza () ma forse non sempre o meno su tutti i browser ...
TheConstructor l'

0

Aggiornamento: (C #)

Conteggio byte: 3.600

Critcal: -25

Tutte le palline: -91


Totale = 3.484

[Golfed]

using System;using System.Text;using System.Security.Cryptography;using System.Linq;namespace Pokemon{public class MainClass{private string[] c(string[] i){if(i.Length <= 3){var v1 =i[0][0];var v2 =i[1][0];var v3 =i[2][0];if(v1>='0'&&v1<='9'&&v2>='a'&&v2<='z'&&v3>='0'&&v3<='9')return new string[]{i[0],i[2],i[1]};else if(v1>='0'&&v1<='9'&&v2>='0'&&v2<='9'&&v3>='a'&&v3<='z')return new string[]{i[0],i[1],i[2]};else if(v1>='a'&&v1<='z'&&v2>='0'&&v2<='9'&&v3>='0'&&v3<='9')return new string[]{i[1],i[2],i[0]};else return null;}else return null;}private static void Main(string[] args){while(true){Console.Clear();MainClass _c = new MainClass();Console.Write("Inputs'please:");var i = Console.ReadLine().ToLower();string[] r = _c.c((string[])(i.Split(new Char[]{' ','.',',','\n','\t','!','@','#','$','%','^','&','&','*','(',')','-','_','+','=','?','/','\\'},StringSplitOptions.RemoveEmptyEntries).Select(p=>p.Trim()).ToList()).ToArray());new w("Processing...\n");if(r== null)new w("Too many errors");else new m(r);}}}public class w{public w(string l){Console.WriteLine(l);}}public class m{public m(string[] v){switch (v[2].Substring(0,2)){case "po":c(v[0],v[1],"1");break;case "ul":c(v[0],v[1],"2");break;case "ma":c(v[0],v[1],"255");break;case "gr":case "sa":case "sp":c(v[0],v[1],"1.5");break;case "lu":case "ne":c(v[0],v[1],"3");break;case "du":case "di":c(v[0],v[1],"3.5");break;case "mo":case "fa":c(v[0],v[1],"4");break;case "qu":c(v[0],v[1],"5");break;case "lo":c(v[0],v[1],"8");break;default:new w("Not supported");break;}}private double y(double v){return Convert.ToDouble(((double)1/(double)4096)*(v/Convert.ToDouble(1/4096)-(v%Convert.ToDouble(1/4096))));}private bool i(double v,double r,double b){if(((double)new Random().Next(0,(int)r))>b*v)return true;else return false;}private double f(double r, double h, double b){return 2.5*y((((3.0*h)-2.0)*r*b)/(3.0*h));}private void c(params string[] v){var s =0.0;var x =0;if(int.Parse(v[1])>100&&int.Parse(v[1])<= 255){s =f(double.Parse(v[0]),double.Parse(v[1]),double.Parse(v[2]));x=0;}else if(int.Parse(v[0])>100&&int.Parse(v[0])<= 255){s =f(double.Parse(v[1]),double.Parse(v[0]),double.Parse(v[2]));x=1;}else{new w(String.Format("Which number is the Max HP? :{0} or {1}:",v[0],v[1]));var c_ = int.Parse(Console.ReadLine());s =f((double.Parse(v[0])+double.Parse(v[1]))-double.Parse(v[c_]),double.Parse(v[c_]),double.Parse(v[2]));x=2;}if(((double)new Random().Next(0, 2047))<s*2.5)new w("*shake*\nClick!");else{for(int c_= 0;c_<3;c_++){new w("*shake*");var r =Math.Pow(65536.0/y(255.0/s),0.25);if(i(r,double.Parse(v[x]),2.5)==true){new w("Click!");break;}else;}}Console.ReadKey();}}}

[regolare]

using System;
using System.Text;
using System.Security.Cryptography;
using System.Linq;

namespace Pokemon
{
    public class MainClass
    {
        private string[] c(string[] i)
        {
            if (i.Length <= 3)
            {
                var v1 =i[0][0];
                var v2 =i[1][0];
                var v3 =i[2][0];
                if(v1>='0'&&v1<='9'&&v2>='a'&&v2<='z'&&v3>='0'&&v3<='9')return new string[]{i[0],i[2],i[1]};
                else if(v1>='0'&&v1<='9'&&v2>='0'&&v2<='9'&&v3>='a'&&v3<='z')return new string[]{i[0],i[1],i[2]};
                else if(v1>='a'&&v1<='z'&&v2>='0'&&v2<='9'&&v3>='0'&&v3<='9')return new string[]{i[1],i[2],i[0]};
                else return null;
            }
            else return null;
        }

        private static void Main(string[] args)
        {
            while(true)
            {
                Console.Clear();
                MainClass _c = new MainClass();
                Console.Write("Inputs'please:");
                var i = Console.ReadLine().ToLower();
                string[] r = _c.c((string[])(i.Split(new Char[]{' ','.',',','\n','\t','!','@','#','$','%','^','&','&','*','(',')','-','_','+','=','?','/','\\'},StringSplitOptions.RemoveEmptyEntries).Select(p=>p.Trim()).ToList()).ToArray());
                new w("Processing...\n");
                if(r== null)new w("Too many errors");
                else new m(r);
            }
        }
    }

    public class w
    {
        public w(string l)
        {
            Console.WriteLine(l);
        }
    }

    public class m
    {
        public m(string[] v)
        {
            switch (v[2].Substring(0,2))
            {
                case "po":
                    c(v[0],v[1],"1");
                    break;
                case "ul":
                    c(v[0],v[1],"2");
                    break;
                case "ma":
                    c(v[0],v[1],"255");
                    break;
                case "gr":
                case "sa":
                case "sp":
                    c(v[0],v[1],"1.5");
                    break;
                case "lu":
                case "ne":
                    c(v[0],v[1],"3");
                    break;
                case "du":
                case "di":
                    c(v[0],v[1],"3.5");
                    break;
                case "mo":
                case "fa":
                    c(v[0],v[1],"4");
                    break;
                case "qu":
                    c(v[0],v[1],"5");
                    break;
                case "lo":
                    c(v[0],v[1],"8");
                    break;
                default:
                    new w("Not supported");
                    break;
            }
        }

        private double y(double v){return Convert.ToDouble(((double)1/(double)4096)*(v/Convert.ToDouble(1/4096)-(v%Convert.ToDouble(1/4096))));}

        private bool i(double v,double r,double b){if(((double)new Random().Next(0,(int)r))>b*v)return true;else return false;}

        private double f(double r, double h, double b){return 2.5*y((((3.0*h)-2.0)*r*b)/(3.0*h));}

        private void c(params string[] v)
        {
            var s =0.0;
            var x =0;
            if(int.Parse(v[1])>100&&int.Parse(v[1])<= 255){s =f(double.Parse(v[0]),double.Parse(v[1]),double.Parse(v[2]));x=0;}
            else if(int.Parse(v[0])>100&&int.Parse(v[0])<= 255){s =f(double.Parse(v[1]),double.Parse(v[0]),double.Parse(v[2]));x=1;}
            else
            {
                new w(String.Format("Which number is the Max HP? :{0} or {1}:",v[0],v[1]));
                var c_ = int.Parse(Console.ReadLine());
                s =f((double.Parse(v[0])+double.Parse(v[1]))-double.Parse(v[c_]),double.Parse(v[c_]),double.Parse(v[2]));
                x=2;
            }
            if (((double)new Random().Next(0, 2047))<s*2.5)new w("*shake*\nClick!");
            else
            {
                for(int c_= 0;c_<3;c_++)
                {
                    new w("*shake*");
                    var r =Math.Pow(65536.0/y(255.0/s),0.25);
                    if (i(r,double.Parse(v[x]),2.5)==true){new w("Click!");break;}else;
                }
            }
            Console.ReadKey();
        }    
      }
  }

Questo è il golf del codice. Dovresti ridurre la tua risposta (ad es. Spogliare gli spazi bianchi). Puoi ancora fornire la risposta corrente come versione leggibile.
Ismael Miguel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.