Wirf die Fähigkeitswerte meines D & D-Charakters

18

In Dungeons and Dragons sind einige der wichtigsten Attribute eines Charakters die Fähigkeitswerte. Es gibt 6 Fähigkeitswerte für die sechs Fähigkeiten. Die Fähigkeiten sind Stärke, Geschicklichkeit, Konstitution, Intelligenz, Weisheit und Charisma.

Bei der Bestimmung der Punkte für einen Charakter gehe ich wie folgt vor: Wirf 4W6, lasse den niedrigsten fallen, in beliebiger Reihenfolge. Das bedeutet, dass ich 4 sechsseitige Würfel würfle, das niedrigste Ergebnis ignoriere und die anderen 3 summiere. Dies wird sechsmal gemacht. Die resultierenden Zahlen sind den Fähigkeiten nach Belieben zugeordnet.

Das System, das ich verwende, um Fähigkeiten Punkte zuzuweisen, besteht darin, der wichtigsten Fertigkeit meines Charakters die höchste Punktzahl zuzuweisen, die von der Klasse meines Charakters abhängt, Constitution die zweithöchste Punktzahl zuzuweisen, da jeder Constitution benötigt, und die anderen vier Punkte willkürlich zuzuweisen.

Hier ist eine Tabelle der wichtigsten Fähigkeiten für verschiedene Klassen:

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

Herausforderung: Ich gebe dir (als Eingabe) den ersten Buchstaben der Klasse meines Charakters (in Großbuchstaben). Ich möchte, dass Sie die Fähigkeitswerte rollen und wie oben beschrieben den Fähigkeiten zuweisen und sie dann in der Reihenfolge Stärke, Geschicklichkeit, Konstitution, Intelligenz, Weisheit, Charisma ausgeben.

Beispiel:

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.

Die Ausgabe kann in jedem Format erfolgen, bei dem die Nummern klar voneinander getrennt und in der richtigen Reihenfolge angegeben sind.

Kürzester Code in Bytes gewinnt. Standardlücken verboten.

isaacg
quelle

Antworten:

6

CJam, 43 41 40 Bytes

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

Vielen Dank an @ Sp3000 für das Abschlagen von 1 Byte.

Probieren Sie es online im CJam-Interpreter aus .

Wie es funktioniert

{             }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
quelle
6

Python 3, 137 Bytes

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)

Gibt eine Liste von Ganzzahlen aus, zB [14, 9, 13, 12, 12, 13]für F.

Die Zuordnung von den Eingabezeichen zu den Zuordnungen erwies sich als überraschend schön. Zuerst müssen wir Ldie niedrigsten 4 Rollen enthalten, nach denen wir einfügen möchten

  • Der Höchste rollt dann in die richtige Position, basierend auf der Eingabe
  • Der zweithöchste Eintrag in Index 2 für Verfassung.

Für jede Eingabe wollen wir folgende Indizes für die höchsten Rollen:

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

Erstaunlicherweise brauchen wir nur "FRW BPS".find(input())dafür, weil:

  • FRW arbeiten wie erwartet, geben ihre jeweiligen Indizes,
  • CDMsind nicht vorhanden so findergibt sich -1, dass für eine 4-elementige Liste der Index 3 und
  • BPS Geben Sie 4, 5, 6 an, aber es spielt keine Rolle, ob wir überschießen, da wir ein Element nur am Ende anhängen können.
Sp3000
quelle
1

J 100 97 Bytes

(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

Nimmt Eingaben auf STDIN

Tödlich
quelle
Ich habe gehört, Prolog wird eifersüchtig ...
Alex A.
@AlexA. Wir machen gerade eine Pause, ich kann in der Zwischenzeit noch etwas anderes ausprobieren ...
Fatalize
0

C ++ - 387 Bytes

Der erste Versuch, hier mehr Golf zu spielen, ist erforderlich, insbesondere um festzustellen, welche Klasse verwendet wird.

Golf gespielt:

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

Eher 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();
}
BMac
quelle