Bir büyücünün büyü kitabı


10

Düzenleme : Daha önce D & D oynamadım, bu yüzden bu soruyu ilk kez yaptığımda düzgün bir şekilde araştırmadım. Bunun için özür dilerim ve dnd 5e kurallarına olabildiğince doğru kalması için cevapları geçersiz kılabilecek birkaç düzenleme yapıyorum. Afedersiniz.


Yakın zamanda yapılan bir Hot Network sorusundan gelen bir D&D hayranı, bir büyücünün seçtiği büyülerin olasılıklarla aynı hizaya gelip gelmediğini anlamakta sorun yaşıyor ve bence yardım etmeliyiz!

Giriş

(bunların hepsi daha önce bahsedilen soruda zaten açıklanmıştır)

Bir büyücü başlangıçtan iki seviye 1 büyüyü bilir (seviye 1): [1, 1]

  • Bir büyücü her seviye kazandığında (12, 14, 16, 18, 19 ve 20 seviyeleri hariç) yeni bir büyü öğrenir (zorunlu).

  • Buna ek olarak, seviye atlarken büyülerden birini diğeriyle değiştirmek için (isteğe bağlı) seçimini yapabilirsiniz .

Öğrenilen ve değiştirilen büyüler, büyücünün seviyesinin yarısı kadar olan geçerli bir büyü yuvası seviyesi olmalıdır. Bu tabloya bakın:

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

Bu, 3. seviyede insanın büyü seviyelerine sahip olabileceği anlamına gelir [1, 1, 2, 2]:

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

Erişiminiz olan en yüksek seviyedeki büyüleri seçmeniz gerekmez.

Büyü seviyeleri [1, 1, 1, 1]seviye 3 için mükemmel şekilde geçerlidir.

Son olarak, büyü değiştirmenin her seviye için isteğe bağlı bir seçenek olduğunu unutmayın . Bu, bazı seviyelerin değiştirmeyi atlayabileceği anlamına gelirken, diğerleri onu kullanabilir.

Meydan okuma

1 ile 20 arasında bir tamsayı (seviye) alan bir program veya işlev yapın.

Ayrıca, herhangi bir sırayla 1 ile 9 arasında değişen bir tamsayı dizisi (büyü seviyesi) almalıdır (9 maksimum büyü seviyesidir).

Seçilen büyü seviyeleri verilen seviyenin büyücüsü için geçerliyse, programın çıktısı doğru / gerçek değeri doğrulamalıdır.

Test senaryoları

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]

Bu - en az bayt kazanır!


1
Yazım listesini istediğimiz gibi sıralayabilir miyiz?
Veskah

Her sınıf seviyesi için maksimum büyü seviyesi nedir?
Nitrodon

@Nitrodon 19 sanırım?
Don Bin

@Nitrodon, muhtemelen dizi girdisinin sadece " 1'den 9'a kadar değişen değerler " içerebileceği göz önüne alındığında 9'dur, ancak ele almamız gereken maksimum büyü seviyesi spesifikasyonda daha açık bir şekilde belirtilmelidir. Ve birkaç test vakasıyla yapabilirdi. Aksi takdirde güzel bir meydan okuma.
Shaggy

4
1. "Ayrıca, 1'den 9'a (herhangi bir sırayla) değişen değerlere sahip bir tamsayı dizisi (büyü seviyeleri) almalıdır" - 10-19. 2. "Ancak 4. seviyede büyü seviyeleri [2,2,3,3], bu seviyedeki bir büyücünün erişebileceğinden daha fazla yer değiştirmeyi gerektirdiğinden mümkün olmazdı." - listenin 5 yerine uzunluk 4 olması burada daha temel bir neden değil midir? (Ben varsayalım [1,3,2,2,3]3. seviyeden giderek bir seviyeye 4 mümkündür [1,1,2(replaced),2(new)]için [1,3(replaced),2,2,3(new)]?)
Jonathan Allan

Yanıtlar:


5

Java (JDK 10) , 191 bayt

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

Çevrimiçi deneyin!

  • Giriş gereksinimi: yazım listesi en büyük yazım seviyelerinden en düşük seviyeye doğru sıralanmalıdır.

açıklamalar

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

Tablo 1: Axoren'in bağlantılı soruya verdiği yanıttan kullanılan her büyücü seviyesi için maksimum büyü dağılımı .

resim açıklamasını buraya girin

Kredi


1
return l<1&java.util.Arrays.equals(m,new int[9]);z=0;for(int i:m)z+=i;return l+z==0;yerine olabilir . Ya da içindeki değerler msonunda asla negatif olamazsa, ==0olabilir <1.
Kevin Cruijssen

