Księga zaklęć czarnoksiężnika

10

Edycja : Nie grałem wcześniej w D&D, więc kiedy początkowo zadałem to pytanie, nie zbadałem go właściwie. Przepraszam za to i wprowadzam kilka zmian, które mogą unieważnić odpowiedzi, aby zachować jak największą zgodność z zasadami dnd 5e. Przepraszam.


Fan D&D z ostatniego Hot Network Question wydaje się mieć problem z ustaleniem, czy wybrane zaklęcia czarownika odpowiadają tym możliwościom - i myślę, że powinniśmy pomóc!

Wprowadzenie

(wszystko to jest już opisane we wcześniej wspomnianym pytaniu)

Czarownik zna dwa zaklęcia poziomu 1 od początku (poziom 1): [1, 1]

  • Za każdym razem, gdy czarownik zdobywa poziom (z wyjątkiem poziomów 12, 14, 16, 18, 19 i 20), uczą się nowego zaklęcia (obowiązkowe).

  • Dodatkowo, przy awansowaniu, możesz wybrać (opcjonalnie) zastąpienie jednego z zaklęć innym.

Zaklęcia wyuczone i zastąpione muszą być prawidłowym poziomem miejsca na zaklęcie, który jest o połowę wyższy od poziomu twojego czarownika. Zobacz tę tabelę:

Sorcerer level  Highest spell level possible
1               1
2               1
3               2
4               2
5               3
6               3
7               4
8               4
9               5
10              5
11              6
12              6
13              7
14              7
15              8
16              8
17              9
18              9
19              9
20              9

Oznacza to, że na poziomie 3 można mieć takie poziomy zaklęć [1, 1, 2, 2]:

Level 1: [1, 1] (initial)
Level 2: [1, 1, 1 (new)]
Level 3: [1, 1, 2 (replaced), 2 (new)]

Nie jest wymagane wybieranie zaklęć najwyższego poziomu, do których masz dostęp.

Poziomy zaklęć [1, 1, 1, 1]są doskonale ważne dla poziomu 3.

Na koniec pamiętaj, że zastąpienie zaklęcia jest opcjonalną opcją na każdym poziomie . Oznacza to, że niektóre poziomy mogą pominąć zamianę, podczas gdy inne z niej korzystają.

Wyzwanie

Stwórz program lub funkcję, która przyjmuje liczbę całkowitą (poziom) od 1 do 20.

Powinien także przyjmować tablicę liczb całkowitych (poziomów zaklęć) o wartościach od 1 do 9 w dowolnej kolejności (9 to maksymalny poziom zaklęcia).

Dane wyjściowe programu powinny być zgodne z prawdą / fałszem, sprawdzając, czy wybrane poziomy zaklęć są ważne dla czarodzieja danego poziomu.

Przypadki testowe

Level: 1
Spells: [1, 1]
Output: true

Level: 8
Spells: [1, 1, 2, 3, 3, 5]
Ouput: false

Reason: A level 8 can't ever have access to a level 5 spell.

Level: 5
Spells: [1, 1, 1, 2, 2, 2, 3]
Output: false

Reason: A level 5 can't have access to 7 spells

Level: 11
Spells: [3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6]
Output: false

Reason: Too many spell upgrades.
        The highest valid selection for level 11 is
        [3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6]

To jest - wygrywa najmniej bajtów!

Daniel
źródło
1
Czy możemy posortować listę zaklęć w taki sposób, w jaki chcemy?
Veskah
Jaki jest maksymalny poziom czaru dla każdego poziomu klasy?
Nitrodon,
@Nitrodon Zakładam 19?
Don Thousand
@Nitrodon, prawdopodobnie jest to 9, biorąc pod uwagę, że dane wejściowe tablicy mogą zawierać tylko „ wartości od 1 do 9 ”, ale maksymalny poziom zaklęcia, którym musimy się posługiwać, powinien być bardziej precyzyjnie określony w specyfikacji. I może to zrobić z kilkoma kolejnymi przypadkami testowymi. W przeciwnym razie miłe wyzwanie.
Shaggy,
4
1. „Powinien także przyjmować tablicę liczb całkowitych (poziomów zaklęć) o wartościach od 1 do 9 (w dowolnej kolejności)” - a co z poziomami 10–19? 2. „Jednak na poziomie 4 poziomy zaklęć [2,2,3,3]nie byłyby możliwe, ponieważ wymagają więcej zamiany, niż czarodziej z tego poziomu miałby dostęp” - czy fakt, że lista ma długość 4 zamiast 5, nie jest tutaj bardziej fundamentalnym powodem? (Zakładam, że [1,3,2,2,3]możliwe jest przejście na poziom 4 z poziomu 3 [1,1,2(replaced),2(new)]na [1,3(replaced),2,2,3(new)]?)
Jonathan Allan,

