Ottieni i punteggi delle abilità del mio personaggio D&D


18

In Dungeons and Dragons, alcuni dei più importanti attributi di un personaggio sono i punteggi delle abilità. Ci sono 6 punteggi di abilità, per le sei abilità. Le abilità sono Forza, Destrezza, Costituzione, Intelligenza, Saggezza e Carisma.

Nel determinare i punteggi di un personaggio, utilizzo la seguente procedura: Lancia 4d6, rilascia il più basso, in qualsiasi ordine. Ciò significa che lancio 4 dadi a sei facce, ignoro il risultato più basso e somma l'altro 3. Questo viene fatto 6 volte. I numeri risultanti sono assegnati alle abilità in qualsiasi modo per favore.

Il sistema che uso per assegnare i punteggi alle abilità è quello di assegnare il punteggio più alto all'abilità più importante del mio personaggio, che dipende dalla classe del mio personaggio, assegnare il secondo punteggio più alto alla Costituzione, poiché tutti hanno bisogno della Costituzione e assegnare gli altri quattro punteggi in modo arbitrario.

Ecco una tabella delle competenze più importanti per varie classi:

Bard - Charisma
Cleric - Wisdom
Druid - Wisdom
Fighter - Stregth
Monk - Wisdom
Paladin - Charisma
Rogue - Dexterity
Sorcerer - Charisma
Wizard - Intelligence

Sfida: ti darò (come input) la prima lettera della classe del mio personaggio (in maiuscolo). Vorrei che tu tirassi i punteggi delle abilità e le assegnassi alle abilità come descritto sopra, e poi le emetti nell'ordine Forza, Destrezza, Costituzione, Intelligenza, Saggezza, Carisma.

Esempio:

Input: R
Rolls: 4316 3455 3633 5443 2341 6122
Scores: 13 14 12 13 9 10
Ordering: Highest goes to dexterity. Second goes to Constitution.
Output: 13 14 13 12 9 10
or
Output: 9 14 13 10 12 13
or etc.

L'output può essere fornito in qualsiasi formato in cui i numeri sono chiaramente separati e nell'ordine corretto.

Vince il codice più breve in byte. Scappatoie standard vietate.

Risposte:


6

CJam, 43 41 40 byte

{6a4*:mr$0Zt:+}6*]$2m<"FRXWCDM"r#4e<3e\p

Grazie a @ Sp3000 per giocare a golf a 1 byte.

Provalo online nell'interprete CJam .

Come funziona

{             }6*                       e# Repeat 6 times:
 6a4*                                   e#   Push [6 6 6 6].
     :mr                                e#   Replace each six with a pseudo-randomly
                                        e#   generated integer in [0 ... 5].
        $                               e#   Sort the results.
         0Zt                            e#   Replace the lowest result by 3.
            :+                          e#   Add all four integers
                ]                       e# Wrap the 6 generated integers in an array.
                 $                      e# Sort.
                  2m<                   e# Rotate 2 units to the left to assign the
                                        e# second highest result to Constitution.
                     "FRXWCDM"          e# Push that string.
                              r#        e# Find the index of the input.
                                        e# The string doesn't contain B, P or S, so
                                        e# those push -1.
                                4e<     e# Truncate the index at 4. This way, C, D
                                        e# M all push 4.
                                   3e\  e# Swap the integer at that index with the
                                        e# one at index 3, i.e., the highest one.
                                      p e# Print.

6

Python 3, 137 byte

from random import*
S=sorted
*L,c,h=S(3+sum(S(map(randrange,[6]*4))[1:])for _ in[0]*6)
L[:"FRW BPS".find(input())]+=h,
L[:2]+=c,
print(L)

Emette un elenco di numeri interi, ad esempio [14, 9, 13, 12, 12, 13]per F.

La mappatura dal carattere di input alle assegnazioni si è rivelata sorprendentemente piacevole. Per prima cosa iniziamo con Lcontenere i 4 rotoli più bassi, dopo di che vogliamo inserire

  • Il rotolo più alto nella posizione corretta in base all'input, quindi
  • Il secondo tiro più alto nell'indice 2, per Costituzione.

Per ogni input, gli indici che vogliamo per i tiri più alti sono:

Index    Ability          Input(s)
----------------------------------
0        Strength         F
1        Dexterity        R
2        Intelligence     W
3        Wisdom           CDM
4        Charisma         BPS

Sorprendentemente, abbiamo solo bisogno "FRW BPS".find(input())di questo, perché:

  • FRW lavorare come previsto, fornendo i rispettivi indici,
  • CDMnon sono presenti quindi find-1, che per un elenco di 4 elementi è indice 3, e
  • BPS dai 4, 5, 6 rispettivamente, ma non importa se superiamo perché possiamo solo aggiungere un elemento alla fine.

1

J, 100 97 byte

(0;0,b)C.^:(b>0)(0;1 2)C.\:~+/"1]1}."1/:~"1]1+?6 4$4$6[b=.('BCDFMPRSW'i.1!:1[1){5 4 4 0 4 5 1 5 3

Riceve input STDIN


Ho sentito che Prolog sta diventando geloso ...
Alex A.

@AlexA. Ci stiamo solo prendendo una pausa, posso provare qualcos'altro nel frattempo ...
Fatalizza il

0

C ++ - 387 byte

Primo tentativo qui, più golf richiesto, in particolare nel determinare quale classe viene utilizzata.

golfed:

#include<cstdlib>
#include<cstdio>
#include<time.h>
int main(int c,char**v){char*o=*v,l=*v[1];int b=-1,s=-1,i=6,x=0,q=l>=67&&l<=68||l==77?4:l==70?0:l==87?3:l==82?1:5;srand(time(0));for(;i-->0;){int w=9,d=4,u=3,t;for(;d-->0;){t=rand()%6;if(t<w){u+=w<9?w:0;w=t;}else u+=t;}if(u>s){c=s;s=u;u=c;}if(s>b){c=s;s=b;b=c;}if(u>=0)o[x++]=u;}for(i=0;i<6;i++)printf("%d ",i==2?s:(i==q?b:o[--x]));}

Piuttosto ungolfed:

#include<cstdlib>
#include<cstdio>
#include<time.h>
int main(int c,char**v)
{
    //name of program must be at least 4 chars
    char*others=*v,clas=*v[1];
    int desired = clas>=67&&clas<=68||clas==77?4:clas==70?0:clas==87?3:clas==82?1:5; //TODO:

    srand(time(0));
    int best=-1,second=-1,i=6,otherIndex=0;
    for(;i-->0;)
    {
        int lowest=9,diecount=4,sum=3;
        for(;diecount-->0;)
        {
            int loc=rand()%6;
            if (loc<lowest)
            {
                sum+=lowest<9?lowest:0;
                lowest=loc;
            }
            else
            {
                sum+=loc;
            }
        }
        if(sum>second)
        {
            c=second;second=sum;sum=c;
        }
        if(second>best)
        {
            c=second;second=best;best=c;
        }
        if(sum>=0)
        {
            others[otherIndex++]=sum;
        }
    }

    for(i=0;i<6;i++)
    {
        printf("%d ",i==2?second:(i==desired?best:others[--otherIndex]));
    }

    getchar();
}
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.