Заклинання чарівника


10

Редагувати : Я раніше не грав у науково-дослідну діяльність, тому коли я спочатку ставив це питання, я не вивчив його належним чином. Прошу вибачення за це, і я вношу кілька змін, які можуть визнати недійсними відповіді, щоб залишатися максимально правдивими щодо правил dnd 5e. Вибачте.


У прихильника науково-дослідної роботи з недавнього питання про гарячу мережу, здається, виникають певні труднощі при розробці того, чи вибрані заклинання чаклуна відповідають можливостям - і я думаю, що ми повинні допомогти!

Вступ

(усе це вже описано в раніше згаданому питанні)

Чарівник знає два заклинання рівня 1 від початку (рівень 1): [1, 1]

  • Щоразу, коли чаклун набирає рівня (крім рівнів 12, 14, 16, 18, 19 і 20), вони вивчають нове заклинання (обов’язкове).

  • Крім того, під час вирівнювання можна вибрати (необов’язково) замінити одне з заклинань іншим.

Написані та замінені заклинання повинні бути дійсним рівнем слота заклинання, який наполовину перевищує рівень вашого чаклуна. Дивіться цю таблицю:

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

Це означає, що на рівні 3 можна мати такі рівні заклинань [1, 1, 2, 2]:

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

Вибирати заклинання найвищого рівня, до яких ви маєте доступ, не потрібно.

Рівні заклинань [1, 1, 1, 1]цілком справедливі для рівня 3.

Нарешті, пам’ятайте, що заміна заклинання - необов’язковий варіант для кожного рівня . Це означає, що деякі рівні можуть пропустити заміну, а інші використовують її.

Змагання

Складіть програму або функцію, яка займає ціле число (рівень) між 1 і 20.

Він також повинен приймати масив цілих чисел (рівні заклинань) зі значеннями від 1 до 9 в будь-якому порядку (9 - максимальний рівень заклинання).

Вихід програми повинен мати значення truthy / false, що підтверджує, якщо обрані рівні заклинання дійсні для чаклуна даного рівня.

Тестові справи

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]

Це - найменша кількість байтових виграшів!


1
Чи можемо ми взяти список заклинань, відсортований так, як ми цього хочемо?
Веська

Який максимальний рівень заклинання для кожного рівня класу?
Nitrodon

@Nitrodon Я вважаю, що 19?
Дон Тисяча

@Nitrodon, імовірно, це 9, враховуючи, що вхід масиву може містити лише " значення, що варіюються від 1 до 9 ", але максимальний рівень заклинання, з яким ми маємо працювати, повинен бути чіткіше вказаний у специфікації. І це могло б зробити ще з декількома тестовими випадками. Приємний виклик, інакше.
Кудлатий

4
1. "Він також повинен приймати масив цілих чисел (рівні заклинань) зі значеннями в межах від 1 до 9 (у будь-якому порядку)" - що з рівнями 10-19? 2. "Однак на рівні 4 рівень заклинання [2,2,3,3]не буде можливим, оскільки він потребує більшої заміни, ніж чарівник цього рівня матиме доступ." - Чи не факт, що список є довжиною 4, а не 5, є більш фундаментальною причиною тут? (Я припускаю, що [1,3,2,2,3]це можливо для рівня 4, переходячи від рівня 3 [1,1,2(replaced),2(new)]до [1,3(replaced),2,2,3(new)]?)
Джонатан Аллан

Відповіді:


5

Java (JDK 10) , 191 байт

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

Спробуйте в Інтернеті!

  • Вимога введення: список заклинань повинен бути упорядкований від найбільшого рівня заклинань до найнижчого.

Пояснення

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

Таблиця 1: Максимальний розподіл заклинань для кожного рівня чаклуна, використаний з відповіді Аксорена на пов'язане питання .

введіть тут опис зображення

Кредити


1
return l<1&java.util.Arrays.equals(m,new int[9]);може бути z=0;for(int i:m)z+=i;return l+z==0;замість цього. Або якщо значення в mніколи не можуть бути негативними в кінці, то ==0можуть бути <1.
Кевін Кройсейсен

@KevinCruijssen Дякую! І це залишене приміщення, щоб виправити помилку із занадто великою кількістю заклинань у списку.
Олів'є Грегоар

