Mod 2 สัมประสิทธิ์ Multinomial


14

quintopia ได้โพสต์ที่นี่ความท้าทายในการคำนวณค่าสัมประสิทธิ์ multinomial (ข้อความบางส่วนที่นี่ถูกคัดลอกมาจากที่นั่น) มีอัลกอริทึมที่สนุกในการคำนวณสัมประสิทธิ์ multinomial mod 2

รับรายการตัวเลขk 1 , k 2 , ... , k m , เอาท์พุทที่เหลือของสัมประสิทธิ์ multinomial:

ป้อนคำอธิบายรูปภาพที่นี่

ลดลง mod 2. ต่อไปนี้ขั้นตอนวิธีการนี้ไม่ได้อย่างมีประสิทธิภาพ: สำหรับแต่ละk ผมคำนวณการขยายตัวของฐานk ผม , ที่อยู่, หาIJเช่นกันว่าIJเป็น 1 หรือ 0

ป้อนคำอธิบายรูปภาพที่นี่

หากมีเจใด ๆ ดังกล่าวที่RJ = a SJ = 1สำหรับ R ≠ s แล้วเกี่ยวข้อง mod 2 ค่าสัมประสิทธิ์พหุนามคือ 0 มิฉะนั้น mod 2 ค่าสัมประสิทธิ์พหุนามเป็น 1

งาน

เขียนโปรแกรมหรือฟังก์ชั่นซึ่งใช้ตัวเลขm , k 1 , k 2 , ... , k mและเอาท์พุทหรือส่งกลับค่าสัมประสิทธิ์ multinomial ที่เกี่ยวข้อง โปรแกรมของคุณอาจเลือกที่จะใช้mเป็นอาร์กิวเมนต์เพิ่มเติมหากจำเป็น

  • ตัวเลขเหล่านี้อาจถูกป้อนเข้าในรูปแบบใดก็ตามที่มีคนชอบเช่นจัดกลุ่มเป็นรายการหรือเข้ารหัสในเอกหรือสิ่งอื่นตราบใดที่การคำนวณที่แท้จริงของสัมประสิทธิ์ multinomial จะดำเนินการโดยรหัสของคุณและไม่ใช่กระบวนการเข้ารหัส

  • เอาต์พุตสามารถเป็นค่าความจริงใด ๆ ถ้าค่าสัมประสิทธิ์ multinomial เป็นค่าคี่และค่าความเท็จใด ๆ ถ้าค่าสัมประสิทธิ์ multinomial เท่ากับ

  • ไม่สามารถใช้งานบิวด์อินที่ออกแบบมาเพื่อคำนวณสัมประสิทธิ์พหุนาม

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

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

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

ตัวอย่าง:

ในการหาค่าสัมประสิทธิ์พหุนามเท่ากับ 7, 16, และ 1,000 เราจะขยายแต่ละฐานสอง:

ป้อนคำอธิบายรูปภาพที่นี่

เนื่องจากไม่มีคอลัมน์ใดมีมากกว่า 1 1 สัมประสิทธิ์ multinomial จึงเป็นเลขคี่และด้วยเหตุนี้เราจึงควรแสดงความจริงออกมา

ในการหาค่าสัมประสิทธิ์พหุนามเท่ากับ 7, 16 และ 76 เราจะทำการขยายเลขฐานสองแต่ละตัว:

ป้อนคำอธิบายรูปภาพที่นี่

เนื่องจากทั้ง 76 และ 7 มี 4 ในการขยายไบนารี่ของพวกเขาสัมประสิทธิ์พหุนามมีค่าเท่ากันดังนั้นเราจึงส่งออกค่าเท็จ

กรณีทดสอบ:

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

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

Input: [1,2,4,8,16]
Output: Truthy

Input: [7,16,76]
Output: Falsey

Input: [7,16,1000]
Output: Truthy

Input: [545, 1044, 266, 2240]
Output: Truthy

Input: [1282, 2068, 137, 584]
Output: Falsey

Input: [274728976, 546308480, 67272744, 135004166, 16790592, 33636865]
Output: Truthy

Input: [134285315, 33849872, 553780288, 544928, 4202764, 345243648]
Output: Falsey

1
ยินดีต้อนรับสู่ PPCG! โพสต์แรกที่ดี!
Rɪᴋᴇʀ

ฉันคิดว่าหลายภาษาที่ใช้==เพื่อความเท่าเทียมกันสามารถบันทึกไบต์หากความจริงและความเท็จได้รับอนุญาตให้พลิก
Ørjan Johansen

@ ØrjanJohansenฟังดูดี
ฮู้ด

คำตอบ:



7

Python 3 2, 55 43 42 ไบต์

lambda l:sum(l)==eval(`l`.replace(*',|'))

-12 ไบต์จากMr. Xcoder

-1 ไบต์จากRod

ลองออนไลน์!

คำอธิบาย: ตรวจสอบว่าผลรวมของตัวเลขเท่ากับบิตหรือ - ของตัวเลข


43 bytes:lambda l:sum(l)==eval("|".join(map(str,l)))
Mr. Xcoder

