Mam problem z zapamiętaniem wszystkiego, co muszę zrobić, aby awansować na postać D&D. Z jakiegokolwiek powodu jedną z rzeczy, które przysparzają mi kłopotów, jest ustalenie ich nowej maksymalnej wartości HP. Do tego wyzwania napiszesz program lub funkcję do automatycznego obliczania poprawnej wartości.
Terminologia
Pierwszą rzeczą, którą musisz wiedzieć, aby obliczyć maksymalne HP, jest „modyfikator Konstytucji”. Każda postać DND ma sześć całkowitych wyników umiejętności, w tym jeden za Konstytucję. Jedyną istotną wiedzą wymaganą do tego wyzwania jest to, jak wynik umiejętności Konstytucji wpływa na inną statystykę, która jest modyfikatorem Konstytucji. Krótko mówiąc, modyfikator jest równy floor( (ability_score - 10) / 2 )
. Poszukiwacze przygód mogą mieć wyniki od 1 do 20 włącznie. Twój kod nigdy nie będzie musiał obsługiwać wyników poza tym zakresem, co oznacza również, że nigdy nie będzie musiał obsługiwać modyfikatora niższego niż -5 lub większego niż +5. Chociaż modyfikator Konstytucji może się zmieniać wraz ze wzrostem poziomu postaci, jego wpływ na HP jest stosowany z mocą wsteczną, więc tylko jego aktualna wartość jest potrzebna do obliczenia aktualnego maksymalnego HP.
(To jest zupełnie bez znaczenia na to wyzwanie, ale jeśli jesteś ciekaw, jak to wpływa na maksymalną HP: Można założyć, że „Tough” feat dodaje 2 do modyfikatora charakter konstytucji dla celów obliczania HP, ponieważ to skutecznie , co robi To nie jest tekst wyczynu, ale matematyka okazuje się być dokładnie taka sama. Nie musisz radzić sobie z tym wyczynem w swojej odpowiedzi.)
Następnie każda klasa ma przypisany typ „trafienia”, który bierze udział w obliczaniu HP. W poniższej tabeli wymieniono kości trafień dla każdej klasy.
Sorcerer: d6
Wizard: d6
Bard: d8
Cleric: d8
Druid: d8
Monk: d8
Rogue: d8
Warlock: d8
Fighter: d10
Paladin: d10
Ranger: d10
Barbarian: d12
Wreszcie poziom postaci. Wszystko to wpływa na to, ile razy należy dodać wartość do bieżącej sumy w poniższej sekcji. Poziom postaci to liczba całkowita od 1 do 20, w tym 1 . Twój kod nigdy nie będzie musiał obsługiwać poziomu spoza tego zakresu. Aby osiągnąć poziom n
, postać zaczyna od poziomu 1 i podnosi n-1
czasy. Na przykład postać poziomu 3 dotarła do miejsca, w którym się znajduje, będąc postacią poziomu 1 i dwukrotnie podnosząc poziom.
Jak obliczyć maksymalne HP
Maksymalne HP postaci jest równe jej HP na poziomie 1 plus suma wzrostu, jaki otrzymali na każdym poziomie.
Na poziomie 1
Na poziomie 1 HP postaci jest równe najwyższemu możliwemu rzutowi na jej kości trafienia (liczba w nazwie kości, dla tych z was, którzy nie znają kości, które mają więcej niż 6 stron) plus ich modyfikator Konstytucji. Pamiętaj, że obliczając HP na późniejszym poziomie, możesz założyć, że Konstytucja postaci zawsze była taka sama, ponieważ ta część obliczeń jest powtarzana za każdym razem, gdy zmienia się Konstytucja.
Podczas awansowania
Za każdym razem, gdy postać awansuje, mają dwie opcje. Mogą albo rzucić jedną ze swoich trafionych kości, albo wziąć średni wynik tej kości (zaokrąglony w górę). Cokolwiek wybiorą, ich modyfikator Konstytucji zostanie dodany do wyniku. Ta suma to kwota, którą zwiększa ich HP. W przypadku tego wyzwania zawsze wybierany jest średni rzut, więc wynik jest deterministyczny. (Ponownie, jeśli nie jesteś zaznajomiony z> 6-stronnymi kostkami, możesz obliczyć zaokrąglony średni rzut jako (highest_possible_roll / 2) + 1
.)
Jest jeden znaczący wyjątek. Maksymalne HP postaci zawsze wzrasta o co najmniej 1 za każdym razem, gdy awansuje o 2 . Jeśli instrukcje w powyższym akapicie spowodowałyby wzrost o 0 lub mniej podczas podwyższania, zamiast tego wzrosłyby o 1.
Wyzwanie
Twój program lub funkcja przyjmie trzy dane wejściowe :
- Klasa postaci jako ciąg
- Poziom postaci
- Wynik zdolności Konstytucji postaci ( bez modyfikatora)
Będzie wyjście tylko jedno: postać za prąd maksymalny HP.
Przykłady
Każda możliwa kombinacja wejść i powiązanych z nimi wyjść można znaleźć pod tym linkiem. Aby mieć na co spojrzeć na tej stronie, tutaj losowo wybieranych jest 30 przypadków testowych:
Barbarian, 15th level, 13 CON: 125
Rogue, 10th level, 18 CON: 93
Wizard, 15th level, 18 CON: 122
Wizard, 16th level, 1 CON: 16
Barbarian, 15th level, 7 CON: 80
Warlock, 15th level, 3 CON: 18
Ranger, 14th level, 1 CON: 18
Warlock, 3rd level, 14 CON: 24
Druid, 3rd level, 4 CON: 9
Cleric, 11th level, 5 CON: 25
Bard, 20th level, 11 CON: 103
Barbarian, 11th level, 13 CON: 93
Bard, 8th level, 19 CON: 75
Bard, 16th level, 17 CON: 131
Fighter, 10th level, 6 CON: 44
Monk, 10th level, 2 CON: 13
Cleric, 14th level, 17 CON: 115
Cleric, 6th level, 5 CON: 15
Rogue, 7th level, 13 CON: 45
Cleric, 4th level, 14 CON: 31
Rogue, 19th level, 15 CON: 136
Paladin, 13th level, 13 CON: 95
Cleric, 13th level, 15 CON: 94
Bard, 8th level, 5 CON: 19
Monk, 20th level, 11 CON: 103
Barbarian, 8th level, 20 CON: 101
Monk, 1st level, 4 CON: 5
Bard, 5th level, 17 CON: 43
Monk, 18th level, 7 CON: 57
Wizard, 17th level, 5 CON: 19
1. Ściśle mówiąc, nie sądzę, żeby istniała reguła, która mówi, że 20 to maksymalny poziom. Jednak 21 jest punktem, w którym przestają być tabele w książce, które mówią ci, jakie powinny być różne liczby w regułach, w tym ilość doświadczenia, które musisz zdobyć, aby je osiągnąć. To dla mnie wystarczający limit poziomu.
2. Właściwie nie sądzę, że tak jest w przypadku RAW. Zapytałem na rpg.se i nic takiego nie wydaje się być nigdzie zapisane. Jednak Mike Mearls, główny projektant D&D, napisał na Twitterze w marcu 2015 r . Nie jest to autorytatywny sposób, w jaki można argumentować tweeta od twórcy reguł wiodących, Jeremy'ego Crawforda, ale jest to dowód na to, że tak zamierzali, więc wykorzystam go do tego wyzwania.
Odpowiedzi:
Galaretka , 34 bajty
Pełny program z trzema argumentami wiersza poleceń: klasa, wynik, poziom.
Wypróbuj online!
W jaki sposób?
Środek kodu, oddzielony
ð
s, to diademiczne łącze, które oblicza wynik na podstawie niektórych wcześniej obliczonych wartości:Modyfikator jest obliczany po prawej stronie:
Połowę wartości matrycy oblicza się po lewej stronie:
Biorąc pod uwagę sumy porządkowe nazw klas modulo,
m
takie jakm
są minimalne, przy jednoczesnym utrzymywaniu klasyfikacji (według matrycy) przed kolidującymi wydajnościamim=15
. Umieszczenie wymaganych wartości (rzut pół-matrycą) przy tych indeksach na liście o długości 15 pozwala na wyszukiwanie przy użyciu modułowego indeksowania Jelly za pomocąị
. Kompresowanie listy jako liczby podstawowej 6 z pojedynczym6
zastąpionym przez a0
jest bajtem krótszym niż alternatywy kompresji base-7 lub kompresji base-4 i zwiększenie wartości (z narzutem związanym z użyciem dodatkowej wartości nilad w łańcuchu) . Dekompresję podstawy 6 zamiast 7 uzyskuje się, wykorzystując fakt, że dekompresja bazyṃ
(zamiast konwersji bazowejb
) ma domyślną konstrukcję zakresu, gdy jest to właściwy argument,r
, jest liczbą całkowitą, co oznacza, że jest jak konwersja do bazy,r
a następnie zamiana dowolnej wartości0
na „r
wszystko za jednym razem”.To jest:
Zmiana kolejności na liście, konwersja wartości 6 przy indeksie 13 na zero i minimalizacja w bazie 6:
Tworzenie kodu
źródło
JavaScript (ES6),
81787674 bajtówPobiera dane wejściowe jako (klasa, poziom, Constitution_ability_score) . Klasa nie rozróżnia wielkości liter.
Zasadniczo używa się tej samej matematyki, co moja początkowa wersja, ale d jest teraz obliczane bez żadnej tabeli odnośników.
Przypadki testowe
Pokaż fragment kodu
Pierwsza wersja,
8784 bajtówJak to działa
Trudną częścią jest konwersja ciągu klasy c na odpowiednie kości trafienia. Dokładniej, wartość, którą będziemy przechowywać, to d = kości / 2 + 1 .
Używamy formuły,
parseInt(c, 35) % 24 % 15
która daje:Wstawiając wartości d w odpowiednich pozycjach do łańcucha i dopełniając nieużywane miejsca zerami, otrzymujemy:
Stąd ostateczna formuła:
Kiedy mamy d , obliczamy:
czyli teoretyczna liczba punktów zdobytych na każdym poziomie.
Jeśli h jest dodatnie, po prostu obliczamy:
Jeśli nie, musimy wziąć pod uwagę fakt, że na każdym poziomie zdobywa się co najmniej 1 punkt. Zamiast tego obliczamy:
W obu przypadkach korygujemy wynik, dodając d - 2 , tak aby początkowa liczba punktów była poprawnie zintegrowana.
Przypadki testowe
Pokaż fragment kodu
źródło
Partia, 172 bajty
Bierze klasę, poziom i konstytucję jako argumenty wiersza poleceń. Objaśnienie: HP można obliczyć jako (HP na poziomie 1) + (poziom - 1) + min (kolejne HP na poziom, 0) * (poziom - 1). Dalsze HP na poziom to połowa trafionej kości plus modyfikator konstytucji. Większość klas używa d8, więc staje się to o mniej niż połowa konstytucji (
%3/2-1
), podczas gdy HP na poziomie 1 wynosi 3 więcej. Dalsze HP na poziom i HP na poziomie 1 są następnie korygowane dla sześciu klas, które nie używają d8. Dalsze HP na poziom jest następnie ograniczone do 0 (w rzeczywistości wykorzystuje to wartość ujemną, ponieważ w ten sposób jest nieco bardziej golfowy).źródło
R
181163 bajtówFunkcja anonimowa. Działa jako
f(class, level, CON)
.Objaśnienie: Tworzy wektory dla klasy
s
do kostki maks.d
, Używając 3 i 4 liter w nazwie klasy (najmniejsze unikalne mapowanie, jakie znalazłem).CON mod
m
jest prosto ze specyfikacji, a HP = pierwszy poziom (d + m
) + pozostałe poziomy ((n-1) * max(average_die + m, 1)
.źródło