Il libro degli incantesimi di uno stregone


10

Modifica : non avevo mai giocato a D&D prima, quindi quando inizialmente ho fatto questa domanda non l'ho cercata correttamente. Mi scuso per questo, e sto apportando alcune modifiche che potrebbero invalidare le risposte per rimanere il più vero possibile alle regole del dnd 5e. Scusate.


Un fan di D&D di una recente domanda su Hot Network sembra avere qualche problema nel capire se gli incantesimi scelti da uno stregone si allineano alle possibilità - e penso che dovremmo aiutare!

introduzione

(tutto ciò è già descritto nella domanda precedentemente citata)

Uno stregone conosce due incantesimi di livello 1 dall'inizio (livello 1): [1, 1]

  • Ogni volta che uno stregone ottiene un livello (tranne i livelli 12, 14, 16, 18, 19 e 20) imparano un nuovo incantesimo (obbligatorio).

  • Inoltre, quando si sale di livello, si può scegliere (facoltativo) di sostituire uno degli incantesimi con un altro.

Gli incantesimi appresi e sostituiti devono essere un livello di slot incantesimo valido pari alla metà del livello del tuo stregone arrotondato per eccesso. Vedi questa tabella:

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

Questo significa che al livello 3 si possono avere i livelli di incantesimi [1, 1, 2, 2]come questo:

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

Non è necessario scegliere gli incantesimi di livello più alto a cui hai accesso.

I livelli degli incantesimi [1, 1, 1, 1]sono perfettamente validi per un livello 3.

Infine, ricorda che la sostituzione di un incantesimo è un'opzione opzionale per ogni livello . Ciò significa che alcuni livelli potrebbero saltare la sostituzione, mentre altri ne fanno uso.

La sfida

Crea un programma o una funzione che richiede un numero intero (livello) tra 1 e 20.

Dovrebbe anche prendere un array di numeri interi (livelli di incantesimo) con valori che vanno da 1 a 9 in qualsiasi ordine (9 è il livello di incantesimo massimo).

L'output del programma dovrebbe essere un valore di verità / falsità che convalida se i livelli di incantesimo scelti sono validi per uno stregone di un determinato livello.

Casi test

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]

Questo è - vince meno byte!


1
Possiamo prendere la lista degli incantesimi ordinata come la vogliamo?
Veskah,

Qual è il livello massimo di incantesimo per ogni livello di classe?
Nitrodon,

@Nitrodon Presumo 19?
Don mille,

@Nitrodon, presumibilmente è 9 dato che l'input dell'array può contenere solo " valori compresi tra 1 e 9 ", ma il livello massimo di incantesimo che dobbiamo gestire dovrebbe essere indicato più esplicitamente nelle specifiche. E potrebbe fare con un altro paio di casi di test. Bella sfida, altrimenti.
Shaggy,

4
1. "Dovrebbe anche prendere un array di numeri interi (livelli di incantesimo) con valori compresi tra 1 e 9 (in qualsiasi ordine)" - che dire dei livelli 10-19? 2. "Tuttavia, al livello 4 i livelli degli incantesimi [2,2,3,3]non sarebbero possibili in quanto richiedono più sostituzioni di quelle a cui uno stregone di quel livello avrebbe accesso." - Il fatto che la lista sia lunghezza 4 piuttosto che 5 non è una ragione più fondamentale qui? (Suppongo [1,3,2,2,3]sia possibile per un livello 4 passando dal livello 3 [1,1,2(replaced),2(new)]a [1,3(replaced),2,2,3(new)]?)
Jonathan Allan,

Risposte:


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

Provalo online!

  • Requisito di input: l'elenco degli incantesimi deve essere ordinato dal livello dell'incantesimo massimo a quello più basso.

spiegazioni

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

Tabella 1: distribuzione degli incantesimi massimizzata per ogni livello di stregone, usata dalla risposta di Axoren sulla domanda collegata .

inserisci qui la descrizione dell'immagine

Crediti


1
return l<1&java.util.Arrays.equals(m,new int[9]);può essere z=0;for(int i:m)z+=i;return l+z==0;invece. O se i valori in mnon possono mai essere negativi alla fine, ==0può essere <1.
Kevin Cruijssen,