คุณสามารถเข้าถึง42 ไบต์สลับไปยัง python2
Rod




2

JavaScript (ES6), 37 35 34 ไบต์

บันทึก 2 ไบต์ขอบคุณ @ Mr.Xcoder
บันทึก 1 ไบต์ขอบคุณ @ETHproductions

เปรียบเทียบผลรวมกับ bitwise OR (เช่นpizzapants184และLeaky Nunทำ) คือ1 3 4 ไบต์ที่สั้นกว่าวิธีแรกของฉัน:

a=>(q=c=>eval(a.join(c)))`|`==q`+`

กรณีทดสอบ


Alt รุ่น 38 ไบต์

a=>!a.some((x,i)=>a.some(y=>i--&&x&y))

กรณีทดสอบ


ในทางเทคนิค pizzapants184 ตอบเร็วกว่าฉัน 14 วินาที ...
Leun Nun

-1 ไบต์:a=>(q=c=>eval(a.join(c)))`|`==q`+`;
ETHproductions

@ ETHproductions ดีมาก! ใช้งานได้ดีใน Node.js แต่คุณจัดการเพื่อให้มันทำงานในเบราว์เซอร์ได้หรือไม่?
Arnauld

ทำงานได้ดีสำหรับฉันใน Firefox 57. คุณได้รับข้อผิดพลาดหรือทำงานไม่ถูกต้องหรือไม่?
ETHproductions

@ETHproductions จริงแล้วใช่มันใช้งานได้ มันก็เกิดขึ้นที่จะล้มเหลวในrepl.it
Arnauld

2

Haskell , 38 ไบต์

(==).sum<*>foldl1 xorBoolเป็นที่ไม่ระบุชื่อฟังก์ชั่นกลับมา ((==).sum<*>foldl1 xor) [2,0,1]ใช้เป็น

import Data.Bits
(==).sum<*>foldl1 xor

ลองออนไลน์!

  • เคล็ดลับเดียวกันโดย pizzapants184 และ Leaky Nun ที่ทุกคนใช้ยกเว้นว่าด้วยชื่อโอเปอเรเตอร์ของ Haskell จะช่วยประหยัดหนึ่งไบต์ในการใช้ (bitwise) xorแทน(.|.)(bitwise หรือ)

  • (==).sum<*>foldl1 xorเป็นรุ่นที่ไม่มีค่าใช้\l->sum l==foldl1 xor lจ่าย


2

Java 8, 53 ไบต์

a->{int i=0,j=0;for(int x:a){i+=x;j|=x;}return i==j;}

คำตอบของเยลลี่พอร์ตของ@LeakyNunคำตอบวุ้น

คำอธิบาย:

ลองที่นี่

a->{             // Method with integer-array parameter and boolean return-type
  int i=0,j=0;   //  Two integers, both starting at 0
  for(int x:a){  //  Loop over the array
    i+=x;        //   Add them to the first integer
    j|=x;}       //   And bitwise-OR it with the second integer
  return i==j;}  //  Return if both integers are the same after the loop




1

แดง 78 ไบต์

f: func[x][b: :to-binary t: 0 s: b 0 foreach n x[t: t + n s: s or b n]s = b t]

มันทำงานอย่างไร:

Ungolfed:

Red []
f: func [x][         -  a function taking a block as an argument
    b: :to-binary    -  an alias for the to-binary function
    t: 0             -  set the sum of the numbers to 0
    s: b 0           -  set the "or" total to binary 0
    foreach n x[     -  for each number in the block
        t: t + n     -  add it to the sum
        s: s or b n  -  bitwise or of its binary representation with the total
    ]
    s = b t          - are the sum (binary) and the "or" total equal?
]

ลองออนไลน์!



0

แบตช์ 73 ไบต์

@set/as=o=0
@for %%i in (%*)do @set/as+=%%i,o^|=%%i
@if %s%==%o% echo 1

เอาท์พุท1สำหรับความจริงไม่มีอะไรที่เป็นเท็จ อีกหนึ่งพอร์ตที่ชัดเจนของอัลกอริทึมของ pizzapants184 / Leaky Nun


0

J , 10 ไบต์

+/=+./&.#:

ยังเป็นอีกหนึ่งโซลูชั่นของ pizzapants184 & Leaky Nun

มันทำงานอย่างไร?

+/.&.#: - แปลงตัวเลขเป็นไบนารี่, ใช้บิทคอยน์หรือกำลังสองและแปลงกลับจากไบนารี่เป็นทศนิยม

+/ - ลดอินพุตด้วยการเพิ่ม

= - มีค่าเท่ากันหรือไม่

ลองออนไลน์!

ทางเลือกที่ตรงไปตรงมา

J , 12 ไบต์

2>[:>./+/@#:

มันทำงานอย่างไร?

+/@#: - แปลงตัวเลขแต่ละตัวให้เป็นเลขฐานสองและหาผลรวมของแต่ละกำลังของ 2

>./ - หาค่าสูงสุด

2>- มันน้อยกว่า 2 หรือไม่ -> ความจริง

ลองออนไลน์!


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