Odpowiedzi:

5

Java (JDK 10) , 191 bajtów

L->S->{int m[]=new int[9],z=0,Z=0,l=0;for(m[0]++;l++<L;z+=--m[z]<1?1:0)m[Z=~-l/2-l/19]+=l<12?2:l>17?1:1+l%2;l=0;for(int s:S){if(--s>Z)l++;Z-=--m[Z>0?Z:0]<1?1:0;}for(int i:m)l|=i;return l==0;}

Wypróbuj online!

  • Wymagania wejściowe: lista zaklęć musi być uporządkowana od najwyższych poziomów do najniższych.

Objaśnienia

L->S->{                                        // Curried-lambda with 2 parameters: sorcerer-level and spell list
 int m[]=new int[9],                           // Declare variables: m is the max level  of each spell.
     z=0,                                      // z is the minimum spell level of the maximized spell list.
     Z=0,                                      // Z is the maximum spell level for the current level.
     l=0;                                      // l is first a level counter, then a reused variable
 for(m[0]++;l++<L;z+=--m[z]<1?1:0)             // for each level, compute the maximized known spells.
  m[Z=~-l/2-l/19]+=l<12?2:l>17?1:1+l%2;        // 
                                               // Now m is the row for level L in the table below.
 l=0;                                          // l now becomes an error indicator
 for(int s:S){                                 // This loop checks if the spell-list matches the spells allowed for that level.
  if(--s>Z)l++;                                // Spell-levels are 1-based, my array is 0-based so decrease s.
  Z-=--m[Z>0?Z:0]<1?1:0;                       // Remove a max level if we've expleted all the spells, avoiding exception.
 }                                             //
 for(int i:m)l|=i;                             // Make sure there are no more values in m.
 return l==0;                                  // Return true if no miscount were encountered.
}

Tabela 1: Maksymalny rozkład zaklęć dla każdego poziomu czarownika, wykorzystany w odpowiedzi Axorena na powiązane pytanie .

wprowadź opis zdjęcia tutaj

Kredyty

Olivier Grégoire
źródło
1
return l<1&java.util.Arrays.equals(m,new int[9]);może być z=0;for(int i:m)z+=i;return l+z==0;zamiast. Lub jeśli wartości w mnigdy nie mogą być ujemne na końcu, ==0mogą być <1.
Kevin Cruijssen
@KevinCruijssen Thanks! I ten pokój pozostawił do naprawienia błędu ze zbyt dużą liczbą zaklęć na liście.
Olivier Grégoire,
Ach, for(int i:m)l|=i;jest jeszcze mądrzejszy! Niezłe.
Kevin Cruijssen
Jestem pewien, że dwie ostatnie pętle można połączyć, ale nie wiem jak teraz.
Olivier Grégoire,
1
@CameronAavik Prawdopodobnie przekazałeś go z liczbami uporządkowanymi rosnąco ( new int[]{5,6,6,6,7,7,7,8,8,8,9,9,9,9,9}). Jeśli wprowadzę je malejąco ( new int[]{9,9,9,9,9,8,8,8,7,7,7,6,6,6,5}jak napisano w wymaganiu wejściowym, które napisałem poniżej golfa), to zadziała. Dodałem skrzynkę testową, aby pokazać, że rzeczywiście działa.
Olivier Grégoire,
2

Python 3 , 98 bajtów

