สร้างองค์ประกอบพื้นฐานของพีชคณิต Steenrod


16

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

ลำดับของจำนวนเต็มบวกเรียกว่ายอมรับได้ถ้าจำนวนเต็มแต่ละค่าเป็นอย่างน้อยสองครั้งต่อไป ดังนั้นสำหรับตัวอย่างเช่น[7,2,1]เป็นที่ยอมรับเพราะ722และ221 1 บนมืออื่น ๆ ที่[3,2]ไม่ได้เป็นที่ยอมรับเพราะ3<22 2 (ในโทโพโลยีเราจะเขียนSq7Sq2Sq1สำหรับลำดับ[7,2,1])

ศึกษาระดับปริญญาของลำดับคือผลรวมของรายการมันของ ดังนั้นสำหรับตัวอย่างเช่นการศึกษาระดับปริญญาของ[7,2,1]เป็น7+2+1=10 10 ส่วนเกินของลำดับที่ยอมรับเป็นองค์ประกอบแรกลบรวมขององค์ประกอบที่เหลือเพื่อให้[7,2,1]มีส่วนเกิน721=4 4

งาน

จงเขียนโปรแกรมที่ใช้คู่ของจำนวนเต็มบวกได้(d,e)และผลชุดของลำดับที่ยอมรับทุกระดับและส่วนเกินที่น้อยกว่าหรือเท่ากับd eเอาต์พุตเป็นชุดดังนั้นลำดับของลำดับที่ยอมรับได้ไม่สำคัญ

ตัวอย่าง:

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

นี่เรากำลังมองหาลำดับที่ยอมรับด้วย 3. รวมมีสองตัวเลือก, และ[3] [2,1]( [1,1,1]และ[1,2]มีผลรวม 3 แต่ไม่สามารถยอมรับได้) ส่วนเกินของ[3]คือ 3 และส่วนที่เกินจาก[2,1]เป็น21=1 1 ดังนั้นลำดับเท่านั้นที่มีส่วนเกิน1[2,1]คือ

Input: 6, 6
Output: [[6], [5, 1], [4, 2]] (or any reordering, e.g., [[5,1],[4,2],[6]])

เนื่องจากส่วนเกินนั้นน้อยกว่าหรือเท่ากับระดับเราจึงไม่มีสภาพส่วนเกิน ดังนั้นเราเพียงแค่พยายามที่จะหาลำดับที่ยอมรับทั้งหมดของการศึกษาระดับปริญญา 6. ตัวเลือกที่มี[6], และ[5, 1] [4, 2](สิ่งเหล่านี้มีส่วนเกิน6 , 51=4และ42=2 )

Input: 10, 5
Output: [[7,3], [7,2,1], [6,3,1]]

ลำดับที่ยอมรับได้ของระดับ 10 คือ:

[[10], [9,1], [8,2], [7,3], [7,2,1], [6,3,1]]

สิ่งเหล่านี้มีส่วนเกิน10 , 91=8 , 82=6 , 73=4 , 721=4 , และ6-3-1=2ตามลำดับดังนั้นสามงานสุดท้ายทั้งหมด

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

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

กรณีทดสอบ:

การเรียงลำดับใหม่ของเอาต์พุตใด ๆ ก็ดีเช่นกันดังนั้นสำหรับอินพุต(3, 3)เอาต์พุต[[3],[2,1]]หรือ[[2,1],[3]]ยอมรับได้อย่างเท่าเทียมกัน (อย่างไรก็ตาม[[1,2],[3]]ไม่ใช่)

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

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

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

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

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

Input: 6, 1
Output: []

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

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

Input: 10, 10
Output: [[10], [9,1], [7,2,1], [6,3,1], [8,2], [7,3]]

Input: 10, 5
Output: [[7,3], [7,2,1], [6,3,1]]

Input: 26, 4
Output: [15, 7, 3, 1]

Input: 26, 6
Output: [[16, 7, 2, 1], [16, 6, 3, 1], [15, 7, 3, 1], [16, 8, 2], [16, 7, 3]]

1
ตกลงฉันจะให้คำอธิบายสั้น ๆ
ฮู้ด

คำตอบ:


6

05AB1E , 16 12 ไบต์

บันทึกแล้ว 4 ไบต์ขอบคุณGrimy

Åœíʒx¦@P}ʒÆ@

ลองออนไลน์!

คำอธิบาย

Ŝ              # integer partitions
  í             # reverse each
   ʒ    }       # filter, keep only elements true under:
    x           # each element doubled
     ¦          # remove the first element in the doubled list
      @         # compare with greater than or equal with the non-doubled
       P        # product
         ʒ      # filter, keep only elements true under:
          Æ     # reduce by subtraction
           @    # compare with greater than or equal to second input

ćsO-Æคือในตัว
Grimmy

นอกจากนี้ยังสามารถÀ@¨ ¦@
Grimmy

1
@Grimy: โอ้ว้าวฉันพลาดได้อย่างไร :) ขอบคุณ!
Emigna

5

ภาษา Wolfram (Mathematica) , 67 62 ไบต์

