कोड गोल्फ सबसे अच्छा क्रमचय


14

चुनौती

पूर्णांक n , 4 को देखते हुए, पूर्णांक के एक क्रमचय का उत्पादन [0, n-1] इस संपत्ति के साथ किया जाता है कि लगातार दो पूर्णांक एक दूसरे के बगल में नहीं हैं। क्रमचय piका मूल्य abs(pi[i] - i)सभी सूचकांकों के लिए योग है i

उदाहरण

  • (1, 3, 0, 2) मूल्य है 6
  • (0, 2, 4, 1, 3) मूल्य है 6
  • (0, 2, 4, 1, 3, 5) मूल्य है 6
  • (0, 2, 4, 1, 5, 3, 6) मूल्य है 8

आपके उत्तर का स्कोर

आपके उत्तर का स्कोर n = 4 .. 14प्लस के लिए आपके क्रमपरिवर्तन के मूल्यों का योग है जो आपके कोड को बाइट करता है। स्कोर जितना कम होगा, उतना अच्छा होगा। आपके कोड को उन सभी मूल्यों के लिए मान्य आउटपुट देना होगा n

आपको अपनी मशीन पर अपना सबमिशन पूरा करने में सक्षम होना चाहिए।

संबंधों के मामले में, अंतिम स्कोर का समय जिसके परिणामस्वरूप प्रासंगिक स्कोर डिकोडर होगा।

इस रूप में एक ही सवाल नहीं है यह एक ?

लिंक किए गए प्रश्न के उत्तर इस प्रश्न के लिए प्रतिस्पर्धी नहीं होंगे क्योंकि वे क्रमचय के मूल्य को अनुकूलित करने के लिए कोई प्रयास नहीं करते हैं। उदाहरण के लिए n=10, वहां [1, 3, 5, 7, 9, 0, 2, 4, 6, 8]दिए गए अधिकांश उत्तरों द्वारा दिए गए क्रमपरिवर्तन से मान प्राप्त होता है 30। आप इससे बहुत बेहतर कर सकते हैं।

प्रश्न के क्रमचय भाग के लिए, अधिकतम मूल्य अधिकतम है 120। (@Laikoni को धन्यवाद।) जबकि डेनिस के पिछले प्रश्न का उत्तर 222 है । (@ User202729 पर साभार)


4
@ हर उत्तर को बिना किसी बदलाव के चित्रित किया जा सकता है, लेकिन इस चुनौती में बहुत बुरा होगा। उस कोड को इस चुनौती में पोस्ट करना कोड-समीक्षा से कोड-गोल्फ चुनौती के लिए कोड पोस्ट करने के बराबर है।
स्टीवी ग्रिफिन

2
स्कोर में विभिन्न मात्राओं को मिलाना वास्तव में समस्याग्रस्त हो सकता है। सर्वश्रेष्ठ एल्गोरिथ्म के साथ उत्तर को आमतौर पर किसी भी भाषा में पोर्ट किया जा सकता है, जिस स्थिति में स्कोरिंग सामान्य कोड गोल्फ में कम हो जाती है।
Angs

4
इष्टतम मान [6,6,6,8,10,12,12,12,14,16,18]120 के स्कोर के लिए हैं। दिलचस्प बात यह है कि यह पैटर्न A078706 में पाया जा सकता है ।
लकोनी

3
ठीक है, इससे अलग होना शुरू हो A078706जाता है n=17, जिसका स्कोर हो सकता है 20
लकोनी

4
मैं चुनौती को स्पष्ट और स्पष्ट रूप से समझ सकता हूं। यदि आप असहमत हैं और बंद करने के लिए मतदान करते हैं, तो यहां एक टिप्पणी छोड़ दें।
user202729

जवाबों:


7

जेली , 36 34 33 32 31 30 बाइट्स, परिणाम: 120

डेस के लिए शुक्रिया -1 बाइट! (संक्षेप में जेली बग को ठीक करके, हालांकि सुविधा चुनौती को स्थगित कर देती है)

ðRḟISị“Ƥ¿‘Ʋœ?$;@µ2x5~4¦ṁ_4$Ä’