v=lambda L,S:(max(S)*2-2<L)&v(L-1,[1]+sorted(S)[:(chr(L*3)in'$*069<')-2])if L>1else(1,1)==tuple(S)

Wypróbuj online!

Nie golfowany:

def v(L, S):
    # recursion base case
    if L <= 1:
        return tuple(S) == (1, 1)
    # if the highest level skill is not valid for the level, then return False.
    if max(S)*2 - 2 < L:
        return False
    # hacky way to determine if the level gets a new skill
    has_new_skill = chr(L*3) in '$*069<'
    sorted_skills = sorted(S)
    # this step removes the highest skill and adds a level 1 skill (replacement)
    # if there is a new skill, then it removes the second highest skill as well
    new_skills = [1] + sorted_skills[:has_new_skill - 2]
    return v(L-1, new_skills)

edycja: poprawione rozwiązanie w celu użycia poprawnych reguł D&D

Cameron Aavik
źródło
Daję +1, choć print(v(20, [6,6,6,6,7,7,7,8,8,8,9,9,9,9,9])) # Falsedrukowane są prawdziwe. Powinien zostać wydrukowany fałsz.
Olivier Grégoire,
@ OlivierGrégoire Korzystam z zasad OP dla poziomów umiejętności obowiązujących w dostarczonym kodzie. Zobacz notatkę na dole postu, która pokazuje modyfikację, aby wprowadzić rzeczywiste reguły DnD.
Cameron Aavik,
Och, mój zły. Przepraszam. Dane wyjściowe są poprawne z tą zmianą.
Olivier Grégoire,
Cóż, jest ustalone: ​​należy stosować zasadę D&D, a nie tę min(9,n-1).
Olivier Grégoire,
1

Węgiel drzewny , 51 bajtów

Nθ≔⁺✂⭆”)⊟⊞<⁴H”×IκIιθ⎇‹θ¹²⊕⊗θ⁺⁶⁺θ⊘⁺‹θ¹⁹θ¹0θ¬ΣES›ι§θκ

Wypróbuj online! Link jest do pełnej wersji kodu. Ustawia poziomy pisowni w kolejności rosnącej jako ciąg znaków. Wyjaśnienie:

Nθ

Wprowadź poziom.

≔⁺✂⭆”)⊟⊞<⁴H”×IκIιθ⎇‹θ¹²⊕⊗θ⁺⁶⁺θ⊘⁺‹θ¹⁹θ¹0θ

Wykonaj dekodowanie długości ciągu na łańcuchu, 0544443335co spowoduje powstanie łańcucha 11111222233334444555566677788899999. Łańcuch ten jest następnie krojony, zaczynając od poziomu (1-indeksowany) i kończąc na poziomie podwójnym (jeśli mniej niż 12) lub 6 + 1,5 *, zaokrąglonym w górę, z wyjątkiem poziomu 19, który jest zaokrąglany w dół. 0Przyrostek A zapewnia, że ​​nie ma zbyt wielu zaklęć.

¬ΣES›ι§θκ

Porównaj poziomy zaklęć z podciągiem i wypisuje, -jeśli żaden z nich nie jest nadmierny.

Neil
źródło
Myślę, że nie udaje się to w przypadku długości mniejszych niż muszą, ponieważ uważam, że pozyskiwanie zaklęć jest obowiązkowe na poziomach nie wymienionych; Poprosiłem jednak o wyjaśnienia.
Jonathan Allan,
Wydaje się również zawieść 11113na poziomie, 4który jest wynikiem braku opcjonalnych ulepszeń, biorąc 1na poziomie 2, 1na poziomie 3 i 3na poziomie 4.
Jonathan Allan
@JonathanAllan Twój maksymalny poziom czaru to pułap połowy twojego poziomu postaci (lub 9, ponieważ jest to maksymalny możliwy poziom). Może pytanie nie wyjaśniało tego.
Neil,
(Zasadniczo podążyłem za odpowiedziami w połączonym pytaniu, jakie są możliwe poziomy zaklęć).
Neil
Nie chcę próbować zrozumieć i pogodzić dwóch specyfikacji, PO potwierdziło min (9, n-1) w komentarzach. Może zapytaj o to tam ...
Jonathan Allan,
0

