एक क्रम बनाओ


12

पूर्णांक का एक अनुक्रम एक अनुक्रम है यदि इस क्रम में किसी भी दो लगातार संख्याओं के बीच अंतर -1 या 1 है और इसका पहला तत्व 0 है।

अधिक सटीक: a1, a2, ..., a एक अनुक्रम है यदि:

For any k (1 ≤  k < n): |a[k] - a[k+1]|=1, 
a[1]=0

इनपुट

  • n - अनुक्रम में तत्वों की संख्या
  • s - अनुक्रम में तत्वों का योग

उत्पादन

  • यदि संभव हो तो nतत्वों के योग के साथ एक एक अनुक्रम सेट / सूची / सरणी / लंबाई का आदिs
  • यदि संभव न हो तो एक खाली सेट / सूची / सरणी / आदि

उदाहरण

इनपुट के लिए 8 4, आउटपुट [0 1 2 1 0 -1 0 1]या हो सकता है [0 -1 0 1 0 1 2 1]। अन्य कब्जे हो सकते हैं।

इनपुट के लिए 3 5, आउटपुट खाली है [], क्योंकि यह नहीं किया जा सकता है।

नियम

यह एक कोड गोल्फ है, जो बाइट्स जीत में सबसे छोटा जवाब है। प्रस्तुतियाँ एक कार्यक्रम या कार्य होना चाहिए। इनपुट / आउटपुट किसी भी मानक तरीके से दिए जा सकते हैं


वैसे, मेरे पास एक प्रमाण है कि लंबाई के एक अनुक्रम के रूप में सभी संख्याएँ अभ्यावेदन एल के बीच की सभी संख्याएँ हैं (l-1)*l/2और -(l-1)*l/2जिनकी संख्या समान है (l-1)*l/2
गर्वित हैकेलर

यह एक कुशल एल्गोरिथ्म (O (n)) बनाने के लिए एक वांछित अनुक्रम बनाने के लिए इस्तेमाल किया जा सकता है
गर्वित हैकेलर

जवाबों:


7

CJam, 56 47 44 34 बाइट्स

यहाँ सुधार की बहुत गुंजाइश है, लेकिन यहाँ पर यह पहला प्रयास है:

L0aa{{[~_(]_)2++}%}l~:N;(*{:+N=}=p

{ ... }%भाग करने के कुशल तरीके के लिए डेनिस को श्रेय ।

यदि संभव हो तो सरणी प्रतिनिधित्व को प्रिंट करता है, अन्यथा ""

इसे यहाँ ऑनलाइन आज़माएँ


मैं भ्रमित हूं: {}%आपके कोड का हिस्सा मेरा जैसा कुछ नहीं दिखता (जो कि सिर्फ @ पीटरटयोर का कोड है, डॉट्स की जगह अंडरस्कोर लगाता है)। अगर मैंने आपके कोड में कुछ भी योगदान दिया है, तो यह {}=ऑपरेटर है ...
डेनिस

मेरे पास शुरू में _{_W=)+}%\{_W=(+}%+दो प्रतियाँ बना रहा था, पहले से 1 जोड़ रहा था , दूसरे से 1 घटा रहा था। आपके उदाहरण से मुझे पता चला कि एक { ... }%ब्लॉक में कैसे करना है । के बारे में { ... }=, मैंने पहले ही अपने प्रयोग में इसे कम कर दिया था, हालांकि अभी तक पोस्ट नहीं किया गया है।
अनुकूलक

मैं इस प्रश्न से समझता हूं कि दिए गए इनपुट 3 5का आउटपुट होना चाहिए []और नहीं""
पीटर टेलर

1
@PeterTaylor "एक खाली सेट / सूची / सरणी / आदि यदि संभव नहीं है" - तो मुझे लगता है कि मुझे अभी इसे स्पष्ट करना है ...
ऑप्टिमाइज़र

इसके अलावा, []pCJam में सिर्फ आउटपुट के लिए ""। तो इसकी भाषा कैसे खाली सरणियों का प्रतिनिधित्व करती है।
ऑप्टिमाइज़र

6

जावास्क्रिप्ट (E6) 79 82

F=(n,t,
  d=n+n*~-n/4-t/2,
  l=1,
  q=[for(x of Array(n))d<n--?++l:(d+=~n,--l)]
)=>d?[]:q

सभी टुपल्स की क्रूरता बल या गणना की कोई आवश्यकता नहीं है।

N n -1 चरणों के रूप में लंबाई n का एक क्रम देखें , प्रत्येक चरण वेतन वृद्धि या वृद्धि है।
ध्यान दें, आप केवल वेतन वृद्धि के लिए एक वेतन वृद्धि स्वैप कर सकते हैं, राशि 2 से भिन्न होती है, इसलिए किसी भी लंबाई के लिए राशि हमेशा या हमेशा विषम होती है।
सभी वेतन वृद्धि के बाद, अनुक्रम 0, 1, 2, 3, ..., n-1 है और हम जानते हैं कि योग है (n-1) * n / 2
अंतिम चरण को बदलना, योग 2 से बदलता है, इसलिए अंतिम चरण का वजन 2. अंतिम चरण
में अगला परिवर्तन, योग 4 से बदलता है, इसलिए अंतिम चरण का वजन 4 होता है। ऐसा इसलिए है क्योंकि क्रमिक चरण आंशिक योग पर अब तक का निर्माण करता है।
पिछले चरण को बदलते हुए, योग 6 से बदल जाता है, इसलिए अंतिम चरण का वजन 6 होता है (8 नहीं, यह द्विआधारी संख्या नहीं है)।
...
पहले चरण का वजन बदलना (n-1) * 2

कलन विधि

Find the max sum (all increments)  
Find the difference with the target sum (if it's not even, no solution)  
Seq[0] is 0  
For each step  
  Compare current difference with the step weight
  if is less 
     we have an increment here, seq[i] = seq[i-1]+1 
  else 
     we have a decrement here, seq[i] = seq[i-1]-1.  
     Subtract we current weight from the current diff.
If remaining diff == 0, solution is Seq[]. Else no solution

अघोषित कोड

F=(len,target)=>{
  max=(len-1)*len/2
  delta = max-target
  seq = [last=0]
  sum = 0
  weight=(len-1)*2
  while (--len > 0)
  {
    if (delta >= weight)
    {
      --last
      delta -= weight;
    }
    else
    {
      ++last
    }  
    sum += last
    seq.push(last);
    weight -= 2;
  }  
  if (delta) return [];
  console.log(sum) // to verify

  return seq
}

फ़ायरफ़ॉक्स / फायरबग कंसोल में टेस्ट करें

F(8,4)

उत्पादन

[0, -1, 0, -1, 0, 1, 2, 3]

5

GolfScript ( 41 39 बाइट्स)

[][1,]@~:^;({{.-1=(+.)))+}%}*{{+}*^=}?`

ऑनलाइन डेमो

41-> 39 के लिए डेनिस को धन्यवाद ।


आप छोटा कर सकते हैं ,0=करने के लिए ?। CJam के लिए एक सीधा बंदरगाह 5 बाइट्स छोटा होगा:L1,al~:S;({{_W=(+_)))+}%}*{:+S=}=p
डेनिस

@ डेनिस ऊह, यह दो {}% ब्लॉक की सवारी का आसान तरीका है। अगर मैं इसका उपयोग करूं तो मन?
ऑप्टिमाइज़र

@Optimizer: मैं नहीं, लेकिन यह वास्तव में मेरा काम नहीं है।
डेनिस

मैं { ... }%ब्लॉक के बारे में बात कर रहा था । मेरे कोड में, मेरे पास दो थे, इसे कम करने की कोशिश कर रहे थे 1. जैसा कि वास्तविक एल्गोरिदम जाता है, मुझे लगता है कि पीटर और मैंने दोनों एक ही एल्गोरिदम को लगभग एक ही समय में पोस्ट किया था।
ऑप्टिमाइज़र

3

गणितज्ञ, 73 बाइट्स

f=FirstCase[{0}~Join~Accumulate@#&/@Tuples[{-1,1},#-1],l_/;Tr@l==#2,{}]&;

सरल जानवर बल समाधान।

मैं सभी चरणों का चयन कर रहा हूं। फिर मैं एक-क्रम प्राप्त करने के लिए उन्हें संचित सूचियों में बदल देता हूं। और फिर मैं पहले वाले की तलाश कर रहा हूं जिसका योग दूसरे पैरामीटर के बराबर है। यदि कोई गैर है, तो डिफ़ॉल्ट मान है {}


गणितज्ञ बस गणित / संयोजन से संबंधित समस्याओं पर अपना रास्ता चमकाता है, है न? ;)
ऑप्टिमाइज़र

@Optimizer मुझे यकीन है कि CJam इसे फिर भी हरा देगा। ;) वास्तव में यह वही एल्गोरिथ्म CJam में करना मुश्किल नहीं होना चाहिए।
मार्टिन एंडर

1
यह निश्चित रूप से इसे हरा देगा, लेकिन सिर्फ छोटी विधि के नामों के कारण। एल्गोरिथ्म उतना सीधा नहीं होगा।
ऑप्टिमाइज़र

@ ऑप्टिमाइज़र, हुह? मुझे लगता है कि इस फंक्शन कॉम्प्लेक्शन की तुलना में यह एक साधारण लूप और फिल्टर के साथ अधिक सीधा है।
पीटर टेलर

3

हास्केल, 56 बाइट्स

n%s=[x|x<-scanl(+)0`map`mapM(\_->[1,-1])[2..n],s==sum x]

स्पष्टीकरण:

  • की 1,-1लंबाई और लंबाई n-1 के उदाहरणों के साथ एक सूची बनाएँ : replicateM n-1[-1,1]
    उदाहरण: replicateM 2 [-1,1]==[[-1,-1],[-1,1],[1,-1],[1,1]]
  • इसमें से एक-क्रम का निर्माण करें। scanlखराब प्रदर्शन है, लेकिन यह यहां सही काम करता है।
  • nजहाँ योग हो, वहाँ लंबाई के साथ सभी संभव एक-क्रम को फ़िल्टर करेंs

1
एक साधारण सुधार एक एक infix फ़ंक्शन को बदलना है। यहां एक और अधिक अनपेक्षित सुधार का संकेत दिया गया है: Control.Monadकेवल उसी का उपयोग करने के लिए आयात करना replicateMजो पहले से बहुत लंबा है। अनुकरण करने के लिए आप किस अन्य विवादास्पद कार्य का उपयोग कर सकते हैं replicateM?
गर्वित हैकेलर

वैसे, आपको केवल एक समाधान वापस करना चाहिए, इसलिए आपको head$अपने समाधान में जोड़ना चाहिए ।
गर्वित हैकेलर

headके []लिए नहीं लौटा [] :: [[a]]- और मैं त्रुटियों से नफरत है।
जोहान्स कुह्न

1
क्योंकि कुछ समय बीत चुका है, मैं आपको बताऊंगा कि मेरा क्या मतलब था। आप इस्तेमाल कर सकते हैं mapM(\x->[1,-1])[2..n]के बजाय sequenceऔर replicate
गर्वित हैकेलर

दिलचस्प। वह और भी छोटा है: P
जोहान्स कुह्न


0

CJam, 65 58 54 बाइट्स

बमुश्किल मेरे गणितज्ञ समाधान से कम है, लेकिन यह अभी भी CJam का ठीक से उपयोग नहीं करने के लिए मेरी गलती है:

0]]l~:S;({{_1+\W+}%}*{0\{+_}%);}%_{:+S=}#_@\i=\0>\[]?p

यह सचमुच एक ही एल्गोरिथ्म है: सब मिल n-1के -tuples {1, -1}। पहले एक का पता लगाएं जिसका संचय एक जैसा है s, पूर्वसर्ग करें 0। यदि कोई नहीं मिला तो एक खाली सरणी प्रिंट करें।


0

CJam, 40

CJam में एक और दृष्टिकोण।

ri,W%)\_:+ri-\{2*:T1$>1{T-W}?2$+\}/])!*p

0

रूबी (136)

def one_sequences(n)
  n.to_s.chars.map(&:to_i).each_cons(2).to_a.select{|x|x[0] == 0 && (x[1] == 1 || x[1]
  == -1)}.count
end

0

जे, ४ चरस

हर क्रम को कई अन्य उत्तरों की तरह देखता है। कम O (n) समाधान बनाने का प्रयास करेंगे।

   f=.4 :'(<:@#}.])(|:#~y=+/)+/\0,|:<:2*#:i.2^<:x'

   8 f 4
0 1 2 1 0 1 0 _1

   3 f 5
[nothing]

0

एपीएल 38

{⊃(↓a⌿⍨⍺=+/a←+\0,⍉1↓¯1*(⍵⍴2)⊤⍳2*⍵),⊂⍬}

उदाहरण:

     4 {⊃(↓a⌿⍨⍺=+/a←+\0,⍉1↓¯1*(⍵⍴2)⊤⍳2*⍵),⊂⍬}8
0 1 2 1 0 1 0 ¯1

इस एक के रूप में कई अन्य लोगों को बस हर संयोजन के माध्यम से मजबूर करता है कि एक मैच के लिए, अगर कुछ भी नहीं मिला। वास्तव में यह कोड को छोटा बनाने के लिए एक से अधिक बार कुछ संयोजनों की कोशिश करता है।

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