@KevinCruijssen Teşekkürler! Ve listede çok fazla büyü bulunan bir hatayı düzeltmek için bu odadan çıktı.
Olivier Grégoire

Ah, for(int i:m)l|=i;daha akıllı! Güzel bir.
Kevin Cruijssen

Son iki döngünün birleştirilebileceğinden eminim, şu anda nasıl olduğunu bilmiyorum.
Olivier Grégoire

1
@CameronAavik Büyük olasılıkla artan ( new int[]{5,6,6,6,7,7,7,8,8,8,9,9,9,9,9}) numaralarla geçtiniz . Eğer iner girersem ( new int[]{9,9,9,9,9,8,8,8,7,7,7,6,6,6,5}, golf altına yazdım giriş gereksinimi yazdığı gibi), işe yarıyor. Gerçekten çalıştığını göstermek için test durumunu ekledim.
Olivier Grégoire

2

Python 3 , 98 bayt

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)

Çevrimiçi deneyin!

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: doğru D&D kurallarını kullanmak için düzeltilmiş çözüm


Ben print(v(20, [6,6,6,6,7,7,7,8,8,8,9,9,9,9,9])) # Falsebaskıları doğru olsa + 1'ed . Yanlış yazdırmalıdır.
Olivier Grégoire

@ OlivierGrégoire Verilen kodda hangi beceri seviyelerinin geçerli olduğuna dair OP kurallarını kullanıyorum. Gönderinin altındaki gerçek DnD kurallarını kullanmak için yapılan değişikliği gösteren nota bakın.
Cameron Aavik

Ah benim hatam. Afedersiniz. Çıktı bu değişiklikle doğrudur.
Olivier Grégoire

Karar verildi: uygulanması gereken D&D kuralı, min(9,n-1)tek kural değil .
Olivier Grégoire

1

Kömür , 51 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Bir dize olarak büyü düzeylerini artan sırada alır. Açıklama:

Nθ

Seviyeyi girin.

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

Dizeyle 0544443335sonuçlanan dizede çalışma uzunluğu kod çözme işlemi gerçekleştirin 11111222233334444555566677788899999. Bu dize daha sonra düzeyden başlayarak (1 dizinli) ve aşağı yuvarlanan düzey 19 dışında, iki kat düzey (12'den küçükse) veya 6 + 1.5 * ile biter. Çok 0fazla büyü olmadığından emin olmak için A eklenir.

¬ΣES›ι§θκ

Büyü düzeylerini alt dize ile karşılaştırın ve -hiçbiri aşırı değilse a yazdırır .


Listede bulunmayan seviyelerde büyü edinmenin zorunlu olduğunu düşündüğüm için, olması gerekenden daha az uzunluklar için başarısız olduğunu düşünüyorum; Yine de açıklama istedim.
Jonathan Allan

Ayrıca başarısız görünüyor 11113seviyesinde 4alarak hiçbir isteğe bağlı yükseltmeleri sonucudur 1, düzey 2'de 13. seviyede ve 34. düzeyde,
Jonathan Allan

@JonathanAllan Maksimum büyü seviyeniz, karakter seviyenizin yarısının tavanıdır (veya mümkün olan en fazla 9 olduğu için). Belki de soru bunu açıklığa kavuşturmadı.
Neil

(Temel olarak bağlantılı sorudaki olası büyü seviyelerinin ne olduğuna dair cevapları takip ettim.)
Neil

İki spesifikasyonu anlamaya ve uzlaştırmaya çalışmak istemiyorum, OP yorumlarda min (9, n-1) onayladı. Belki bunu orada sorgula ...
Jonathan Allan

0

JavaScript (ES6), 79 bayt

(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

Çevrimiçi deneyin!

Test kodu

Aşağıda, büyücü düzeyini giriş olarak alan ve yukarıdaki işlevle aynı mantığı kullanarak bir maksimum büyü düzeyi dizisi döndüren bazı test kodlarına bir bağlantı bulunmaktadır.

Çevrimiçi deneyin!

Nasıl?

Referans tablosu

 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 

Büyü sayısı

LNL

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

jNL11

Maksimum büyü seviyesi

L1iNLML,ii

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

xa


0

Groovy , 155 bayt

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}

Mümkün olan en iyi büyü kitabını oluşturur, sonra yönteme aktarılan büyü kitabının daha iyi olmadığını kontrol eder.

Ungolfed, örtük türler açıkça belirtildi:

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
}

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.