Lancez les scores de capacité de mon personnage D&D

18

Dans Dungeons and Dragons, certains des attributs les plus importants d'un personnage sont les scores de capacité. Il y a 6 scores de capacité, pour les six capacités. Les capacités sont la force, la dextérité, la constitution, l'intelligence, la sagesse et le charisme.

Pour déterminer les scores d'un personnage, j'utilise la procédure suivante: lancez 4d6, déposez le plus bas, dans n'importe quel ordre. Cela signifie que je lance 4 dés à six faces, ignore le résultat le plus bas et additionne les 3 autres. Cela se fait 6 fois. Les numéros résultants sont attribués aux capacités de la manière qui me convient.

Le système que j'utilise pour attribuer des scores aux capacités consiste à attribuer le score le plus élevé à la compétence la plus importante de mon personnage, qui dépend de la classe de mon personnage, d'attribuer le deuxième score le plus élevé à la Constitution, car tout le monde a besoin de la Constitution et d'attribuer arbitrairement les quatre autres scores.

Voici un tableau des compétences les plus importantes pour différentes classes:

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

Défi: je vais vous donner (en entrée) la première lettre de la classe de mon personnage (en majuscules). J'aimerais que vous obteniez les scores de capacités et les assigniez aux capacités comme décrit ci-dessus, puis les sortiez dans l'ordre Force, Dextérité, Constitution, Intelligence, Sagesse, Charisme.

Exemple:

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.

La sortie peut être donnée dans n'importe quel format où les nombres sont clairement séparés et dans le bon ordre.

Le code le plus court en octets gagne. Échappatoires standard interdites.

isaacg
la source

Réponses:

6

CJam, 43 41 40 octets

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

Merci à @ Sp3000 d'avoir joué au golf sur 1 octet.

Essayez-le en ligne dans l' interpréteur CJam .

Comment ça fonctionne

{             }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.
Dennis
la source
6

Python 3, 137 octets

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)

Affiche une liste d'entiers, par exemple [14, 9, 13, 12, 12, 13]pour F.

Le mappage du caractère d'entrée aux affectations s'est révélé étonnamment agréable. Nous commençons d'abord par avoir Lles 4 rouleaux les plus bas, après quoi nous voulons insérer

  • Le plus haut rouleau dans la position correcte en fonction de l'entrée, puis
  • Le deuxième plus haut rôle dans l'index 2, pour la Constitution.

Pour chaque entrée, les indices que nous voulons pour les rôles les plus élevés sont:

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

Étonnamment, nous n'en avons besoin que "FRW BPS".find(input())parce que:

  • FRW travailler comme prévu, en donnant leurs indices respectifs,
  • CDMne sont pas présents donc finddonne -1, qui pour une liste de 4 éléments est l'index 3, et
  • BPS donnez 4, 5, 6 respectivement, mais cela n'a pas d'importance si nous dépassons parce que nous ne pouvons ajouter qu'un élément à la fin.
Sp3000
la source
1

J, 100 97 octets

(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

Prend entrée dans STDIN

Fatalize
la source
J'entends que Prolog devient jaloux ...
Alex A.
@AlexA. On fait juste une pause, je peux essayer autre chose en attendant ...
Fatalize
0

C ++ - 387 octets

Première tentative ici, plus de golf requis, en particulier pour déterminer quelle classe est utilisée.

Golfé:

#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]));}

Plutôt non golfé:

#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();
}
BMac
la source