การเปลี่ยนแปลง N-bit ในเซตย่อยรวม


14

สำหรับความท้าทายอื่นที่ฉันกำลังเขียนฉันต้องตรวจสอบว่ากรณีทดสอบสามารถแก้ไขได้ด้วยจำนวนเต็มที่มีขอบ โดยเฉพาะฉันต้องตรวจสอบสิ่งต่อไปนี้สำหรับอาร์เรย์ที่ไม่ว่างเปล่าของจำนวนเต็มAและความกว้างบิตจำนวนเต็มn:

  1. จำนวนเต็มทั้งหมดที่aอยู่ในAความพึงพอใจ-2**(n-1) <= a < 2**(n-1)(สามารถแสดงได้ด้วยnจำนวนเต็มแบบเต็มของบิตสอง)
  2. ความยาวของมีค่าน้อยกว่าA2**n
  3. ผลรวมของการตอบสนองA-2**(n-1) <= sum(A) < 2**(n-1)
  4. การรวมองค์ประกอบAทั้งหมดเข้าด้วยกันเป็นไปตามเงื่อนไขข้างต้นทั้งหมด

โดยธรรมชาติฉันได้ตัดสินใจที่จะส่งต่อปัญหานี้ให้คุณ!

กำหนดอาร์เรย์ของจำนวนเต็มAและความกว้างบิตจำนวนเต็มบวกnตรวจสอบว่าAตรงตามเงื่อนไขข้างต้น

กรณีทดสอบ

