उदय, क्रम, उदय


19

हमारे पास गैर-नकारात्मक पूर्णांकों का सख्ती से बढ़ता क्रम है, जैसे:

12 11 10

रुको! यह क्रम सख्ती से नहीं बढ़ रहा है, क्या यह है? खैर, संख्याएँ विभिन्न आधारों में लिखी जाती हैं। सबसे कम संभव आधार 2 है, सबसे बड़ा 10 है।

कार्य यह अनुमान लगाना है कि प्रत्येक संख्या को आधार लिखा गया है, ताकि:

  • अनुक्रम सख्ती से बढ़ रहा है,
  • ठिकानों का योग अधिकतम होता है।

उदाहरण के लिए, नमूने के लिए समाधान होगा:

6 8 10

क्योंकि उन आधारों के तहत अनुक्रम 8 9 10दशमलव बन जाता है - एक सख्ती से बढ़ता क्रम, और हम उन ठिकानों को खोजने में सक्षम नहीं हैं जिनके लिए अनुक्रम सख्ती से बढ़ रहा है और जिनकी राशि से बड़ा है 6+8+10

दूसरी सीमा के कारण एक समाधान 3 5 7संतोषजनक नहीं है: इस तथ्य के बावजूद कि अनुक्रम 5 6 7उन आधारों के तहत हो जाता है - हमें कुर्सियां ​​राशि को अधिकतम करने की आवश्यकता है, और 3+5+7 < 6+8+10

यदि किसी आधार के तहत 2<=b<=10श्रृंखला को सख्ती से बढ़ाना संभव है, उदाहरण के लिए:

102 10000 10

एक

0

आउटपुट होना चाहिए।

इनपुट अनुक्रम को उस तरीके से पारित किया जा सकता है जो आपके समाधान के लिए सबसे सुविधाजनक है (मानक इनपुट / कमांड लाइन पैरामीटर / फ़ंक्शन तर्क ...)।


1
है 1 3 5एक बढ़ती अनुक्रम? किस बारे में 1 7 22? (आधार 10 में)
दरवाज़े

हां, 1 3 5और 1 7 22दोनों आधार 10 के तहत बढ़ रहे हैं। इसलिए, दोनों मामलों का समाधान है 10 10 10, क्योंकि हमें यह भरोसा दिलाते हुए आधार को अधिकतम करने की आवश्यकता है कि अनुक्रम बढ़ रहा है जब n-th संख्या को n के बराबर आधार में लिखा जा रहा है। -साल का कार्यकाल।
pawel.boczarski

2
@ डेनिस हां, मेरा मतलब है सख्ती से बढ़ते क्रम। 1 1 1या 3 3 4नहीं उठ रहे हैं।
pawel.boczarski 20

3
यदि टिप्पणियों से संकेत मिलता है कि प्रश्न गलत व्याख्या के लिए खुला है, तो टिप्पणियों में उत्तर न दें। प्रश्न को संपादित करें ताकि अन्य लोग उत्तर लिखने में समय बर्बाद न करें जो आपको इसकी अलग तरह से व्याख्या करते हैं।
पीटर टेलर

3
और अस्पष्टताओं के विषय पर, मेरे जवाब में से एक टिप्पणी का दावा है कि हमें यह मान लेना चाहिए कि दिए गए आधार में संख्याएँ विहित रूप में लिखी गई हैं। यदि ऐसा है, तो कृपया " सबसे कम संभव आधार 2 है " वाक्यांश को सही करें जैसे " सबसे कम संभव आधार सबसे बड़े अंकों के मूल्य से एक है "।
पीटर टेलर

जवाबों:


13

पायथ, 31 30 29 बाइट्स

e+0f.x!sgM.:iVczdT2ZosN^STlcz

1 बाइट @ जेक्यूब को धन्यवाद।

प्रदर्शन। दोहन ​​परीक्षण।

एसटीडीआईएन पर इनपुट दिया गया है, अंतरिक्ष को अलग किया गया है। यदि नईलाइन से अलग इनपुट की अनुमति है, तो मैं प्रोग्राम को 2 बाइट्स से छोटा कर सकता हूं।

स्पष्टीकरण:

e+0f.x!sgM.:iVczdT2ZosN^STlcz
                                  Implicit: z = input(), T = 10, Z = 0, d = ' '
                        ST        [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
                          lcz     len(z.split())
                       ^          All combinations w/replacement of that length.
                    osN           Order by increasing sum.
   f                              Filter on
              czd                 z.split(' ')
            iV   T                Vectorize the "Convert to base" operation over 
                                  the integers as strings and the base sequence.
          .:      2               Take length 2 subsequences.
        gM                        Map the >= operation over them.
      !s                          Sum and logically negate.
    .x             Z              If that throws an error, returns 0 (e.g. reject)
 +0                               Prepend a 0, in case no sequences are found.
e                                 Take the end of the list.

1संभावित ठिकानों की सूची में शामिल करना सुरक्षित है i, क्योंकि जो पायथन के intबिलिन का उपयोग करता है , वह 1आधार के रूप में अनुमति नहीं देता है , और इसलिए हमेशा एक त्रुटि फेंकता है, जिसे पकड़ा और फ़िल्टर किया जाता है।


9

सीजेएम, 43 बाइट्स

0B,2>ea,m*{:+~}${ea::~_2$.b__Q|$=*@.b=}=p];

