Uygun toplamlarla matris sayısını hesaplama


12

Steenrod cebiri için Milnor bazında monomiyalleri çoğaltırken, algoritmanın bir kısmı belirli "izin verilen matrislerin" numaralandırılmasını içerir.

Negatif olmayan tamsayılar verilen iki liste r 1 , ..., r, m, ve s 1 , ..., s , n , negatif olmayan tam sayılardır, X bir matris

bir matris

izin verilirse

  1. Jth sütununun toplamı s j'den küçük veya ona eşittir :

    sütun toplamları kısıtı

  2. 2 güçler tarafından ağırlıklı i'inci satırın toplamı daha az ya da eşit r i :

    satır toplamları kısıtı

Görev

Bir çift r 1 , ..., r m ve s 1 , s 1 , ..., s n listelerini alan ve bu listeler için izin verilen matris sayısını hesaplayan bir program yazın . Programınız isteğe bağlı olarak gerekirse m ve n'yi ek argümanlar olarak alabilir.

  • Bu sayılar, örneğin listeler halinde gruplandırılmış veya tekli olarak kodlanmış veya başka herhangi bir şey gibi, herhangi bir şekilde girilebilir.

  • Çıktı pozitif bir tamsayı olmalıdır

  • Standart boşluklar geçerlidir.

puanlama

Bu kod golf: Bayt en kısa çözüm kazanır.

Örnekler:

İçin [2]ve [1]iki izin verilen matrisler vardır:

örnek 1

İçin [4]ve [1,1]üç izin verilen matris vardır:

örnek 2

İçin [2,4]ve [1,1]izin verilen beş matris vardır:

örnek 3

Test senaryoları:

   Input: [1], [2]
   Output: 1

   Input: [2], [1]
   Output: 2

   Input: [4], [1,1]
   Output: 3

   Input: [2,4], [1,1]   
   Output: 5      

   Input: [3,5,7], [1,2]
   Output: 14

   Input: [7, 10], [1, 1, 1]
   Output: 15       

   Input: [3, 6, 16, 33], [0, 1, 1, 1, 1]
   Output: 38      

   Input: [7, 8], [3, 3, 1]
   Output: 44

   Input: [2, 6, 15, 18], [1, 1, 1, 1, 1]
   Output: 90       

   Input: [2, 6, 7, 16], [1, 3, 2]
   Output: 128

   Input: [2, 7, 16], [3, 3, 1, 1]
   Output: 175

1
IMO'nun tanımını, matrislerin ilk satırını ve sütununu, 1'den indeksini ve == yerine <= kullanırsanız anlamak daha kolay olacaktır.
Peter Taylor

Tamam yapacağım. Sadece bir matematik ders kitabının tanımını kopyaladım ve bu girişler için gerçek bir kullanımı vardı.
Hood

Yanıtlar:


3

JavaScript (ES7), 163 bayt

f=([R,...x],s)=>1/R?[...Array(R**s.length)].reduce((k,_,n)=>(a=s.map((_,i)=>n/R**i%R|0)).some(c=>(p+=c<<++j)>R,p=j=0)?k:k+f(x,s.map((v,i)=>v-a[i])),0):!/-/.test(s)

Test senaryoları

Not : Bu snippet'ten en çok zaman alan iki test vakasını kaldırdım, ancak onlar da geçmelidir.

Yorumlananlar

f = (                               // f = recursive function taking:
  [R,                               //   - the input array r[] splitted into:
      ...x],                        //     R = next element / x = remaining elements
  s                                 //   - the input array s[]
) =>                                //
  1 / R ?                           // if R is defined:
    [...Array(R**s.length)]         //   for each n in [0, ..., R**s.length - 1],
    .reduce((k, _, n) =>            //   using k as an accumulator:
      (a =                          //     build the next combination a[] of
        s.map((_, i) =>             //     N elements in [0, ..., R - 1]
          n / R**i % R | 0          //     where N is the length of s[]
        )                           //
      ).some(c =>                   //     for each element c in a[]:
        (p += c << ++j)             //       increment j; add c * (2**j) to p
        > R,                        //       exit with a truthy value if p > R
        p = j = 0                   //       start with p = j = 0
      ) ?                           //     end of some(); if truthy:
        k                           //       just return k unchanged
      :                             //     else:
        k +                         //       add to k the result of
        f(                          //       a recursive call to f() with:
          x,                        //         the remaining elements of r[]
          s.map((v, i) => v - a[i]) //         s[] updated by subtracting the values of a[]
        ),                          //       end of recursive call
      0                             //     initial value of the accumulator k
    )                               //   end of reduce()
  :                                 // else:
    !/-/.test(s)                    //   return true if there's no negative value in s[]

