魔術師の魔法書


10

編集私は以前D&Dをプレイしたことがないので、最初にこの質問をしたとき、適切に調査していませんでした。このことをお詫び申し上げます。dnd5eのルールにできる限り忠実に回答を無効にする可能性のあるいくつかの編集を行っています。ごめんなさい。


最近のHot Network QuestionのD&Dファンは、魔術師が選択したスペルが可能性と一致するかどうかを判断するのに問題があるようです。

前書き

(これはすべて前述の質問ですでに説明されています)

魔術師は最初から2つのレベル1の呪文を知っています(レベル1): [1, 1]

  • ソーサラーがレベルを取得するたびに(レベル12、14、16、18、19、20を除く)、彼らは新しい呪文を習得します(必須)。

  • さらに、レベルアップするときに、(オプション)1つのスペルを別のスペルに置き換えることを選択できます。

学習して置き換えられる呪文は、有効な呪文スロットレベルである必要があります。これは、魔術師のレベルの半分を切り上げたものです。次の表を参照してください。

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
スペルリストを希望どおりに並べ替えることができますか?
Veskah

各クラスレベルの最大スペルレベルはいくつですか?
Nitrodon '19

@Nitrodon 19と思いますか?
Don Thousand

@Nitrodon、おそらく配列の入力には「1から9までの範囲の値」しか含めることができないので9ですが、処理する必要がある最大の呪文レベルは、仕様でより明示的に述べる必要があります。そして、さらにいくつかのテストケースでそれを行うことができます。それ以外の場合は素晴らしい挑戦です。
Shaggy

4
1.「整数の配列(スペルレベル)も1〜9(任意の順序)の配列を取る必要があります」-レベル10〜19についてはどうですか?2.「しかし、レベル4では[2,2,3,3]、そのレベルの魔術師がアクセスできるよりも多くの置換が必要なため、スペルレベルは不可能です。」-リストが5ではなく4の長さであるという事実は、ここでのより根本的な理由ではありませんか?([1,3,2,2,3]レベル3 [1,1,2(replaced),2(new)]から[1,3(replaced),2,2,3(new)]?に行くことでレベル4が可能だと思います)
Jonathan Allan

回答:


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:リンクされた質問に対するAxorenの回答から使用された、各魔術師レベルの最大化されたスペル分布。

ここに画像の説明を入力してください

クレジット


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
Kevin Cruijssen、2018

@KevinCruijssenありがとう!そして、それにより、リスト内のスペルが多すぎるバグを修正する余地が残されました。
OlivierGrégoire18年

ああ、for(int i:m)l|=i;もっと賢いです!良いですね。
Kevin Cruijssen、2018

最後の2つのループを組み合わせることができると確信していますが、今のところはわかりません。
OlivierGrégoire18年

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}、ゴルフの下に書いた入力要件に記載されているように)、それは機能します。テストケースを追加して、実際に機能することを示しました。
OlivierGrégoire18年

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しましたが、print(v(20, [6,6,6,6,7,7,7,8,8,8,9,9,9,9,9])) # False真実と表示されます。falseと表示されます。
OlivierGrégoire18年

@OlivierGrégoire提供されたコードで有効なスキルレベルについてOPのルールを使用しています。実際のDnDルールを使用するために行う変更を示す、投稿の下部にあるメモを参照してください。
Cameron Aavik

ああ、悪い。ごめんなさい。その変更で出力は正しいです。
OlivierGrégoire18年

まあ、それは解決しました。適用する必要があるのはD&Dルールであり、ルールではありませんmin(9,n-1)
オリビエグレゴワール2018

1

チャコール、51バイト

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

オンラインでお試しください!リンクはコードの詳細バージョンです。スペルレベルを昇順で文字列として取得します。説明:

Nθ

レベルを入力します。

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

0544443335その結果、stringになるrun-lengthデコードを実行します11111222233334444555566677788899999。この文字列は、レベル(1インデックス)から始まり、2倍のレベル(12未満の場合)または6 + 1.5 *で終わるようにスライスされます。ただし、レベル19は切り捨てられます。Aに0は、スペルが多すぎないようにするためのサフィックスが付いています。

¬ΣES›ι§θκ

スペルレベルをサブストリングと比較し、-どれも過剰でない場合はaを出力します。


リストされていないレベルではスペルの取得が必須だと思うので、これは必要以上に短い長さでは失敗すると思います。しかし、私は説明を求めました。
ジョナサンアラン

また、ために失敗しているようだ11113レベルで4取って、ノーオプションのアップグレードの結果であり1、レベル2で1レベル3にし、3レベル4で、
ジョナサン・アラン

@JonathanAllanあなたの最大の呪文レベルは、あなたのキャラクターレベルの半分の天井です(またはそれが可能な限り最大なので9)。多分質問はそれを明確にしなかった。
Neil

(基本的には、可能なスペルレベルについてリンクされた質問の回答に従いました。)
Neil

私は2つの仕様を理解して調整したくありません。OPはコメントで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<12L+13/2もし 12L1615もし L>16

jNL11

最大の呪文レベル

L1NLML

ML={L++2/4もし L+<25L++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}

可能な限り最高のスペルブックを生成し、メソッドに渡されたスペルブックが適切でないことを確認します。

暗黙の型を明示的にした、ゴルフではありません:

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
}

オンラインでお試しください!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.