[0, 0, 0], 2: True
[0, 0, 0, 0], 2: False (violates #2)
[1, 2, 3, 4, 5], 8: True
[1, 2, 3, 4, 5], 2: False (violates all conditions)
[1, 2, 3, 4, 5], 5: True
[-3, 4, 1], 4: True
[10, 0, -10], 4: False (violates #1 and #4)
[27, -59, 20, 6, 10, 53, -21, 16], 8: False (violates #4)
[-34, 56, 41, -4, -14, -54, 30, 38], 16: True
[-38, -1, -11, 127, -35, -47, 28, 89, -8, -12, 77, 55, 75, 75, -80, -22], 7: False (violates #4)
[-123, -85, 6, 121, -5, 12, 52, 31, 64, 0, 6, 101, 128, -72, -123, 12], 12: True

การดำเนินการอ้างอิง (Python 3)

#!/usr/bin/env python3
from itertools import combinations
from ast import literal_eval


def check_sum(L, n):
  return -2**(n-1) <= sum(L) < 2**(n-1)


def check_len(L, n):
  return len(L) < 2**n


def check_elems(L, n):
  return all(-2**(n-1) <= a < 2**(n-1) for a in L)


A = literal_eval(input())
n = int(input())
OUTPUT_STR = "{}, {}: {}".format(A, n, "{}")

if not (check_elems(A, n) and check_len(A, n) and check_sum(A, n)):
  print(OUTPUT_STR.format(False))
  exit()

for k in range(1, len(A)):
  for b in combinations(A, k):
    if not check_sum(b, n):
      print(OUTPUT_STR.format(False))
      exit()

print(OUTPUT_STR.format(True))

ลองออนไลน์!



เราต้องจัดการกับรายการที่ว่างเปล่าหรือไม่?
Mr. Xcoder

@ Mr.Xcoder ไม่ฉันจะอธิบาย
Mego

คำตอบ:


7

ภาษา Wolfram (Mathematica)ขนาด 40 ไบต์

Max[x=2Tr/@Subsets@#,-x-1,Tr[1^#]]<2^#2&

ลองออนไลน์!

เงื่อนไข 1 ถูกบอกเป็นนัยโดยการตรวจสอบเงื่อนไข 3 สำหรับชุดย่อยทั้งหมดรวมถึงชุดย่อยที่มีองค์ประกอบเดียว ดังนั้นเราจึงใช้ประโยชน์สูงสุด

  • ผลรวมของแต่ละชุดย่อยสองเท่า
  • หนึ่งลบน้อยกว่าสองเท่าของผลรวมของแต่ละชุดย่อยและ
  • ความยาวของทั้งชุด

และตรวจสอบว่ามีค่าน้อยกว่า2^#2(ซึ่ง#2เป็นอินพุตความกว้างบิต)

ด้วยราคาเพียง 6 ไบต์เท่านั้นเราสามารถแทนที่Subsets@#ด้วยGatherBy[#,Arg]ซึ่งมีประสิทธิภาพมากกว่าเพราะคำนวณได้เพียงสองชุดย่อยที่แย่ที่สุด: ชุดย่อยของค่าที่ไม่ใช่ค่าลบทั้งหมดและชุดย่อยของค่าลบทั้งหมด (ใช้งานArgได้เพราะมีค่าเป็นของ0ในอดีตและπในภายหลัง)


3

เยลลี่ขนาด 19 ไบต์

ŒPS€;⁸L¤ḟ⁹’2*$ŒRṖ¤Ṇ

ลองออนไลน์!

มันเพียงพอที่จะตรวจสอบว่าmapped sum of powerset + length of setอยู่ในช่วงที่ต้องการ


1
ฉันคิดว่า (แม้ว่าฉันไม่แน่ใจ) คุณสามารถใช้ÆẸแทน2*$(ยังไม่ได้ทดสอบ)
Mr. Xcoder

@ Mr.Xcoder มันใช้งานได้
user202729

3

05AB1E , 13 12 11 ไบต์

บันทึก 1 ไบต์ต้องขอบคุณMr. Xcoder

æO·D±¹gMIo‹

ลองออนไลน์!

คำอธิบาย

æ             # powerset of first input
 O            # sum each subset
  ·           # multiply each element by 2
   D          # duplicate
    ±         # bitwise negation of each element in the copy
     ¹g       # push length of first input
       M      # get the maximum value on the stack
        Io    # push 2**<second input>
          ‹   # compare

@ Mr.Xcoder: โอ้ใช่ขอบคุณ! (ฉันลืมไปแล้ว±)
Emigna

2

JavaScript (ES6), 75 63 58 ไบต์

a=>n=>!a.some(e=>(a.length|2*(e<0?l-=e:u+=e))>>n,u=0,l=-1)

ผลรวมของส่วนย่อยของการaโกหกใด ๆระหว่างผลรวมขององค์ประกอบเชิงลบและไม่ใช่เชิงลบดังนั้นการตรวจสอบสองผลรวมเพียงพอสำหรับทุกอย่างยกเว้นกรณีที่ 2 แก้ไข: บันทึก12 17 17 ไบต์ขอบคุณ @Arnauld


ดีกว่าวิธีไร้เดียงสาของฉันมาก :-) นี่สามารถย่อให้เหลือ61 ไบต์
Arnauld

อันที่จริงเราก็สามารถดำเนินการทดสอบภายในห่วงสำหรับ56 ไบต์
Arnauld

แฮ็กเมื่อ ([-2, -1, -2]) (3)
l4m2

@ l4m2 จับได้ดี การแก้ไขที่แนะนำ (57 ไบต์)
Arnauld

@Arnauld ปัญหาที่นี่คือที่[-2, -2], 3ควรจะเป็นจริงไม่มี
Neil

1

เยลลี่ , 21 20 ไบต์

»0,«0$S€~2¦Ḥ;LṀ<2*Ɠ¤

ลองออนไลน์!

โซลูชันความซับซ้อนเชิงเส้นเวลา ปรากฎว่าฉันประเมินความซับซ้อนของเวลามากเกินไป

ใน The Nineteenth Byte, 2017-12-11 13-15-03Z,โดย user202729

@NewSandboxedPosts ปัญหาผลรวมเซ็ตย่อย "ของจริง" นั้นยากกว่ามาก สิ่งนี้สามารถทำได้ในเวลาเชิงเส้นตรง ...

เพราะตอนนี้ฉันรู้ว่าการเรียงลำดับอาเรย์นั้นไม่จำเป็นเลย


คำอธิบาย:

»0,«0$S€~2¦Ḥ;LṀ<2*Ɠ¤    Main link. Example list: [-1, 0, 1]
»0                      Maximize with 0. Get [0, 0, 1]
  ,                     Pair with
   «0$                    minimize with 0. Get [-1, 0, 0]
      S€                Sum €ach. Get [1, -1]
        ~               Inverse
          ¦               at element
         2                2. (list[2] = ~list[2]) Get [-1, 2]
           Ḥ            Unhalve (double, ×2). Get [-2, 4]
            ;           Concatenate with
             L            Length (3). Get [-2, 4, 3]
              Ṁ         Maximum of the list (4).
               <   ¤    Still less than
                2         two
                 *        raise to the power of
                  Ɠ       eval(input())


ดูเหมือนว่าจะสามารถ~2¦ ;~แก้ไข: เสร็จแล้ว
user202729

@ user202729 ผิด ยัง;~$จะทำงาน
user202729

1

JavaScript (ES6), 114 ไบต์

(A)(n)จะเข้าในไวยากรณ์ currying ส่งคืนบูลีน

A=>n=>!(A.reduce((a,x)=>[...a,...a.map(y=>[x,...y])],[[]]).some(a=>(s=eval(a.join`+`),s<0?~s:s)>>n-1)|A.length>>n)

กรณีทดสอบ



1

Clojure, 121 117 ไบต์

#(let[l(int(Math/pow 2(dec %2)))](every?(set(range(- l)l))(cons(count %)(for[i(vals(group-by pos? %))](apply + i)))))

ทีนี้มันก็ค่อนข้างโง่การแยกเป็นค่าบวกและลบนั้นดีกว่าการเรียงลำดับ ต้นฉบับ แต่ไม่น่าแปลกใจอีกต่อไป:

#(let[l(int(Math/pow 2(dec %2)))S(sort %)R reductions](every?(set(range(- l)l))(concat[(count S)](R + S)(R +(into()S)))))

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

(into () S)มีผลบังคับใช้เช่นเดียว(reverse S)กับรายการที่เติบโตจากหัว ฉันไม่สามารถคิดหาวิธีที่จะใช้consแทนconcatเมื่อมีสองรายการที่จะconsไป : /


1

เยลลี่ 15 ไบต์

ŒPS€Ḥ;~$;LṀl2<Ɠ

ลองออนไลน์!

คำอธิบาย

ŒPS€Ḥ;~$;LṀl2<Ɠ ~ Monadic full program.

ŒP              ~ Powerset.
  S€            ~ The sum of each subset.
    Ḥ           ~ Double (element-wise).
     ;~$        ~ Append the list of their bitwise complements.
        ;L      ~ Append the length of the first input.
          Ṁ     ~ And get the maximum.
           l2   ~ Base-2 logarithm.
             <Ɠ ~ Is smaller than the second input (from stdin)?

บันทึก 1 ไบต์ขอบคุณที่เก็บเหรียญหยอดเหรียญ (อ่านอินพุตที่สองจาก STDIN แทน CLA)



0

Husk , 14 ไบต์

≥Lḋ▲ṁ§eLöa→DΣṖ

ไปกับแรงเดรัจฉานด้วยการวนลูปในรายการย่อยทั้งหมดเนื่องจากการแยกส่วนที่เป็นบวกและลบจะใช้จำนวนไบต์มากขึ้น ลองออนไลน์!

คำอธิบาย

≥Lḋ▲ṁ§eLöa→DΣṖ  Implicit inputs, say A=[1,2,3,4,5] and n=5
             Ṗ  Powerset of A: [[],[1],[2],[1,2],..,[1,2,3,4,5]]
    ṁ           Map and concatenate:
                  Argument: a sublist, say S=[1,3,4]
            Σ     Sum: 8
           D      Double: 16
          →       Increment: 17
        öa        Absolute value: 17
     §eL          Pair with length of S: [3,17]
                Result is [0,1,1,3,1,5,2,7,..,5,31]
   ▲            Maximum: 31
  ḋ             Convert to binary: [1,1,1,1,1]
 L              Length: 5
≥               Is it at most n: 1

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