Gulung skor kemampuan karakter D & D saya

18

Di Dungeons and Dragons, beberapa atribut terpenting dari karakter adalah skor kemampuan. Ada 6 skor kemampuan, untuk enam kemampuan. Kemampuannya adalah Kekuatan, Kecekatan, Konstitusi, Kecerdasan, Kebijaksanaan, dan Karisma.

Saat menentukan skor untuk karakter, saya menggunakan prosedur berikut: Gulung 4d6, jatuhkan yang terendah, dalam urutan apa pun. Apakah ini berarti bahwa saya melempar 4 dadu enam sisi, mengabaikan hasil terendah, dan menjumlahkan 3 lainnya. Ini dilakukan 6 kali. Angka-angka yang dihasilkan ditugaskan untuk kemampuan dengan cara apa pun yang saya inginkan.

Sistem yang saya gunakan untuk menetapkan skor pada kemampuan adalah dengan menetapkan skor tertinggi untuk keterampilan karakter saya yang paling penting, yang tergantung pada kelas karakter saya, menetapkan skor tertinggi kedua ke Konstitusi, karena semua orang membutuhkan Konstitusi, dan menetapkan empat skor lainnya secara sewenang-wenang.

Berikut adalah tabel keterampilan paling penting untuk berbagai kelas:

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

Tantangan: Saya akan memberi Anda (sebagai masukan) huruf pertama dari kelas karakter saya (Dalam huruf besar). Saya ingin Anda menggulirkan skor kemampuan dan menetapkannya pada kemampuan seperti dijelaskan di atas, dan kemudian menampilkannya dalam urutan Kekuatan, Kecekatan, Konstitusi, Kecerdasan, Kebijaksanaan, Karisma.

Contoh:

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.

Keluaran dapat diberikan dalam format apa pun di mana angka-angka dipisahkan dengan jelas dan dalam urutan yang tepat.

Kode terpendek dalam byte menang. Celah standar dilarang.

isaacg
sumber

Jawaban:

6

CJam, 43 41 40 byte

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

Terima kasih kepada @ Sp3000 untuk bermain golf 1 byte.

Cobalah online di juru bahasa CJam .

Bagaimana itu bekerja

{             }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
sumber
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)

Menghasilkan daftar bilangan bulat, misalnya [14, 9, 13, 12, 12, 13]untuk F.

Pemetaan dari input char ke tugas ternyata sangat bagus. Pertama kita mulai dengan memilikiL memuat 4 gulungan terendah, setelah itu kita ingin memasukkan

  • Gulungan tertinggi ke posisi yang benar berdasarkan input, lalu
  • Gulungan tertinggi kedua ke dalam indeks 2, untuk Konstitusi.

Untuk setiap input, indeks yang kami inginkan untuk gulungan tertinggi adalah:

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

Hebatnya, kita hanya perlu "FRW BPS".find(input())untuk ini, karena:

  • FRW bekerja seperti yang diharapkan, memberikan indeks masing-masing,
  • CDMtidak hadir begitu findmemberi-1 , yang untuk daftar 4-elemen adalah indeks 3, dan
  • BPS berikan 4, 5, 6 masing-masing, tetapi tidak masalah jika kita melakukan overshoot karena kita hanya dapat menambahkan elemen di akhir.
Sp3000
sumber
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

Membawa input STDIN

Fatalisasi
sumber
Saya mendengar Prolog semakin cemburu ...
Alex A.
@AlexA. Kami hanya sedang istirahat, saya dapat mencoba sesuatu yang lain sementara itu ...
Fatalize
0

C ++ - 387 byte

Upaya pertama di sini, lebih banyak bermain golf, terutama dalam menentukan kelas apa yang sedang digunakan.

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

Agak 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
sumber