@KevinCruijssen Grazie! E questo ha lasciato spazio per correggere un bug con troppi incantesimi nell'elenco.
Olivier Grégoire,

Ah, for(int i:m)l|=i;è ancora più intelligente! Ben fatto.
Kevin Cruijssen,

Sono sicuro che gli ultimi due loop possono essere combinati, non so proprio come adesso.
Olivier Grégoire,

1
@CameronAavik Probabilmente lo hai superato con i numeri ordinati in ordine crescente ( new int[]{5,6,6,6,7,7,7,8,8,8,9,9,9,9,9}). Se li inserisco in ordine decrescente ( new int[]{9,9,9,9,9,8,8,8,7,7,7,6,6,6,5}, come scritto nel requisito di input che ho scritto sotto il golf), funziona. Ho aggiunto il test case per dimostrare che funziona davvero.
Olivier Grégoire,

2

Python 3 , 98 byte

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)

Provalo online!

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)

modifica: soluzione corretta per utilizzare le regole D&D corrette


Ho fatto +1, anche se le print(v(20, [6,6,6,6,7,7,7,8,8,8,9,9,9,9,9])) # Falsestampe sono vere. Dovrebbe essere stampato falso.
Olivier Grégoire,

@ OlivierGrégoire Sto usando le regole OP per quali livelli di abilità sono validi nel codice fornito. Vedi la nota in fondo al post che mostra la modifica da apportare per utilizzare le reali regole DnD.
Cameron Aavik,

Oh mio Dio. Scusate. L'output è corretto con quella modifica.
Olivier Grégoire,

Bene, è risolto: è la regola D&D che deve essere applicata, non min(9,n-1)quella.
Olivier Grégoire,

1

Carbone , 51 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Prende i livelli degli incantesimi in ordine crescente come stringa. Spiegazione:

Nθ

Inserisci il livello.

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

Esegue la decodifica della lunghezza della stringa 0544443335risultante nella stringa 11111222233334444555566677788899999. Questa stringa viene quindi suddivisa a partire dal livello (1 indicizzato) e termina al livello raddoppiato (se inferiore a 12) o 6 + 1,5 *, arrotondato per eccesso, ad eccezione del livello 19, che viene arrotondato per difetto. È 0sufficiente A per assicurarsi che non ci siano troppi incantesimi.

¬ΣES›ι§θκ

Confronta i livelli degli incantesimi con la sottostringa e stampa a -se nessuno di essi è eccessivo.


Penso che ciò fallisca per lunghezze inferiori a quelle che devono essere, poiché ritengo che l'acquisizione degli incantesimi sia obbligatoria ai livelli non elencati; Ho chiesto chiarimenti però.
Jonathan Allan,

Sembra anche fallire 11113a livello, 4che è il risultato di nessun aggiornamento opzionale, che prende 1a livello 2, 1a livello 3 e 3, a livello 4.
Jonathan Allan

@JonathanAllan Il tuo livello massimo di incantesimo è il limite massimo della metà del livello del tuo personaggio (o 9, dato che è il massimo possibile). Forse la domanda non è stata chiara.
Neil,

(Fondamentalmente ho seguito le risposte alla domanda collegata su quali sono i possibili livelli di incantesimo.)
Neil

Non voglio provare a capire e riconciliare due specifiche, l'OP ha confermato min (9, n-1) nei commenti. Forse chiedilo qui ...
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

Provalo online!

Codice di prova

Di seguito è riportato un collegamento ad alcuni codici di prova che accetta come input il livello di stregone e restituisce una matrice di livelli di incantesimo massimi, utilizzando la stessa logica della funzione sopra.

Provalo online!

Come?

Tabella di riferimento

 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 

Numero di incantesimi

LNL

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

jNL11

Livelli di incantesimo massimi

L1iNLML,ii

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

xa


0

Groovy , 155 byte

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}

Genera il miglior libro degli incantesimi, quindi controlla che il libro degli incantesimi passato nel metodo non sia migliore.

Ungolfed, con tipi impliciti resi espliciti:

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
}

Provalo online!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.