সাবসেট-সমে এন-বিট পার্থক্য


14

আমি যে অন্য চ্যালেঞ্জটি লিখছি তার জন্য, আমাকে যাচাই করা দরকার যে পরীক্ষার কেসগুলি সীমাবদ্ধ পূর্ণসংখ্যার সাথে সমাধানযোগ্য। বিশেষত, খালি খালি পূর্ণসংখ্যার পূর্ণ সংখ্যা Aএবং একটি পূর্ণসংখ্যার বিট প্রস্থের জন্য আমাকে নিম্নলিখিতগুলি যাচাই করতে হবে n:

  1. সকল পূর্ণসংখ্যার aমধ্যে Aসন্তুষ্ট -2**(n-1) <= a < 2**(n-1)না (এর সাথে representable n-বিট দুই এর সম্পূরক পূর্ণসংখ্যার)।
  2. এর দৈর্ঘ্য এর Aচেয়ে কম 2**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

রেফারেন্স বাস্তবায়ন (পাইথন 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))

এটি অনলাইন চেষ্টা করুন!



খালি তালিকাটি কি আমাদের হ্যান্ডেল করা উচিত?
মিঃ এক্সকডার

@ মিঃ এক্সকোডার নো, আমি পরিষ্কার করব।
মেগো

উত্তর:


7

ওল্ফ্রাম ভাষা (ম্যাথমেটিকা) , 40 বাইট

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

এটি অনলাইন চেষ্টা করুন!

শর্ত 1 এক-উপাদান উপাদানগুলি সহ সমস্ত উপ-পর্বের জন্য 3 শর্ত পরীক্ষা করে বোঝানো হয়। সুতরাং আমরা সর্বোচ্চ গ্রহণ

  • প্রতিটি উপসেটের যোগফলের দ্বিগুণ,
  • প্রতিটি উপসেটের যোগফলের দ্বিগুণের চেয়ে কম lessণাত্মক এবং
  • পুরো সেট দৈর্ঘ্য

এবং এটি চেয়ে কম কিনা তা পরীক্ষা করুন 2^#2( #2বিট-প্রস্থের ইনপুটটি কোথায় )।

মাত্র 6 টি বাইটের ব্যয়ে আমরা এর Subsets@#সাথে প্রতিস্থাপন করতে পারি GatherBy[#,Arg], যা অনেক বেশি কার্যকরী কারণ এটি কেবলমাত্র দু'টি খারাপের সাবসেটকে গণনা করে: সমস্ত নন-নেগেটিভ মানগুলির উপসেট এবং সমস্ত নেতিবাচক মানগুলির উপসেট। (এটি কাজ করে কারণ পূর্বের এবং পরবর্তীগুলির Argজন্য একটি মূল্য রয়েছে ))0π


3

জেলি , 19 বাইট

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

এটি অনলাইন চেষ্টা করুন!

এটি mapped sum of powerset + length of setপ্রয়োজনীয় ব্যাপ্তিতে রয়েছে কিনা তা পরীক্ষা করা যথেষ্ট suff


1
আমি মনে করি (যদিও আমি নিশ্চিত নই) আপনি ( ÆẸ2*$
অচিহ্নিত

@ মিঃ এক্সকোডার এটি কাজ করে।
ব্যবহারকারী 202729

3

05 এ বি 1 ই , 13 12 11 বাইট

মিস্টার এক্সকোডারকে ধন্যবাদ 1 বাইট সংরক্ষিত

æ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

@ মিঃ এক্সকোডার: ওহ হ্যাঁ, ধন্যবাদ! (আমি ভুলে যেতে থাকি ±)
এমিগনা

2

জাভাস্ক্রিপ্ট (ES6), 75 63 58 বাইট

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

aনেতিবাচক এবং নন-নেতিবাচক উপাদানের যোগফলগুলির মধ্যে মিথ্যার যে কোনও উপসেটের যোগফল , তাই কেস ২ ব্যতীত সমস্ত কিছুর জন্য দুটি পরিমাণের পরিমাণ যথেষ্ট পরীক্ষা করে সম্পাদনা করুন: @ আর্নল্ডকে সংরক্ষিত 12 17 বাইট সংরক্ষণ করা হয়েছে।


আমার নির্বোধ পদ্ধতির চেয়ে অনেক বেশি ভাল। :-) এটি 61 বাইটে
আর্নল্ড

আসলে, আমরা কেবল 56 বাইটের জন্য লুপের মধ্যে পরীক্ষাটি প্রক্রিয়া করতে পারি ।
আর্নল্ড

([-2, -1, -2]) হ্যাক হয়েছে (3)
l4m2

@ l4m2 ভাল ক্যাচ প্রস্তাবিত ফিক্স (57 বাইট)
আর্নল্ড

@ আরনাউল্ড এখানে সমস্যাটি [-2, -2], 3কি সত্য হওয়া উচিত, না?
নীল

1

জেলি , 21 20 বাইট

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

এটি অনলাইন চেষ্টা করুন!

লিনিয়ার সময় জটিলতা সমাধান। দেখা যাচ্ছে যে সময়ের জটিলতাটি আমি খুব বেশি অনুমান করেছি

উনিশতম বাইটে, 2017-12-11 13-15-03Z, ব্যবহারকারীর দ্বারা 202729

@ নিউস্যান্ডবক্সডপোস্টগুলি "রিয়েল" সাবসেটের যোগ সমস্যা অনেক বেশি শক্ত। রৈখিক সময়ে এটি করা যেতে পারে ...

কারণ এখন আমি বুঝতে পারি অ্যারে বাছাই করা সম্পূর্ণ অপ্রয়োজনীয়।


ব্যাখ্যা:

»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¦হতে পারে ;~। সম্পাদনা: সম্পন্ন
ব্যবহারকারী 202729

@ ব্যবহারকারী202729 ভুল। তবুও, ;~$কাজ করবে।
ব্যবহারকারী 202729

1

জাভাস্ক্রিপ্ট (ES6), 114 বাইট

বাক্য গঠন সিনট্যাক্সে ইনপুট নেয় (A)(n)। একটি বুলিয়ান ফেরত দেয়।

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

ক্লোজার, 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 টি বাইট সংরক্ষণ করা হয়েছে to


@ ব্যবহারকারী202729 আমি ওপিকে জিজ্ঞাসা করেছি, এবং আমাদের খালি তালিকাটি পরিচালনা করতে হবে না
মিঃ এক্সকোডার

0

কাস্তে , 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.