आदेश-पंक्ति तर्क पढ़ता है और एक सरणी प्रिंट करता है।

CJam दुभाषिया में इसे ऑनलाइन आज़माएं ।

उदाहरण

$ cjam rise.cjam 12 11 10
[6 8 10]
$ cjam rise.cjam 19 18 17
0

यह काम किस प्रकार करता है

0       e# Push a 0 (default return value).
B,2>    e# Push [0 ... 10] and remove the first two elements.
ea,     e# Push the number of command-line arguments (n).
m*      e# Cartesian power. Pushes all vectors of {2 ... 10}^n.
{:+~}$  e# Sort by the negated sums.
{       e# Find; for each vector V in {2 ... 10}^n:
  ea::~ e#   Evaluate each character of each command-line argument.
  _2$   e#   Copy the results and V.
  .b    e#   Vectorized base conversion (list to integer).
  __    e#   Push two copies.
  Q|$   e#   Deduplicate and sort the last copy.
  =     e#   Compare it to the first. Pushes 1/0 if equal/unequal.
  *     e#   Repeat the original result of .b that many times.
  @.b   e#   Vectorized base conversion (integer to list).
  =     e#   Compare the result to the modified command-line arguments.
        e#   Equality makes sure that the base was greater than all digits.
}=      e# If pushed 1, push V and break.
p       e# Print. Either prints the last V or 0 if none matched.
];      e# Clear the stack to avoid implicitly printing the 0 (if still present).

6

जूलिया, 176 156 145 118 109 99 97 बाइट्स

A->try p=NaN;flipud(map(i->(k=11;t=p;while t<=(p=parseint("$i",k-=1))end;k),flipud(A)))catch;0end

Ungolfed:

function anonfunc(i)
  # Start with k=11 so that it evaluates to 10 on first while iteration
  k=11
  # set t to the previous value of p
  # Note: p here gets held over between iterations within the map
  t=p
  # Iterate through, dropping k by 1 and evaluating the integer in
  # base k and stopping if the value drops below t
  # Note: "p=" expression inside conditional to ensure k-=1 is evaluated
  # at least once (to make NaN work as desired)
  while t<=(p=parseint("$i",k-=1))
  end
  # if it dropped below t, return the base, k to be the corresponding
  # element in the map
  return k
end

function f(A)
  # Using try/catch to return 0 if no acceptable base found
  try
    # This is a trick to make sure the comparison in the while loop
    # evaluates to false on the first use of it (last value in A)
    p=NaN
    # Apply anonfunc to each element of A, starting with the last element
    # and store the result in S
    S=map(anonfunc,flipud(A))
    # S is backwards, so flip it and return it
    return flipud(S)
  catch
    # Will throw to here if parseint fails with the base due to having
    # a digit not acceptable in the base
    return 0
  end
end

1d सरणी इनपुट के साथ उपयोग किया जाता है। यदि फ़ंक्शन को सौंपा गया है c, तो आप कॉल करेंगे c([12,11,10])और यह आउटपुट होगा [6,8,10]

नोट: मैंने dec(i)पार्सिंट कमांड के अंदर उपयोग किया था , लेकिन क्योंकि iएकल-वर्ण चर नाम है, और मुझे किसी घटक का उपयोग करने की आवश्यकता नहीं है, मैं "$i"एक ही परिणाम प्राप्त करता था।


आपको यहाँ कुछ अच्छी ट्रिक्स मिली हैं। अच्छा काम।
एलेक्स ए।

यह कोड पढ़ने के सामान्य बाएं से दाएं क्रम के तहत कड़ाई से घटते क्रम के लिए ठिकानों की जांच करता प्रतीत होता है।
pawel.boczarski

@ pawel.boczarski - मुझे यकीन नहीं है कि आपका क्या मतलब है, लेकिन अगर आप चाहें, तो मैं कुछ उदाहरण प्रदान कर सकता हूं जो कुछ इनपुट के लिए आउटपुट करता है। उदाहरण के लिए, यदि आप फ़ंक्शन को नाम निर्दिष्ट करते हैं c, तो c([12,11,10])आउटपुट [6,8,10], जो आवश्यक आधार हैं।
ग्लेन ओ

@ गेलो ओह, मैं देख रहा हूं। मैंने [12 11 10]इसके बजाय पंक्ति वेक्टर का उपयोग किया [12,11,10]और इसने अवांछित प्रभाव दिया।
pawel.boczarski

@ pawel.boczarski - आह, मैं देख रहा हूं। हाँ, यदि आप इसे पंक्ति वैक्टर के साथ काम करना चाहते हैं, तो आपको "फ्लिपप्ल" को "फ़्लिप्र" से बदलने की आवश्यकता होगी, इस स्थिति में यह ठिकानों की पंक्ति वेक्टर को लौटा देगा।
ग्लेन ओ