नई सुविधा: संचित राशि ( Ä)।

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

1-अनुक्रमण का उपयोग करें।

रैखिक समय भी लेता है।


यह C ++ प्रोग्राम लेक्सिकोग्राफिक रूप से सबसे छोटा क्रमचय उत्पन्न करता है, यह मानते हुए | i - p i | ≤ चौड़ाई (जहां चौड़ाई है एक हार्डकोडेड निरंतर) के लिए सभी 0 ≤ मैं <n , के बारे में समय जटिलता के साथ हे (चौड़ाई 2 × 2 2 × चौड़ाई × एन) (जो सिर्फ हे (एन) तय करने के लिए चौड़ाई ): यह ऑनलाइन की कोशिश करो !


कैसे?

  1. C ++ प्रोग्राम को समस्या को हल करने के लिए प्रयास करके लिखें।
  2. पैटर्न का निरीक्षण करें। हम ध्यान दें कि 4 अंतिम वाले को छोड़कर सभी तत्वों का क्रम उपसर्ग है

    0 2 4 1 3 5 7 9 6 8 10 12 14 11 13 15 17 19 16 18 20 22 24 21 23 25 ...
    
  3. अनुक्रम के वृद्धिशील अंतर की गणना करता है।

    2 2 -3 2 2 2 2 -3 2 2 2 2 -3 2 2 2 2 -3 2 2 2 2 -3 2 2
    

    नोट 5 की अवधि।

  4. जेली कार्यान्वयन:

    • n-4 पहले तत्वों को ऊपर के अनुक्रम से लिया गया है। ओ (n)
    • के लिए 4 पिछले तत्वों, सिर्फ जानवर सभी 24 संभावनाओं के लिए मजबूरओ (१)

      (ध्यान दें: मैं अब 32-बाइट्स संस्करण से सभी 24 संभावनाओं पर बल नहीं देता)


आह, आप मेरे साथ एक अलग उपसर्ग के साथ गए। मेरा शुरू होता है 0 2 4 1 3 5 8 6, और एक बड़ा ब्रांचिंग कारक होता है , लेकिन ऐसा सरल पैटर्न नहीं होता है।
पीटर टेलर

7

सीजाम (60 बाइट्स + 120 = 180 स्कोर)

{_5/4*8e!961=7_)er<:A\,^e!{A\+}%{2ew::-:z1&!},{_$.-:z1b}$0=}

एकीकृत स्कोरिंग के साथ ऑनलाइन टेस्ट सूट

N = 24 तक विस्तार

विच्छेदन

{
  _5/4*        e# Work out how much of the hard-coded prefix to use
  8e!961=7_)er e# Prefix [0 2 4 1 3 5 8 6]
               e# I identified this by brute forcing up to n=10 and looking for patterns
               e# I then used the identified prefix [0 2 4 1] to brute-force further
  <:A          e# Take the desired prefix of the hard-coded array, and store a copy in A
  \,^e!        e# Generate all permutations of the values in [0 .. n-1] which aren't in A
  {A\+}%       e# Prepend A to each of them
  {            e# Filter...
    2ew::-     e#   Take each difference of two consecutive elements
    :z         e#   Find their absolute values
    1&         e#   Test whether 1 is among those absolute values
    !          e#   Reject if it is
  },
  {            e# Sort by...
    _$.-       e#   Take pairwise differences of permutation with the identity
    :z         e#   Absolute values
    1b         e#   Add them (by interpreting in base 1)
  }$
  0=           e# Take the first
}

बहुत प्रभावशाली! मैं यह जानने के लिए उत्सुक हूं कि आपने यह कैसे किया।
अनुश

यह 24 तक सभी तरह से इष्टतम है?
अनुष

@ मेरे कार्यक्रम के अनुसार, संभावना।
user202729

@Anush, मैंने इसे साबित नहीं किया है, लेकिन मेरा मानना ​​है कि इसकी संभावना है।
पीटर टेलर

मैं और भी अधिक अपने एल्गोरिथ्म द्वारा साज़िश कर रहा हूँ!
अनुश

6

हास्केल , 146 + 89 स्कोर + बाइट्स

