คำนวณจำนวนเมทริกซ์ด้วยจำนวนเงินที่เหมาะสม


12

เมื่อการคูณ monomials ใน Milnor เป็นพื้นฐานสำหรับพีชคณิต Steenrod ส่วนหนึ่งของอัลกอริทึมเกี่ยวข้องกับการแจกแจงบางอย่าง "เมทริกซ์ที่อนุญาต"

รับสองรายการของจำนวนเต็ม nonnegative r 1 , ... , r mและ s 1 , ... , s n , เมทริกซ์ของจำนวนเต็ม nonnegative X

เมทริกซ์

อนุญาตถ้า

  1. ผลรวมของคอลัมน์ jth น้อยกว่าหรือเท่ากับs j :

    ข้อ จำกัด ของคอลัมน์

  2. ผลรวมของแถว ith ที่ถ่วงน้ำหนักด้วยพลังของ 2 น้อยกว่าหรือเท่ากับr i :

    ข้อ จำกัด ของแถว

งาน

เขียนโปรแกรมที่ใช้คู่ของรายการr 1 , ... , r mและs 1 , s 1 , ... , s nและคำนวณจำนวนเมทริกซ์ที่อนุญาตสำหรับรายการเหล่านี้ โปรแกรมของคุณอาจเลือกใช้ m และ n เป็นอาร์กิวเมนต์เพิ่มเติมหากจำเป็น

  • ตัวเลขเหล่านี้อาจใส่ในรูปแบบใดก็ได้ที่มีคนชอบเช่นจัดกลุ่มเป็นรายการหรือเข้ารหัสแบบเอกหรืออื่น ๆ

  • เอาต์พุตควรเป็นจำนวนเต็มบวก

  • ช่องโหว่มาตรฐานใช้

เกณฑ์การให้คะแนน

นี่คือรหัสกอล์ฟ: ทางออกที่สั้นที่สุดในการชนะไบต์

ตัวอย่าง:

สำหรับ[2]และ[1]มีการฝึกอบรมที่อนุญาตสอง:

ตัวอย่างที่ 1

สำหรับ[4]และ[1,1]มีการฝึกอบรมที่อนุญาตสาม:

ตัวอย่างที่ 2

สำหรับ[2,4]และ[1,1]มีการฝึกอบรมห้าอนุญาต:

ตัวอย่างที่ 3

กรณีทดสอบ:

   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 คำจำกัดความจะง่ายต่อการเข้าใจถ้าคุณสูญเสียแถวและคอลัมน์แรกของเมทริกซ์, ดัชนีจาก 1 และใช้ <= แทน ==
ปีเตอร์เทย์เลอร์

โอเคจะทำ ฉันเพิ่งคัดลอกคำนิยามออกมาจากตำราคณิตศาสตร์และมีการใช้จริงสำหรับรายการเหล่านั้น
ฮู้ด

คำตอบ:


3

JavaScript (ES7), 163 ไบต์

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)

กรณีทดสอบ

NB : ฉันได้ลบกรณีทดสอบที่ใช้เวลามากที่สุดสองกรณีออกจากตัวอย่างนี้ แต่ก็ควรผ่านเช่นกัน

แสดงความคิดเห็น

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

เยลลี่ 26 ไบต์

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

โปรแกรมเต็มรูปแบบโดยใช้S , Rซึ่งพิมพ์การนับ

ลองออนไลน์!

อย่างไร?

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 (Mathematica) , 101 ไบต์

ให้ Mathematica แก้มันเป็นระบบของความไม่เท่าเทียมกันกับจำนวนเต็ม ฉันตั้งค่าอาร์เรย์สัญลักษณ์fและเธรดมากกว่าความไม่เท่าเทียมกันสามชุด Join@@เพียง flattens Solveรายการสำหรับ

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

ลองออนไลน์!


0

Mathematica 139 ไบต์

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

ลองออนไลน์

คำอธิบาย: พาร์ทิชันแต่ละR ฉันเข้าสู่อำนาจของ 2 แล้วทำให้ tuples ทั้งหมดที่มีการสลายตัวหนึ่งเข้าสู่อำนาจของสองสำหรับแต่ละจำนวนเต็มลบผลรวมคอลัมน์จากรายการของsฉัน นับจำนวนของสิ่งอันดับที่ทำให้รายการที่เหลือทั้งหมดเป็นค่าบวก


2
โดยทั่วไปจะไม่แนะนำให้ตอบคำถามของคุณเองจนกว่าผู้อื่นจะส่งเป็นภาษานั้นแล้ว
HyperNeutrino

@HyperNeutrino ฉันสามารถลบได้ถ้าคุณคิดว่าเป็นความคิดที่ดี นี่ไม่ใช่การเล่นกอล์ฟอย่างระมัดระวังมากดังนั้นจึงมีโอกาสมากที่คนอื่นจะทำได้ดีกว่า
ฮู้ด

3
ในขณะที่มันไม่ใช่เรื่องเลวร้ายที่จะสามารถพิสูจน์ได้ว่ามันแก้ปัญหาได้ แต่ฉันไม่แนะนำให้ใช้วิธีแก้ปัญหาอย่างรวดเร็ว อาจจะรอหนึ่งสัปดาห์ก่อนหรือบางอย่าง
Erik the Outgolfer

ดังนั้นฉันควรลบมันหรือทิ้งมันทันทีที่ฉันโพสต์ไว้?
ฮู้ด

ฉันจะทิ้งไว้ Pace Erik ฉันไม่คิดว่ามันจะเสียสิ่งใด: การมีอยู่ของการแก้ปัญหานั้นชัดเจนจากข้อเท็จจริงที่ว่าเมทริกซ์ที่เกี่ยวข้องกับข้อ จำกัด ของผลรวมของคอลัมน์นั้น จำกัด และสร้างขึ้นได้อย่างง่ายดาย
ปีเตอร์เทย์เลอร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.