5

जूलिया, 259 204 183 बाइट्स

ग्लेन ओ की मदद से एक गुच्छा बचाया।

A->(M(x)=maxabs(digits(x))+1:10;S=[];X={};for i=M(A[1]),j=M(A[2]),k=M(A[3]) s=map(parseint,map(dec,A),[i,j,k]);all(diff(s).>0)&&(S=[S,sum(s)];X=[X,{[i,j,k]}])end;X==[]?0:X[indmax(S)])

असंगठित + स्पष्टीकरण:

function f(A)
    # Define a function to obtain the smallest possible base range
    M(x) = (maxabs(digits(x)) + 1):10

    # Define container arrays for the sums and bases
    S = []
    X = {}

    # Loop over all possible bases for each of the elements
    for i = M(A[1]), j = M(A[2]), k = M(A[3])
        # Parse each element of the input as a string
        # in the given base
        s = map(parseint, map(dec, A), [i,j,k])

        # Push the sum and bases if s is rising
        if all(diff(s) .> 0)
            S = [S, sum(s)]
            X = [X, {[i,j,k]}]
        end
    end

    # If X is empty, return 0, otherwise return the bases
    isempty(X) ? 0 : X[indmax(S)]
end

ठीक है, कुछ गोल्फिंग किया जाना चाहिए ... मानचित्र कमांड में "स्ट्रिंग" के बजाय "रीप्र" का उपयोग करें, वे इस संदर्भ में समान काम करेंगे और दो बाइट्स बचाएंगे। और हम parseint के लिए एक infix ऑपरेटर का उपयोग करके "\ = parseint" लिखकर और फिर p [x] [1], i) के बजाय x [1] \ i का उपयोग करके कुछ और बचत कर सकते हैं - "\" में एक और बाइट भाग, और फिर 8 बाइट्स की शुद्ध बचत के लिए पी के प्रत्येक उपयोग के लिए तीन की बचत। एक और बाइट को अधिकतम (अंक (x) ...) के साथ "अधिकतम (अंक (x)) के स्थान पर सहेजा गया है
Glen O

एक बड़ी बचत के लिए, छोरों के लिए मर्ज करें - उपयोग for i=M(A[1]):10,j=M(A[2]):10,k=M(A[3]):10 <code here>end;, गिराए गए दो end;एस के लिए आठ की बचत और `के साथ` के लिए `की जगह के लिए आठ ,
ग्लेन ओ

वास्तव में, हम पार्सिंट भाग के लिए और भी बेहतर कर सकते हैं। s=map(parseint,x,[i,j,k])अपने मूल समाधान के सापेक्ष 18 बाइट्स की बचत और मेरे पिछले सुझाए गए सुधार की तुलना में 18 बाइट्स का उपयोग करते हुए , पूरी तरह से पार्सिन्ट का नाम बदलना छोड़ दें । और इसके बजाय s==sort(unique(s)), all(diff(s).>0)एक और 3 बाइट्स को बचाने के लिए उपयोग करें।
ग्लेन ओ

वहाँ निश्चित रूप से अधिक है कि किया जा सकता है, लेकिन मैं इसे आप पर छोड़ दूंगा, और इसके बजाय अपने दृष्टिकोण के साथ आने की कोशिश करूंगा।
ग्लेन ओ

मामूली सुधार - मैंने अधिकतम के बजाय अधिकतम (...) का उपयोग करने का सुझाव दिया ... लेकिन जब यह एक बाइट बचाता है, तो यह एकल-अंक इनपुट मानों के लिए विफल रहता है, इसलिए आपको अधिकतम उपयोग करना होगा।
ग्लेन ओ

4

CJam (39 बाइट्स)

{Afb:X,9,2f+m*{X\.b__$_&=*},{:+}$0\+W=}

यह एक अनाम फ़ंक्शन है जो इनपुट को स्टैक पर दशमलव पूर्णांक के एक सरणी के रूप में लेता है और आउटपुट को एक सरणी या 0स्टैक पर पूर्णांक के रूप में छोड़ देता है । ऑनलाइन डेमो


इसके अलावा, यह आधारों के बजाय परिणामी पूर्णांकों के योग के आधार पर क्रमबद्ध होता है और इसमें वही समस्या है जो मेरे पिछले संशोधन में थी ( 19आधार संख्या 9 नहीं हो सकती)।
डेनिस

1
हम्म। सवाल कुछ सुधार की जरूरत है।
पीटर टेलर

@PeterTaylor पीए, बहाने;)
बीटा डेके

2

अजगर 2 (147 बाइट्स)

def x(s):
 q=int;c=10;o=q(s[-1])+1;l=[]
 for i in map(str,s)[::-1]:
    n=q(i,c)
    while o<=n:
        c-=1;n=q(i,c)
        if 3>c:return 0
    l=[c]+l;o=n
 return l

xकिलों की सूची के साथ फ़ंक्शन को कॉल करें ।

उदाहरण:

print x([12,11,10])

प्रिंट

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