Rzuć punktami umiejętności mojej postaci D&D

18

W Lochach i Smokach najważniejszymi atrybutami postaci są wyniki umiejętności. Istnieje 6 wyników dla sześciu umiejętności. Umiejętności to Siła, Zręczność, Konstytucja, Inteligencja, Mądrość i Charyzma.

Przy określaniu wyników dla postaci, stosuję następującą procedurę: Rzuć 4k6, upuść najniższą, w dowolnej kolejności. Oznacza to, że rzucam 4 sześciościennymi kostkami, ignoruję najniższy wynik i sumuję pozostałe 3. Robi się to 6 razy. Otrzymane liczby są przypisywane do umiejętności w dowolny sposób, jaki mi się podoba.

System, którego używam do przypisywania punktów do umiejętności, polega na przypisywaniu najwyższego wyniku najważniejszej umiejętności mojej postaci, która zależy od klasy mojej postaci, przypisywaniu drugiej najwyższej oceny do Konstytucji, ponieważ wszyscy potrzebują Konstytucji, a pozostałe cztery oceny arbitralnie.

Oto tabela najważniejszych umiejętności dla różnych klas:

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

Wyzwanie: Dam ci (jako dane wejściowe) pierwszą literę klasy mojej postaci (dużymi literami). Chciałbym, abyś rzucił wyniki umiejętności i przypisał je do umiejętności, jak opisano powyżej, a następnie wyprowadził je w kolejności Siła, Zręczność, Konstytucja, Inteligencja, Mądrość, Charyzma.

Przykład:

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.

Dane wyjściowe mogą być podawane w dowolnym formacie, w którym liczby są wyraźnie oddzielone i we właściwej kolejności.

Najkrótszy kod w bajtach wygrywa. Standardowe luki zabronione.

isaacg
źródło

Odpowiedzi:

6

CJam, 43 41 40 bajtów

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

Dzięki @ Sp3000 za grę w golfa z 1 bajtu.

Wypróbuj online w interpretatorze CJam .

Jak to działa

{             }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
źródło
6

Python 3, 137 bajtów

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)

Wyświetla listę liczb całkowitych, np . [14, 9, 13, 12, 12, 13]Dla F.

Mapowanie z wejściowego znaku na zadania okazało się zaskakująco miłe. Najpierw zaczynamy od Lnajniższych 4 rolek, po których chcemy wstawić

  • Zatem najwyższy rzut do właściwej pozycji na podstawie danych wejściowych
  • Drugi najwyższy rzut na indeks 2, dla Konstytucji.

Dla każdego wejścia potrzebne nam są najwyższe wyniki:

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

O dziwo, potrzebujemy tylko "FRW BPS".find(input())tego, ponieważ:

  • FRW działają zgodnie z oczekiwaniami, podając ich odpowiednie wskaźniki,
  • CDMnie są obecne, więc finddaje -1, który dla listy 4-elementowej ma indeks 3, a
  • BPS daj odpowiednio 4, 5, 6, ale nie ma znaczenia, czy przekroczymy, ponieważ możemy dodać tylko element na końcu.
Sp3000
źródło
1

J, 100 97 bajtów

(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

Wprowadza dane wejściowe STDIN

Fatalizować
źródło
Słyszę, że Prolog zaczyna być zazdrosny ...
Alex A.,
@AlexA. Robimy sobie przerwę, tymczasem mogę spróbować czegoś innego ...
Fatalize
0

C ++ - 387 bajtów

Pierwsza próba tutaj, wymagane więcej golfa, szczególnie przy określaniu, która klasa jest używana.

Gra w golfa:

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

Raczej bez golfa:

#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
źródło