Ах, for(int i:m)l|=i;ще розумніша! Хороший.
Кевін Кройсейсен

Я впевнений, що останні дві петлі можна комбінувати, я просто не знаю, як зараз.
Олів'є Грегоар

1
@CameronAavik Ви, ймовірно, передали його з номерами, упорядкованими у бік зростання ( new int[]{5,6,6,6,7,7,7,8,8,8,9,9,9,9,9}). Якщо я ввожу їх у зменшенні ( new int[]{9,9,9,9,9,8,8,8,7,7,7,6,6,6,5}як написано у вимозі введення, яку я написав нижче поля для гольфу), це працює. Я додав тестовий випадок, щоб показати, що він справді працює.
Олів'є Грегоар

2

Python 3 , 98 байт

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)

Спробуйте в Інтернеті!

Безголівки:

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)

редагувати: виправлене рішення для використання правильних D&D правил


Я + 1'ed, хоча print(v(20, [6,6,6,6,7,7,7,8,8,8,9,9,9,9,9])) # Falseдрукує правду. Він повинен друкувати помилково.
Олів'є Грегоар

@ OlivierGrégoire Я використовую правила OP для того, які рівні кваліфікації дійсні в наданому коді. Дивіться примітку внизу публікації, яка показує модифікацію для використання реальних правил DnD.
Камерон Авік

Ой, моя погана. Вибачте. Вихід правильний з цією зміною.
Олів'є Грегоар

Що ж, це врегульовано: потрібно застосовувати правило D&D, а не min(9,n-1)одне.
Олів'є Грегоар

1

Вугілля деревне , 51 байт

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Приймає рівні заклинання у порядку зростання у вигляді рядка. Пояснення:

Nθ

Введіть рівень.

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

Виконайте розшифровку довжини виконання у рядку, що 0544443335призводить до рядка 11111222233334444555566677788899999. Потім цей рядок нарізається починаючи з рівня (1-індексований) і закінчуючи на подвоєному рівні (якщо менше 12) або 6 + 1,5 *, округлюючи вгору, за винятком рівня 19, який округлюється вниз. A 0суфікс для того, щоб не було занадто багато заклинань.

¬ΣES›ι§θκ

Порівняйте рівні заклинання з підрядкою та друкуйте а, -якщо жодна з них не є надмірною.


Я вважаю, що це не вдається для меншої довжини, ніж повинна бути, оскільки я вважаю, що придбання заклинань є обов'язковим на тих рівнях, які не перелічені; Я хоч і попросив роз'яснень.
Джонатан Аллан

Також, здається, не вдалося досягти 11113рівня, 4який є результатом необов'язкових оновлень, а саме 1на рівні 2, 1на рівні 3 та 3на рівні 4
Джонатан Алан

@JonathanAllan Ваш максимальний рівень заклинань - це стеля половини рівня вашого персонажа (або 9, оскільки це максимально можливий). Можливо, питання не стало таким зрозумілим.
Ніл

(В основному я дотримувався відповідей у ​​пов'язаному питанні щодо можливих рівнів заклинань.)
Ніл,

Я не хочу намагатися зрозуміти та узгодити дві специфікації, ОП підтвердила у коментарях min (9, n-1). Можливо, запитайте це там ...
Джонатан Аллан

0

JavaScript (ES6), 79 байт

(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

Спробуйте в Інтернеті!

Код тесту

Нижче наведено посилання на деякий тестовий код, який приймає рівень чаклуна як вхідний і повертає масив максимальних рівнів написання, використовуючи ту саму логіку, що і вищевказана функція.

Спробуйте в Інтернеті!

Як?

Довідкова таблиця

 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 

Кількість заклинань

LNL

NL={L+1якщо L<12(L+13)/2якщо 12L1615якщо L>16

jNL-1-1

Максимальний рівень заклинань

L1iNLМL,ii

МL,i={(L+i+2)/4якщо L+i<25(L+i+4)/4якщо 25L+i309якщо L+i>30

ха


0

Groovy , 155 байт

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}

Створює найкращу книгу правописів, потім перевіряє, чи книга орфографії, передана в метод, не краща.

Безгольові, із неявними типами, зробленими явними:

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
}

Спробуйте в Інтернеті!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.