Das Zauberbuch eines Zauberers

10

Bearbeiten : Ich habe D & D noch nie gespielt. Als ich diese Frage zum ersten Mal stellte, habe ich sie nicht richtig recherchiert. Ich entschuldige mich dafür und nehme einige Änderungen vor, die die Antworten ungültig machen könnten, um den dnd 5e-Regeln so treu wie möglich zu bleiben. Es tut uns leid.


Ein D & D-Fan aus einer aktuellen Hot Network-Frage scheint Schwierigkeiten zu haben, herauszufinden, ob die von einem Zauberer gewählten Zaubersprüche mit den Möglichkeiten übereinstimmen - und ich denke, wir sollten helfen!

Einführung

(All dies ist bereits in der zuvor genannten Frage beschrieben)

Ein Zauberer kennt von Anfang an zwei Zaubersprüche der Stufe 1 (Stufe 1): [1, 1]

  • Jedes Mal, wenn ein Zauberer eine Stufe erreicht (mit Ausnahme der Stufen 12, 14, 16, 18, 19 und 20), lernt er einen neuen Zauber (obligatorisch).

  • Außerdem, wenn man wählen (optional) Nivellierung kann ersetzen eine der Zauber mit einem anderen.

Die gelernten und ersetzten Zaubersprüche müssen eine gültige Zauberslot-Stufe sein, die die Hälfte der aufgerundeten Stufe Ihres Zauberers ist. Siehe diese Tabelle:

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

Dies bedeutet, dass man auf Stufe 3 die folgenden Zauberstufen haben kann [1, 1, 2, 2]:

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

Es ist nicht erforderlich, die Zaubersprüche der höchsten Stufe auszuwählen, auf die Sie Zugriff haben.

Die Zauberstufen [1, 1, 1, 1]gelten perfekt für Stufe 3.

Denken Sie zum Schluss daran, dass das Ersetzen eines Zaubers eine optionale Option für jedes Level ist . Dies bedeutet, dass einige Ebenen das Ersetzen überspringen können, während andere davon Gebrauch machen.

Die Herausforderung

Erstellen Sie ein Programm oder eine Funktion, die eine Ganzzahl (Ebene) zwischen 1 und 20 annimmt.

Es sollte auch ein Array von ganzen Zahlen (Zauberstufen) mit Werten zwischen 1 und 9 in beliebiger Reihenfolge verwendet werden (9 ist die maximale Zauberstufe).

Die Ausgabe des Programms sollte ein Wahrheits- / Falschwert sein, der überprüft, ob die gewählten Zauberstufen für einen Zauberer der gegebenen Stufe gültig sind.

Testfälle

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]

Das ist - die wenigsten Bytes gewinnen!

Daniel
quelle
1
Können wir die Zauberliste so sortieren, wie wir es wollen?
Veskah
Was ist die maximale Zauberstufe für jede Klassenstufe?
Nitrodon
@ Nitrodon Ich nehme an 19?
Don Thousand
@Nitrodon, vermutlich ist es 9, da die Array-Eingabe nur " Werte zwischen 1 und 9 " enthalten kann, aber die maximale Zauberstufe, die wir behandeln müssen, sollte in der Spezifikation expliziter angegeben werden. Und es könnte noch ein paar Testfälle gebrauchen. Ansonsten schöne Herausforderung.
Shaggy
4
1. "Es sollte auch eine Reihe von ganzen Zahlen (Zauberstufen) mit Werten zwischen 1 und 9 (in beliebiger Reihenfolge) erforderlich sein" - was ist mit den Stufen 10-19? 2. "Auf Stufe 4 [2,2,3,3]wären die Zauberstufen jedoch nicht möglich, da mehr Ersatz erforderlich ist, als ein Zauberer dieser Stufe Zugriff haben würde." - Ist die Tatsache, dass die Liste eher Länge 4 als 5 hat, hier kein grundlegenderer Grund? (Ich nehme an, dass [1,3,2,2,3]es für ein Level 4 möglich ist, von Level 3 [1,1,2(replaced),2(new)]zu [1,3(replaced),2,2,3(new)]?)
Jonathan Allan

Antworten:

5

Java (JDK 10) , 191 Byte

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

Probieren Sie es online aus!

  • Eingabeanforderung: Die Zauberliste muss von der höchsten bis zur niedrigsten Zauberstufe geordnet werden.

Erklärungen

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.
}

Tabelle 1: Maximierte Zauberverteilung für jede Zaubererstufe, verwendet aus Axorens Antwort auf die verknüpfte Frage .

Geben Sie hier die Bildbeschreibung ein

Credits