JavaScript (ES6), 79 bajtów

(level)(array)01

l=>a=>!a.some(x=>x>(j--,++l>30?9:l+(l<25?2:4)>>2),j=l<12?l:l>16?14:l+11>>1)&!~j

Wypróbuj online!

Kod testowy

Poniżej znajduje się link do jakiegoś kodu testowego, który przyjmuje poziom czarownika jako dane wejściowe i zwraca tablicę maksymalnych poziomów zaklęć, używając tej samej logiki co powyższa funkcja.

Wypróbuj online!

W jaki sposób?

Tabela referencyjna

 Sorcerer level | # of spells | Maximum spell levels          
----------------+-------------+-------------------------------
        1       |      2      | 1,1                           
        2       |      3      | 1,1,1                         
        3       |      4      | 1,1,2,2                       
        4       |      5      | 1,2,2,2,2                     
        5       |      6      | 2,2,2,2,3,3                   
        6       |      7      | 2,2,2,3,3,3,3                 
        7       |      8      | 2,2,3,3,3,3,4,4               
        8       |      9      | 2,3,3,3,3,4,4,4,4             
        9       |     10      | 3,3,3,3,4,4,4,4,5,5           
       10       |     11      | 3,3,3,4,4,4,4,5,5,5,5         
       11       |     12      | 3,3,4,4,4,4,5,5,5,5,6,6       
       12       |     12      | 3,4,4,4,4,5,5,5,5,6,6,6       
       13       |     13      | 4,4,4,4,5,5,5,5,6,6,6,7,7     
       14       |     13      | 4,4,4,5,5,5,5,6,6,6,7,7,7     
       15       |     14      | 4,4,5,5,5,5,6,6,6,7,7,7,8,8   
       16       |     14      | 4,5,5,5,5,6,6,6,7,7,7,8,8,8   
       17       |     15      | 5,5,5,5,6,6,6,7,7,7,8,8,8,9,9 
       18       |     15      | 5,5,5,6,6,6,7,7,7,8,8,8,9,9,9 
       19       |     15      | 5,5,6,6,6,7,7,7,8,8,8,9,9,9,9 
       20       |     15      | 5,6,6,6,7,7,7,8,8,8,9,9,9,9,9 

Liczba zaklęć

L.N.L.

N.L.={L.+1gdyby L.<12(L.+13)/2)gdyby 12L.1615gdyby L.>16

jotN.L.-1-1

Maksymalne poziomy zaklęć

L.1jaN.L.M.L.,jaja

M.L.,ja={(L.+ja+2))/4gdyby L.+ja<25(L.+ja+4)/4gdyby 25L.+ja309gdyby L.+ja>30

xza

Arnauld
źródło
0

Groovy , 155 bajtów

def f(int[]a, int b){l=[1]
b.times{n->l[0]=++n%2?n/2+1:n/2
if(n<18&(n<12|n%2>0))l.add(l[0])
l.sort()}
for(i=0;i<a.size();)if(a[i]>l[i++])return false
true}

Generuje najlepszą możliwą księgę czarów, a następnie sprawdza, czy księga czarów przekazana do metody nie jest lepsza.

Niegolfowane, z jawnymi typami niejawnymi:

boolean spellChecker(int[] a, int b) {
    // l will be our best possible spellbook
    List<BigDecimal> l = [1]
    b.times { n ->
        n++ // iterate from 1 to b, not 0 to b-1
        l[0] = n % 2 != 0 ? n / 2 + 1 : n / 2 // update the lowest value to the best permitted
        if (n < 18 & (n < 12 | n % 2 > 0))
            l.add(l[0]) // if permitted, add another best spell
        l.sort() // ensure 0th position is always worst, ready for updating next loop
    }
    for (int i = 0; i < a.size(); i++)
        if (a[i] > l[i]) // if the submitted spell is of a higher level
            return false // also rejects when l[i] is undefined. (too many spells)
    return true
}

Wypróbuj online!

archangel.mjj
źródło