Книга заклинаний колдуна


10

Редактировать : я раньше не играл в D & D, поэтому, когда я изначально задавал этот вопрос, я не исследовал его должным образом. Я прошу прощения за это, и я делаю несколько правок, которые могут сделать недействительными ответы, чтобы остаться максимально правдивыми к правилам dnd 5e. Сожалею.


Фанат D & D из недавнего Горячего Сетевого Вопроса, похоже, испытывает некоторые затруднения, решая, соответствуют ли выбранные заклинания колдуна возможностям - и я думаю, что мы должны помочь!

Введение

(все это уже описано в ранее упомянутом вопросе)

Колдун знает два заклинания уровня 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 - максимальный уровень заклинания).

Выходные данные программы должны быть истинными / ложными, подтверждающими, если выбранные уровни заклинаний действительны для колдуна данного уровня.

Контрольные примеры

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
Можем ли мы взять список заклинаний отсортированным, как мы этого хотим?
Веска

Каков максимальный уровень заклинаний для каждого уровня класса?
Нитродон

@ Нитродон, я полагаю, 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)

Попробуйте онлайн!

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)

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


Я + 1, хотя print(v(20, [6,6,6,6,7,7,7,8,8,8,9,9,9,9,9])) # Falseпечатает правда. Это должно напечатать 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, который округлен в меньшую сторону. 0Суффикс A означает, что заклинаний не слишком много.

¬ΣES›ι§θκ

Сравните уровни заклинаний с подстрокой и напечатайте a, -если ни один из них не является чрезмерным.


Я думаю, что это терпит неудачу на длины меньше, чем они должны быть, так как я думаю, что приобретение заклинаний обязательно на уровнях, не перечисленных; Я попросил разъяснений, хотя.
Джонатан Аллан

Также, похоже, не работает 11113на уровне, 4который является результатом отсутствия дополнительных улучшений, принимая 1на уровне 2, 1на уровне 3 и 3на уровне 4.
Джонатан Аллан

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

(В основном я следовал за ответами в связанном вопросе относительно того, каковы возможные уровни заклинаний.)
Нейл

Я не хочу пытаться понять и согласовать две спецификации, ОП подтвердил мин (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

Максимальные уровни заклинаний

L1яNLML,яя

ML,язнак равно{(L+я+2)/4если L+я<25(L+я+4)/4если 25L+я309если L+я>30

Иксa


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}

Создает лучшую книгу заклинаний, а затем проверяет, что книга заклинаний, переданная в метод, не лучше.

Ungolfed, с неявными типами, сделанными явными:

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.