Olivier Grégoire
quelle
1
return l<1&java.util.Arrays.equals(m,new int[9]);kann z=0;for(int i:m)z+=i;return l+z==0;stattdessen sein. Oder wenn die Werte in mam Ende niemals negativ sein ==0können , kann dies sein <1.
Kevin Cruijssen
@ KevinCruijssen Danke! Und das ließ Raum, um einen Fehler mit zu vielen Zaubersprüchen in der Liste zu beheben.
Olivier Grégoire
Ah, for(int i:m)l|=i;ist noch schlauer! Schön.
Kevin Cruijssen
Ich bin mir sicher, dass die letzten beiden Loops kombiniert werden können. Ich weiß nur nicht, wie.
Olivier Grégoire
1
@CameronAavik Sie haben es wahrscheinlich mit aufsteigenden Zahlen ( new int[]{5,6,6,6,7,7,7,8,8,8,9,9,9,9,9}) bestanden. Wenn ich sie absteigend eingebe ( new int[]{9,9,9,9,9,8,8,8,7,7,7,6,6,6,5}wie in der Eingabeanforderung geschrieben, die ich unter dem Golf geschrieben habe), funktioniert es. Ich habe den Testfall hinzugefügt, um zu zeigen, dass er tatsächlich funktioniert.
Olivier Grégoire
2

Python 3 , 98 Bytes

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)

Probieren Sie es online aus!

Ungolfed:

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)

edit: korrigierte Lösung zur Verwendung korrekter D & D-Regeln

Cameron Aavik
quelle
Ich + 1'ed, obwohl print(v(20, [6,6,6,6,7,7,7,8,8,8,9,9,9,9,9])) # FalseDrucke wahr. Es sollte false ausgeben.
Olivier Grégoire
@ OlivierGrégoire Ich verwende die OP-Regeln für die im angegebenen Code gültigen Fähigkeitsstufen. Siehe den Hinweis am Ende des Beitrags, in dem die Änderungen aufgeführt sind, die vorgenommen werden müssen, um die tatsächlichen DnD-Regeln zu verwenden.
Cameron Aavik
Oh mein schlechtes. Es tut uns leid. Die Ausgabe ist mit dieser Änderung korrekt.
Olivier Grégoire
Nun, es ist geklärt: Es ist die D & D-Regel, die angewendet werden muss, nicht die min(9,n-1).
Olivier Grégoire
1

Holzkohle , 51 Bytes

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

Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Nimmt Zauberstufen in aufsteigender Reihenfolge als Zeichenfolge. Erläuterung:

Nθ

Geben Sie den Pegel ein.

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

Führen Sie eine Lauflängendecodierung für die Zeichenfolge 0544443335durch, die zur Zeichenfolge führt 11111222233334444555566677788899999. Diese Zeichenfolge wird dann beginnend mit der Ebene (1-indiziert) geschnitten und endet mit der doppelten Ebene (wenn weniger als 12) oder 6 + 1,5 *, aufgerundet, mit Ausnahme der Ebene 19, die abgerundet ist. A 0wird mit einem Suffix versehen, um sicherzustellen, dass nicht zu viele Zaubersprüche vorhanden sind.

¬ΣES›ι§θκ

Vergleichen Sie die Zauberstufen mit der Teilzeichenfolge und drucken Sie a, -wenn keine davon übermäßig ist.

Neil
quelle
Ich denke, dass dies bei Längen fehlschlägt, die geringer sind als sie sein müssen, da ich denke, dass der Erwerb von Zaubersprüchen auf den nicht aufgeführten Ebenen obligatorisch ist. Ich habe jedoch um Klarstellung gebeten.
Jonathan Allan
Scheint auch 11113auf Stufe zu scheitern, 4was das Ergebnis keiner optionalen Upgrades ist, die 1auf Stufe 2, 1Stufe 3 und 3Stufe 4 durchgeführt werden.
Jonathan Allan
@JonathanAllan Deine maximale Zauberstufe ist die Obergrenze der Hälfte deiner Charakterstufe (oder 9, da dies die maximal mögliche Stufe ist). Vielleicht hat die Frage das nicht klar gemacht.
Neil
(Grundsätzlich habe ich die Antworten in der verknüpften Frage befolgt, was die möglichen Zauberstufen sind.)
Neil
Ich möchte nicht versuchen, zwei Spezifikationen zu verstehen und in Einklang zu bringen. Das OP hat min (9, n-1) in Kommentaren bestätigt. Vielleicht fragen Sie dies dort ...
Jonathan Allan
0

JavaScript (ES6), 79 Byte

(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

Probieren Sie es online aus!

Testcode

Unten finden Sie einen Link zu einem Testcode, der die Zaubererstufe als Eingabe verwendet und ein Array maximaler Zauberstufen zurückgibt, wobei dieselbe Logik wie bei der obigen Funktion verwendet wird.

Probieren Sie es online aus!

Wie?

Referenztabelle

 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 

Anzahl der Zauber

LNL

NL={L+1if L<12(L+13)/2if 12L1615if L>16

jNL11

Maximale Zauberstufe

L1iNLML,ii

ML,i={(L+i+2)/4if L+i<25(L+i+4)/4if 25L+i309if L+i>30

xa

Arnauld
quelle
0

Groovy , 155 Bytes

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}

Erzeugt das bestmögliche Zauberbuch und überprüft dann, ob das an die Methode übergebene Zauberbuch nicht besser ist.

Ungolfed, mit explizit angegebenen impliziten Typen:

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
}

Probieren Sie es online aus!

archangel.mjj
quelle