1

Jöle , 26 bayt

UḄ€Ḥ>⁴
0rŒpṗ⁴L¤µS>³;ÇẸµÐḟL

Sayıyı yazdıran S , R'yi alan tam bir program

Çevrimiçi deneyin!

Nasıl?

UḄ€Ḥ>⁴ - Link 1, row-wise comparisons: list of lists, M
U      - upend (reverse each)
 Ḅ€    - convert €ach from binary (note bit-domain is unrestricted, e.g. [3,4,5] -> 12+8+5)
   Ḥ   - double (vectorises) (equivalent to the required pre-bit-shift by one)
     ⁴ - program's 2nd input, R
    >  - greater than? (vectorises)

0rŒpṗ⁴L¤µS>³;ÇẸµÐḟL - Main link: list S, list R
0r                  - inclusive range from 0 to s for s in S
  Œp                - Cartesian product of those lists
       ¤            - nilad followed by link(s) as a nilad:
     ⁴              -   program's 2nd input, R
      L             -   length
    ṗ               - Cartesian power = all M with len(R) rows & column values in [0,s]
        µ      µÐḟ  - filter discard if:
         S          -   sum (vectorises) = column sums
           ³        -   program's 1st input, S
          >         -   greater than? (vectorises) = column sum > s for s in S
             Ç      -   call the last link (1) as a monad = sum(2^j × row) > r for r in R
            ;       -   concatenate
              Ẹ     -   any truthy?
                  L - length

1

Wolfram Dili (Mathematica) , 101 bayt

Mathematica'nın bunu tamsayılar üzerinde bir eşitsizlik sistemi olarak çözmesine izin verin. fÜç eşitsizlik kümesi içinde sembolik bir dizi kurup iş parçacığım. Join@@sadece listesini düzleştirir Solve.

Length@Solve[Join@@Thread/@{Tr/@(t=f~Array~{q=(l=Length)@#2,l@#})<=#2,2^Range@q.t<=#,t>=0},Integers]&

Çevrimiçi deneyin!


0

Mathematica 139 bayt

Tr@Boole[k=Length[a=#]+1;AllTrue[a-Rest[##+0],#>=0&]&@@@Tuples[BinCounts[#,{2r~Prepend~0}]&/@IntegerPartitions[#,All,r=2^Range@k/2]&/@#2]]&

Çevrimiçi deneyin

Açıklama: Bölme her r ı arasında 2'nin kuvveti içine ve daha sonra her bir tamsayı için iki üssü içine bir ayrışma ile tüm demetlerin yapar listeden sütun toplamları çıkarma s i . Kalan tüm girişleri pozitif yapan tuples sayısını sayın.


2
genellikle başkaları o dilde gönderene kadar kendi zorluğunuzu cevaplamaktan vazgeçirilir.
HyperNeutrino

@HyperNeutrino Bunun iyi bir fikir olduğunu düşünüyorsanız silebilirim. Bu süper dikkatli bir şekilde golf değil, bu yüzden diğerleri daha iyi yapabilir.
Hood

3
Çözülebilir olduğunu kanıtlamak kötü bir şey olmasa da, çözümü çok hızlı bir şekilde bozmanızı önermiyorum. Belki önce bir hafta bekle falan.
Outgolfer Erik

Peki sildiğim ya da şimdi gönderdiğim gibi bırakmalı mıyım?
Hood

Bırakırım. Pace Erik Hiçbir şeyi bozduğunu düşünmüyorum: bir çözümün varlığı, sütun toplamı kısıtlamasına saygı gösteren matrislerin sonlu ve kolayca üretildiği gerçeğinden açıktır.
Peter Taylor
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.