पूर्व की बढ़ती अनुक्रम अनुक्रम


11

पृष्ठभूमि

एक पूर्व बढ़ती सेट अनुक्रम आदेश के पूर्णांक सेट के एक दृश्य के रूप में परिभाषित किया गया है एस 1 , एस 2 , , एस एन जो संतुष्ट निम्नलिखित:NS1,S2,,Sn

  • प्रत्येक की एक गैर खाली उपसमुच्चय है { 1 , 2 , , एन }Si{1,2,,N}
  • के लिए , एस मैंएस मैं + 1 = , यानी किसी भी लगातार दो सेट आम में कोई तत्व है।1i<nSiSi+1=
  • के लिए , मतलब की (औसत मूल्य) एस मैं सख्ती से की तुलना में कम है एस मैं + 11i<nSiSi+1

चुनौती

एक सकारात्मक पूर्णांक को देखते हुए N, क्रम में सबसे लंबे समय तक पूर्व-निर्धारित सेट अनुक्रम की लंबाई का उत्पादन होता है N

परीक्षण के मामलों

ये प्रोजेक्ट यूलर यूजर थंडर द्वारा परिणामों पर आधारित हैं ।

1 => 1 // {1}
2 => 2 // {1} {2}
3 => 3 // {1} {2} {3}
4 => 5 // {1} {2} {1,4} {3} {4}
5 => 7 // {1} {2} {1,4} {3} {2,5} {4} {5}
6 => 10 // {1} {2} {1,4} {3} {1,4,5} {2,3,6} {4} {3,6} {5} {6}
7 => 15 // {1} {2} {1,4} {3} {1,2,7} {3,4} {1,2,5,7} {4} {1,3,6,7} {4,5} {1,6,7} {5} {4,7} {6} {7}
8 => 21
9 => 29
10 => 39
11 => 49
12 => 63
13 => 79
14 => 99
15 => 121
16 => 145
17 => 171
18 => 203
19 => 237
20 => 277
21 => 321
22 => 369
23 => 419
24 => 477
25 => 537

नियम

मानक नियम लागू होते हैं। बाइट्स में सबसे कम वैध जमाव जीतता है।

इनाम

इस समस्या पर लगभग 4 साल पहले प्रोजेक्ट यूलर फोरम पर चर्चा की गई है , लेकिन हम एक बहुपद-समय एल्गोरिथ्म के संदर्भ में आने में असफल रहे N। इसलिए, मैं पहली बार जमा करने वाले को +200 इनाम दूंगा जो इसे प्राप्त करता है, या इसकी असंभवता साबित करता है।


मैंने एक हफ्ते में एक बहुपद-समय एल्गोरिथ्म या एनपी-कठोरता प्रमाण में कमी का उपयोग करके आने की कोशिश की है। क्या यहाँ किसी ने इस पर कोई प्रगति की है?
एनरिको बोरबा

जवाबों:


4

ब्रेकीलॉग , 28 बाइट्स

⟦₁⊇ᶠk⊇pSs₂ᶠ{c≠&⟨+/l⟩ᵐ<ᵈ}ᵐ∧Sl

इसे ऑनलाइन आज़माएं!

यह वास्तव में बहुत धीमी है। के लिए लगभग 30 सेकंड N = 3लगते हैं, और यह 12 मिनट के लिए पूरा नहीं हुआ N = 4

व्याख्या

⟦₁                             Take the range [1, …, Input]
  ⊇ᶠk                          Find all ordered subsets of that range, minus the empty set
     ⊇                         Take an ordered subset of these subsets
      pS                       Take a permutation of that subset and call it S
       Ss₂ᶠ                    Find all substrings of 2 consecutive elements in S
           {           }ᵐ      Map for each of these substrings:
            c≠                   All elements from both sets must be different
              &⟨+/l⟩ᵐ            And the average of both sets (⟨xyz⟩ is a fork like in APL)
                     <ᵈ          Must be in strictly increasing order
                         ∧Sl   If all of this succeeds, the output is the length of L.

तेज़ संस्करण, 39 बाइट्स

⟦₁⊇ᶠk⊇{⟨+/l⟩/₁/₁}ᵒSs₂ᶠ{c≠&⟨+/l⟩ᵐ<₁}ᵐ∧Sl

इसके लिए मेरे कंप्यूटर पर लगभग 50 सेकंड लगते हैं N = 4

यह एक ही कार्यक्रम है, सिवाय इसके कि हम एक यादृच्छिक क्रमपरिवर्तन लेने के बजाय औसतन सबसेट के उपसमुच्चय को क्रमबद्ध करते हैं। इसलिए हम {⟨+/l⟩/₁/₁}ᵒइसके बजाय उपयोग करते हैं p

{         }ᵒ     Order by:
 ⟨+/l⟩             Average (fork of sum-divide-length)
      /₁/₁         Invert the average twice; this is used to get a float average

हमें एक फ्लोट औसत प्राप्त करने की आवश्यकता है क्योंकि मैंने अभी एक हास्यास्पद बग की खोज की है जिसमें फ्लोट और पूर्णांक मूल्य से तुलना नहीं करते हैं, लेकिन आदेश की भविष्यवाणी के साथ टाइप करते हैं (यह इसलिए भी है कि मैं औसत का उपयोग करता हूं <ᵈऔर <₁दोनों की तुलना करने के लिए नहीं ; बाद की आवश्यकता होगी; काम करने के लिए डबल उलटा चाल)।