f i|k<-mod i 4=scanl(+)1$take(i-2-k)(cycle[2,-3,2,3])++[[2],[2,2],[5,-3,2],[5,-3,2,2]]!!k

दोहराता पैटर्न [1,3,0,2], अंतिम mod i 4तत्व हाथ से बने होते हैं।

पिछला एल्गोरिथ्म (132 + 116):

f i=last$filter(\a->all(`elem`a)[0..i-1]).(!!(i-1)).iterate((\l->map((:l).(+head l))[-3,2,-2,3])=<<)$pure<$>[i-3..i]

लंबाई ± 2 या correct 3 की छलांग की सही संख्या को Bruteforces। पिछले एक का चयन करता है जिसमें सही संख्याएं हैं, बस ठीक काम करने लगता है और स्कोर को लागू करने की तुलना में बहुत सस्ता है। Tio अंतिम स्कोर से ठीक पहले समय निकालता है, जो 18 है।

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


2

जाप, १२० + २० = १४०

(दूसरी चुनौती से मेरे किसी समाधान की नकल करने से मुझे 227 का स्कोर मिला)

o á k_äa d¥1ÃñxÈaYÃg

इसे आज़माएँ या स्कोर जाँचने के लिए इस संस्करण का उपयोग करें । दोनों संस्करण 9 पर आपके आसपास से बाहर निकलने लग सकते हैं।


व्याख्या

o                        :Range [0,input)
  á                      :All permutations
    k_      Ã            :Remove sub-arrays that return true
      äa                 :  Get the consecutive absolute differnces
         d¥1             :  Do any equal 1?
               È  Ã      :Pass the integers in each remaining sub-array through a function
                aY       :  Get the absolute difference with the integer's index
              x          :Reduce by addition
             ñ           :Sort the main array by those values
                   ñ     :Return the first sub-array

9
" आपको अपनी मशीन को पूरा करने के लिए अपने सबमिशन को चलाने में सक्षम होना चाहिए। " क्या आपने सवाल पोस्ट किए जाने के बाद से दो घंटों में 14 तत्वों के 87E9 परमिट को संसाधित करने के लिए गंभीरता से प्रबंधन किया था?
पीटर टेलर

3
इसके अलावा, इस बात पर विचार करें कि Japt जावास्क्रिप्ट पर आधारित है, क्या यह वास्तव में 87E9 क्रमपरिवर्तन को संभाल सकता है? यह प्रश्न कहता है कि जावास्क्रिप्ट सरणी की लंबाई अधिकतम ~ 4E9 हो सकती है। क्या जाप में फंक्शन या कुछ और उत्पन्न होता है ... \
user202729

2

रूबी , 120 स्कोर + 112 106 91 82 बाइट्स

->n{(0...n).map{|a|a+(a+2)%5-([[],[],[0,4,3],[-1,4,4,4],[1,1,6,1]][n%5][a-n]||2)}}

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

अनुक्रम मूल रूप से है (a-2)+(a+2)%5

यदि n मॉड 5 0 या 1 नहीं है, तो अंतिम 3 या 4 तत्व अलग हैं।

यह अभी भी आधा-हार्डकोड है, हमेशा सबसे अच्छा समाधान ढूंढता है, हो सकता है कि यह थोड़ा अधिक गोल्फ हो सकता है, लेकिन मैंने विचारों से बाहर भाग लिया है।


1

जावास्क्रिप्ट (Node.js) , 148 स्कोर + 109 73 बाइट्स

n=>[...Array(n)].map(_=>l=!m|l>n%5+2&&l>m+2?[+m,m=l+2][0]:l+2,m=n>4,l=~m)

इसे ऑनलाइन आज़माएं! स्पष्टीकरण: lअंतिम संख्या का mट्रैक रखता है और विपरीत समता की अगली संख्या का ट्रैक रखता है l; एक बार lसे अधिक m+2चर का आदान-प्रदान कर रहे हैं। अनुक्रम की शुरुआत में एक समायोजन किया जाता है ताकि अनुक्रम जिनकी लंबाई 5 के गुणक नहीं हैं वे किसी भी संख्या को याद नहीं करते हैं, और एक और समायोजन किया जाता है n=4

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