Cases[IntegerPartitions@#,a_/;2a[[1]]-#<=#2>Max@Ratios@a<=.5]&

ลองออนไลน์!

-4 ไบต์โดย @attinat

  • IntegerPartitions@d : รับรายการจำนวนเต็มทั้งหมดที่รวมเข้าด้วยกัน d
  • Cases[,...]: กรองตามเงื่อนไขต่อไปนี้:
    • 2#& @@# - d <= e &&: สององค์ประกอบแรกลบด้วยผลรวมน้อยกว่า eและ ...
    • Max@Ratios@#<=.5: อัตราส่วนขององค์ประกอบต่อเนื่องของรายการทั้งหมดน้อยกว่า 1/2

เพราะ eน้อยกว่า 0.5 เราสามารถเปลี่ยนสิ่งนี้ให้เป็นความไม่เท่าเทียมกันที่ถูกล่ามโซ่

สำหรับสองสามไบต์พิเศษสิ่งนี้เร็วกว่ามาก: ลองออนไลน์!



5

เยลลี่ ,  16  15 ไบต์

-1 ต้องขอบคุณ Erik the Outgolfer (การปรับที่ชาญฉลาดเพื่อการตรวจสอบที่อนุญาตให้ใช้ตัวกรองเดียว)

:Ɲ;_/>¥’Ạ
ŒṗUçƇ

ลิงก์ dyadic ยอมรับจำนวนเต็มบวกd, ด้านซ้ายและจำนวนเต็มบวกe, ด้านขวาซึ่งให้รายการของรายการจำนวนเต็มบวก

ลองออนไลน์! (ส่วนท้ายจัดรูปแบบผลลัพธ์เพื่อหลีกเลี่ยงการแสดงรายการการจัดรูปแบบรายการโดยนัย Jelly ทำเหมือนโปรแกรมเต็มรูปแบบ)

อย่างไร?

:Ɲ;_/>¥’Ạ - Link 1: admissible and within excess limit? descending list, L; excess limit, e
 Ɲ        - neighbour-wise:
:         -   integer division  -- admissible if all these are >1
      ¥   - last two links as a dyad - i.e. f(L,e):
    /     -   reduce (L) by:
   _      -     subtraction
     >    -   greater than (e)? (vectorises)  -- within excess if all these are ==0
  ;       - concatenate
       ’  - decrement (vectorises)
        Ạ - all (non-zero)?

ŒṗUçƇ - Main link: integer, d; integer, e
Œṗ    - partitions (of d)
  U   - reverse each
    Ƈ - filter keep those (v in that) for which:
   ç  -   call last Link (1) as a dyad - i.e. f(v, e)

คุณสามารถบันทึกไบต์ที่มีเคล็ดลับฉลาด อาจใช้เวลาสักครู่เพื่อทำความเข้าใจว่าทำไมจึงได้ผล : P
Erik the Outgolfer

@EriktheOutgolfer ยอดเยี่ยมฉันได้ลองวิธีที่คล้ายกันในการแทรกสองตัวกรอง (รวมถึงการเรียงต่อกัน) แต่ทุกอย่างออกมาเป็น 16 เพราะฉันไม่คิดว่าจะใช้เคล็ดลับการลดลงในเวลาเดียวกัน
Jonathan Allan


3

JavaScript (V8) ,  88 87  81 ไบต์

(e)(d)จะเข้าเป็น พิมพ์ลำดับไปที่ STDOUT

e=>g=(d,s=x=d,a=[])=>s>0?d&&g(d-1,s,a,g(d>>1,s-d,[...a,d])):a[s]*2-x<=e&&print(a)

ลองออนไลน์!

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

e =>                  // e = maximum excess
  g = (               // g is a recursive function taking:
    d,                //   d   = expected degree; actually used as the next candidate
                      //         term of the sequence in the code below
    s =               //   s   = current sum, initialized to d; we want it to be equal
                      //         to 0 when a sequence is complete
    x = d,            //   x   = copy of the expected degree
    a = []            //   a[] = current sequence
  ) =>                //
    s > 0 ?           // if s is positive:
      d &&            //   if d is not equal to 0:
        g(            //     outer recursive call:
          d - 1,      //       decrement d
          s,          //       leave s unchanged
          a,          //       leave a[] unchanged
          g(          //       inner recursive call:
            d >> 1,   //         update d to floor(d / 2)
            s - d,    //         subtract d from s
            [...a, d] //         append d to a[]
          )           //       end of inner recursive call
        )             //     end of outer recursive call
    :                 //   else:
      a[s] * 2 - x    //     s if either 0 (success) or negative (failure)
                      //     if s is negative, a[s] is undefined and this expression
                      //     evaluates to NaN, forcing the test to fail
      <= e            //     otherwise, we test whether the excess is valid
      && print(a)     //     and we print a[] if it is

3

Pyth , 23 ไบต์

f!>-FTvzf!<#2/MCtBT_M./

ลองออนไลน์!

f!>-FTvzf!<#2/MCtBT_M./Q   Implicit: Q=input 1, vz=input 2
                           Trailing Q inferred
                     ./Q   Generate partitions of Q (ordered lists of integers which sum to Q)
                   _M      Reverse each
        f                  Filter keep elements of the above, as T, where:
               CtBT          Pair the set with itself without the first element and transpose
                             This yields all adjacent pairs of values
             /M              Integer divide each pair
           #                 Filter keep elements...
          < 2                ... less than 2
                             For admissible sequences this will be empty
         !                   Logical NOT - maps [] to true, populated lists to false
                           Result of filter are all admissible sequences
f                          Filter keep the above, as T, where:
   -FT                       Reduce T by subtraction to get degree
 !>   vz                     Is the above not greater than vz?
                           Implicit print

3

งูหลาม 3 , 213 ไบต์

ความเข้าใจในรายการยักษ์ น่าจะไม่ใช่วิธีที่ดีที่สุดในการทำสิ่งนี้ แต่ฉันไม่สามารถหาวิธีข้ามคำสั่ง if ได้

import itertools as z
f=lambda d,e:[c for c in [[b for b in list(z.permutations(range(1,d+1),i)) if sum(b)==d and b[0]-sum(b[1:i])<=e and all([b[i]>=b[i+1]*2 for i in range(len(b)-1)])] for i in range(1,5)] if c]

Python 3 , 172 ไบต์

from itertools import*
r=range
f=lambda d,e:filter(len,[[b for b in permutations(r(1,d+1),i)if d==sum(b)and~e<d-2*b[0]and all(i>=j*2for i,j in zip(b,b[1:]))]for i in r(5)])

ลองออนไลน์!

ตามที่มีการแก้ไขโดย @Jonas Ausevicius


2
ยินดีต้อนรับสู่เว็บไซต์ เคล็ดลับเล็ก ๆ น้อย ๆ : ฉันดูเหมือนว่าคุณไม่คุ้นเคยเป็นอย่างยิ่งกับการที่ต้องใช้การเว้นวรรคในหลาม คุณมีสถานที่สองแห่งที่สามารถลบพื้นที่ได้ดีดังนั้นฉันจะดูว่า นอกจากนี้ยังมีฟังก์ชั่นเช่นallสามารถใช้เครื่องกำเนิดไฟฟ้าดังนั้นคุณก็สามารถทำแทนall(...) all([...])สุดท้ายเนื่องจากการส่งของคุณเป็นฟังก์ชั่นที่ไม่ระบุชื่ออย่างสมบูรณ์คุณจะไม่ถูกลงโทษสำหรับการมอบหมาย ( f=) และสามารถหักออกจากคะแนนของคุณ (-2 ไบต์)
โพสต์ Rock Garf Hunter


โอ้และใน python3 คุณสามารถส่งไปยังรายการด้วยซึ่ง[*(...)]แทนที่จะlist(...)บันทึกไบต์ แต่ในกรณีของคุณบันทึก 2 เนื่องจากยังช่วยให้คุณลบพื้นที่
โพสต์ Rock Garf Hunter

2
189 ไบต์ถ้ามันปรับให้กลับวัตถุกรองมิฉะนั้น 192 [*filter(...)]ห้องพร้อมด้วย ยินดีด้วย :)
Reinstate Monica