मैं धीरे-धीरे इस तरह से निपटने के लिए अपने तरीके से काम करने की योजना बना रहा था (क्योंकि @JonathanAllan ने अन्य टिप्पणी में इसका उल्लेख किया है), लेकिन मैं शायद इस तरह की किसी भी चीज़ के साथ आने के कुछ हफ्तों बाद हूं! मुझे पसंद है कि कैसे (ज्यादातर ब्रेकीलॉग जवाब की तरह) अंत में यह केवल सवाल का एक स्वच्छ प्रतिबंध जैसा दिखता है।
सूंदर -

@ सूंदर आप हमेशा बाद में वापस आ सकते हैं और एक समाधान को फिर से तलाशने की कोशिश कर सकते हैं!
घातक

3

CJam (81 बाइट्स)

{YY@#(#{{2bW%ee{)*~}%}:Z~{)Z__1b\,d/\a+}%$}%{_,1>{2ew{z~~&!\~=>}%0&!}{,}?},:,:e>}

ऑनलाइन डेमो । इसे 4उचित समय में इनपुट के लिए निष्पादित किया जाना चाहिए , लेकिन मैं उच्च इनपुट के साथ इसकी कोशिश नहीं करूंगा।

विच्छेदन

{                 e# Declare a block (anonymous function)
  YY@#(#          e# There are 2^N subsets of [0, N), but the empty subset is problematic
                  e# so we calculate 2^(2^N - 1) subsets of the non-empty subsets
  {               e# Map integer to subset of non-empty subsets:
    {             e#   Define a block to map an bitset to its set indices; e.g. 9 => [0 3]
      2bW%ee      e#     Convert to base 2, reverse, and index
      {)*~}%      e#     If the bit was set, keep the index
    }:Z           e#   Assign the block to variable Z
    ~             e#   Evaluate it
    {             e#   Map those indices to non-empty subsets of [0, N):
      )Z          e#     Increment (to skip the empty set) and apply Z
      __1b\,d/    e#     Sum one copy, take length of another, divide for average
      \a+         e#     Wrap the subset and prepend its average value
    }%
    $             e#   Sort (lexicographically, so by average value)
  }%
  {               e# Filter out subsets of subsets with conflicts:
    _,1>{         e#   If the length is greater than 1
      2ew         e#     Take each consecutive pair of subsets
      {           e#     Map:
        z~        e#       Zip and expand to get [score1 score2] [subset1 subset2]
        ~&!\      e#       No element in common => 1
        ~=        e#       Different scores => 0
        >         e#       1 iff both constraints are met
      }%
      0&!         e#     1 iff no consecutive pair failed the test
    }{
      ,           e#   Otherwise filter to those of length 1
    }?
  },
  :,:e>           e# Map to size of subset and take the greatest
}

1

जावास्क्रिप्ट (ईएस 6), 175 बाइट्स

एक भोली और धीमी गति से पुनरावर्ती खोज। TIO पर 7 पहले शब्दों की गणना करने में लगभग 15 सेकंड लगते हैं।

n=>(a=[...Array(n)].reduce(a=>[...a,...a.map(y=>[x,...y],x=n--)],[[]]),g=(p,b=a,n)=>a.map(a=>(m=a.map(n=>s+=++k*b.includes(n)?g:n,s=k=0)&&s/k)>p&&g(m,a,-~n),r=r>n?r:n))(r=0)|r

इसे ऑनलाइन आज़माएं!

या इस संशोधित संस्करण का परीक्षण करें जो सबसे लंबे समय तक पूर्व-निर्धारित क्रम को आउटपुट करता है।

कैसे?

{1,2,,n}a

a = [...Array(n)].reduce(a =>
  [...a, ...a.map(y => [x, ...y], x = n--)],
  [[]]
)

पुनरावर्ती भाग:

g = (                         // g = recursive function taking:
  p,                          //   p = previous mean average
  b = a,                      //   b = previous set
  n                           //   n = sequence length
) =>                          //
  a.map(a =>                  // for each set a[] in a[]:
    (m = a.map(n =>           //   for each value n in a[]:
      s +=                    //     update s:
        ++k * b.includes(n) ? //       increment k; if n exists in b[]:
          g                   //         invalidate the result (string / integer --> NaN)
        :                     //       else:
          n,                  //         add n to s
      s = k = 0)              //     start with s = k = 0; end of inner map()
      && s / k                //   m = s / k = new mean average
    ) > p                     //   if it's greater than the previous one,
    && g(m, a, -~n),          //   do a recursive call with (m, a, n + 1)
    r = r > n ? r : n         //   keep track of the greatest length in r = max(r, n)
  )                           // end of outer map()

1

पायथन 3 , 205 197 184 182 बाइट्स

  • सहेजे गए आठ इक्कीस करने के लिए धन्यवाद बाइट्स OVS
  • छत के लिए धन्यवाद दो बाइट्स बचाता है
f=lambda N,c=[[1]]:max([len(c)]+[f(N,c+[n])for k in range(N)for n in combinations(range(1,N+1),k+1)if not{*c[-1]}&{*n}and sum(c[-1])/len(c[-1])<sum(n)/len(n)]);from itertools import*

इसे ऑनलाइन आज़माएं!


केsum बजाय 197 बाइट्स का उपयोग करना chain.from_iterable
ओव्स

@ceilingcat धन्यवाद।
जोनाथन फ्रीच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.