2

ถ่าน 42 ไบต์

Fθ⊞υ⟦⊕ι⟧FυF…·⊗§ι⁰θ⊞υ⁺⟦κ⟧ιIΦυ›⁼Σιθ‹η⁻⊗§ι⁰Σι

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

Fθ⊞υ⟦⊕ι⟧

[1]..[d]แรกสร้างรายชื่อของรายการจาก

FυF…·⊗§ι⁰θ⊞υ⁺⟦κ⟧ι

สำหรับแต่ละรายการสร้างรายการใหม่โดยนำหน้าตัวเลขทั้งหมดจากจำนวนแรกที่เพิ่มขึ้นเป็นสองเท่าdและผนวกรายการเหล่านั้นเข้ากับรายการของรายการที่ต้องดำเนินการ สิ่งนี้ทำให้มั่นใจได้ว่าลำดับที่ยอมรับได้ทั้งหมดที่มีตัวเลขไม่เกินdถูกสร้างขึ้น

IΦυ›⁼Σιθ‹η⁻⊗§ι⁰Σι

เอาท์พุทจะแสดงเฉพาะผู้ที่มีการศึกษาระดับปริญญาเป็นส่วนเกินไม่เกินd e(ผลรวมของระดับและส่วนเกินเท่ากับสองเท่าของจำนวนแรกของรายการ)


2

Python 3 , 156 ไบต์

lambda d,e:[x for y in range(5)for x in permutations(range(1,d+1),y)if all(i>=j*2for i,j in zip(x,x[1:]))and d==sum(x)and~e<d-2*x[0]]
from itertools import*

ใช้d,eเป็นอินพุต; รายการผลลัพธ์ของสิ่งอันดับ

คล้ายกับ @OrangeCherries คำตอบและความช่วยเหลือจากความคิดเห็น แต่บันทึกเพิ่มเติมไบต์

ลองออนไลน์!



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