पहले n बाउंसी नंबरों का योग खोजें


19

शब्दावली

एक बढ़ती हुई संख्या वह है जहां प्रत्येक अंक उसके बाईं ओर के सभी अंकों से अधिक या बराबर होता है (उदा। 12239)

एक घटती संख्या वह है जहां प्रत्येक अंक उसके बाईं ओर के सभी अंकों से कम या बराबर होता है (उदा। 95531)

बाउंसी संख्या वह संख्या है जो बढ़ती या घटती नहीं है। चूंकि इसके लिए कम से कम 3 अंकों की आवश्यकता होती है, इसलिए पहली बाउंसी संख्या 101 है

काम

1 से अधिक या एक पूर्णांक n को देखते हुए, पहले n बाउंसी संख्याओं का योग ज्ञात कीजिए

नियम

  • यह कोड गोल्फ है, इसलिए कम से कम बाइट्स जीत के साथ जवाब
  • यदि आपकी भाषा में पूर्णांक आकार की सीमाएँ हैं (उदा। 2 ^ 32-1) n इतना छोटा होगा कि योग पूर्णांक में फिट होगा
  • इनपुट किसी भी उचित रूप में हो सकता है (स्टडिन, फ़ाइल, कमांड लाइन पैरामीटर, पूर्णांक, स्ट्रिंग, आदि)
  • आउटपुट कोई भी उचित रूप हो सकता है (स्टडआउट, फ़ाइल, चित्रमय उपयोगकर्ता तत्व जो संख्या प्रदर्शित करता है, आदि)

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

1 > 101
10 > 1065
44701 > 1096472981

3
मुझे यकीन नहीं है कि मैं आपके प्रतिबंधों को समझता हूं। क्या मैं sortनंबर और जांच कर सकता हूं कि क्या वे मूल संख्या के समान हैं? यह बिल्ट-इन ( sort) का उपयोग कर रहा है , लेकिन अगर यह बढ़ रहा है तो यह जांचने के लिए कड़ाई से निर्मित नहीं है। की जाँच करें गैर नमूदार कार्यक्रम की आवश्यकताओं और क्या एक्स वाई के बिना हमारे "इन चीज़ों से बचें" मेटा पोस्ट पर।
AdmBorkBork

5
नमस्ते, PPCG में आपका स्वागत है! हालांकि यह एक अच्छी पहली पोस्ट (+1) है, मेरे पास कुछ छोटे सुझाव हैं: कोई बिल्ट नहीं है कि अगर कोई संख्या बढ़ रही है , तो इसका उपयोग करें , कोई बिल्ड नहीं है जो यह जांचता है कि क्या एक स्ट्रिंग लेक्सोग्राफिक रूप से बढ़ रही है, का उपयोग किया जा सकता है (अंतर्निहित इन्स को हटाना) चुनौतियों को लिखने से बचने के लिए एक चीज है ; हमारे पास प्रस्तावित चुनौतियों के लिए एक सैंडबॉक्स है , जहां आप फीडबैक और मार्गदर्शन प्राप्त करने के लिए प्रस्तुत करने से पहले अपने पोस्ट विचार साझा कर सकते हैं :)
मिस्टर एक्सकोडर

मैं बेहतर लिंक आप पोस्ट की "अपवाद" श्रेणी मैच के लिए प्रतिबंध अपडेट
avern

4
मैं अभी भी पहली बार में इस तरह के प्रतिबंध के बिंदु को नहीं देखता हूं। बेशक, यह आप पर निर्भर है कि इसे रखें या नहीं, लेकिन बिल्ट-इन की मनाही करना आमतौर पर बुरा व्यवहार है। यदि आपको लगता है कि चुनौती बिल्ट-इन द्वारा तुच्छ है, तो आपको ध्यान देना चाहिए कि बस उन्हें सीमित करने से कार्य को अधिक रोचक नहीं बनाया जा सकता है, बल्कि बॉयलरप्लेट को जोड़ा जाता है। क्या आप उस प्रतिबंध को हटाने पर विचार कर सकते हैं? (वैसे, यह अभी भी Y के बिना Do X के अंतर्गत आता है ) अन्यथा, मुझे यह विचार काफी पसंद है, और मैं वास्तविक कार्य से हटने के लिए थोड़ा व्यक्तिपरक प्रतिबंध नहीं चाहूंगा।
श्री एक्सकोडर

10
मैंने हालांकि प्रतिबंध को हटा दिया है, क्योंकि यह स्पष्ट है कि यह उस समुदाय के लिए अधिक सुखद है, और यहां दिशानिर्देशों और सर्वोत्तम प्रथाओं पर भरोसा करेंगे जो सुनिश्चित करते हैं कि चुनौतियां सबसे अच्छी गुणवत्ता की हैं
औसतन

जवाबों:


8

जेली , 10 8 बाइट्स

ṢeṚƬ¬µ#S

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

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

ṢeṚƬ¬µ#S  Main link. No arguments.

      #   Read an integer n from STDIN and call the chain to the left with argument
          k = 0, 1, 2, ... until n of them return a truthy result.
          Yield the array of successful values of k.
     µ    Monadic chain. Argument: k (integer)
Ṣ           Sort, after promoting k to its digit array.
  ṚƬ        Reverse 'til the results are no longer unique and yield unique results.
            Calling Ṛ on k promotes it to its digit array. If k = 14235, the 
            result is [14235, [5,3,2,4,1], [1,4,2,3,5]].
 e          Check if the result to the left appears in the result to the right.
    ¬       Negate the resulting Boolean.
       S  Take the sum.

4
+1 ṚƬबेहद साफ-सुथरा है ...
श्री एक्सकोडर

6

अजगर , 10 बाइट्स

s.f!SI#_B`

यहाँ यह कोशिश करो!

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

sf! SI # _B` - पूर्ण कार्यक्रम। STDIN से एक पूर्णांक Q लेता है और STDOUT को आउटपुट करता है।
 .f - पहला Q धनात्मक पूर्णांक ज्ञात करें जो एक निश्चित स्थिति को संतुष्ट करता है।
   ! SI # _B - शर्त। केवल बाउंसी संख्याओं के लिए सही रिटर्न।
       _B` - एक स्ट्रिंग के लिए संख्या डाली और अपने रिवर्स के साथ द्विभाजित (जोड़ी)।
      # - फ़िल्टर-उन रखें ...
     मैं - कि अंडरवियर्स हैं ...
    एस - सॉर्टिंग।
           - स्पष्ट करने के लिए, मैं (अपरिवर्तनीय) एक पाइथ ऑपरेटर है जो दो इनपुट लेता है, a 
             फ़ंक्शन और एक मान और जाँचता है कि फ़ंक्शन (मान) == मान है, इसलिए
             यह तकनीकी रूप से बिल्ट-इन नहीं है।
   ! - तार्किक नहीं। खाली सूची को सही, अन्य मानों को गलत पर मैप किया जाता है।
s - सम।

4

के (ngn / k) , 37 बाइट्स

{+/x{{(a~&\a)|a~|\a:10\x}(1+)/x+1}\0}

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

{ } तर्क के साथ एक कार्य है x

x{ }\0मध्यवर्ती परिणामों को संरक्षित करते हुए, समय {}पर लागू होता है0 x

(1+) उत्तराधिकारी कार्य है

{ }(1+)/x+1उत्तराधिकारी फ़ंक्शन को x+1तब तक शुरू करता है जब तक कि {}रिटर्न सही न हो

10\x के दशमलव अंक हैं x

a: को आवंटित a

|\ की अधिकतम-स्कैन (आंशिक मैक्सिमा) है a

&\ अनुरूपता, मिन-स्कैन है

a~|\aकरता है aउसकी अधिकतम स्कैन से मेल खाते हैं?

| या

a~&\a इसकी न्यूनतम स्कैन?

+/ योग


4

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

f=(i,n=0,k,p)=>i&&([...n+''].map(x=>k|=x<p|2*(p<(p=x)))|k>2&&i--&&n)+f(i,n+1)

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

टिप्पणी की गई

f = (                     // f = recursive function taking:
  i,                      //   i = number of bouncy numbers to find
  n = 0,                  //   n = current value
  k,                      //   k = bitmask to flag increasing/decreasing sequences
  p                       //   p = previous value while iterating over the digits
) =>                      //
  i && (                  // if there's still at least one number to find:
    [...n + '']           //   turn n into a string and split it
    .map(x =>             //   for each digit x in n:
      k |=                //     update k:
        x < p |           //       set bit #0 if x is less than the previous digit
        2 * (p < (p = x)) //       set bit #1 if x is greater than the previous digit
                          //       and update p
    )                     //   end of map()
    | k > 2               //   if both bits are set (n is bouncy):
    && i--                //     decrement i
    && n                  //     and add n to the total
  ) + f(i, n + 1)         //   add the result of a recursive call with n + 1

3

पायथन 2, 110 92 89 बाइट्स

n=input()
x=s=0
while n:b={-1,1}<=set(map(cmp,`x`[:-1],`x`[1:]));s+=x*b;n-=b;x+=1
print s

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

यह फ़ंक्शन निर्धारित करता है कि कोई संख्या उछालभरी है:

lambda x:{-1,1}<=set(map(cmp,`x`[:-1],`x`[1:]))

आप सीधे पात्रों की तुलना कर सकते हैं। वास्तव में, आपका सेट समझ बन सकता है set(map(cmp,`x`[:-1],`x`[1:]))
जैकब

@ जाकोब धन्यवाद। मैं हमेशा भूल जाता हूं mapकि आप इस तरह से उपयोग कर सकते हैं ।
mbomb007

1
x=s=0\nwhile n:b={-1,1}<=set(map(cmp,`x`[:-1],`x`[1:]));s+=x*b;n-=b;x+=13 बाइट्स बचाता है
श्री Xcoder


3

रेटिना , 93 बाइट्स

K`:
"$+"{/(?=.*;(_*);\1_)(?=.*_(_*);\2;)/^{`:(#*).*
:$1#;$.($1#
)`\d
*_;
)`:(#+).*
$1:$1
\G#

इसे ऑनलाइन आज़माएं! स्पष्टीकरण:

K`:

आरंभ में s=i=0। ( sकी संख्या है #से पहले रों :, iकी संख्या #के बाद एस।)

"$+"{
...
)`

दोहराएँ nबार।

/(?=.*;(_*);\1_)(?=.*_(_*);\2;)/^{`
...
)`

जब तक iउछाल न हो तब तक दोहराएं ।

:(#*).*
:$1#;$.($1#

वृद्धि iऔर दशमलव में एक प्रतिलिपि बनाएँ।

\d
*_;

कॉपी के अंकों को एकात्मक में बदलें। बाउंसनेस टेस्ट एक्री कॉपी का उपयोग करता है, इसलिए यह केवल एक बार काम करता है iकम से कम एक बार इंक्रीमेंट किया गया है।

:(#+).*
$1:$1

जोड़े iको sऔर एकल अंकों की प्रतिलिपि को हटाना है, ताकि आंतरिक पाश की अगली पारित करने के लिए bounciness परीक्षण विफल रहता है और iएक बार में कम से कम वृद्धि की जाती हो जाता है।

\G#

sदशमलव में परिवर्तित करें।

121 बाइट संस्करण दशमलव में गणना करता है, इसलिए बड़े मूल्यों के लिए काम कर सकता है n:

K`0:0
"$+"{/(?=.*;(_*);\1_)(?=.*_(_*);\2;)/^{`:(\d+).*
:$.($1*__);$.($1*__)
)+`;\d
;$&*_;
)`\d+:(\d+).*
$.(*_$1*):$1
:.*

इसे ऑनलाइन आज़माएं! स्पष्टीकरण:

K`0:0

आरंभ में s=i=0

"$+"{
...
)`

दोहराएँ nबार।

/(?=.*;(_*);\1_)(?=.*_(_*);\2;)/^{`
...
)

जब तक iउछाल न हो तब तक दोहराएं ।

:(\d+).*
:$.($1*__);$.($1*__)

वेतन वृद्धि iऔर एक प्रति।

+`;\d
;$&*_;

कॉपी के अंकों को एकात्मक में बदलें। बाउंसनेस टेस्ट एक्री कॉपी का उपयोग करता है, इसलिए यह केवल एक बार काम करता है iकम से कम एक बार इंक्रीमेंट किया गया है।

\d+:(\d+).*
$.(*_$1*):$1

जोड़े iको sऔर एकल अंकों की प्रतिलिपि को हटाना है, ताकि आंतरिक पाश की अगली पारित करने के लिए bounciness परीक्षण विफल रहता है और iएक बार में कम से कम वृद्धि की जाती हो जाता है।

:.*

हटाएं i



3

जावा 8, 114 112 बाइट्स

n->{int i=0,s=0;for(;n>0;++i)s+=(""+i).matches("0*1*2*3*4*5*6*7*8*9*|9*8*7*6*5*4*3*2*1*0*")?0:--n*0+i;return s;}

यह जांचने के लिए कि क्या संख्या बढ़ रही है या घट रही है, एक नियमित अभिव्यक्ति का उपयोग करता है। इसे यहाँ ऑनलाइन आज़माएँ ।

Ungolfed:

n -> { // lambda
    int i = 0, // the next number to check for bounciness
        s = 0; // the sum of all bouncy numbers so far
    for(; n > 0; ++i) // iterate until we have summed n bouncy numbers, check a new number each iteration
        s += ("" + i) // convert to a String
             .matches("0*1*2*3*4*5*6*7*8*9*" // if it's not an increasing  number ...
             + "|9*8*7*6*5*4*3*2*1*0*") ? 0 // ... and it's not a decreasing number ...
             : --n*0 // ... we have found another bouncy number ...
               + i; // ... add it to the total.
    return s; // return the sum
}

2

पायथन 2, 250 बाइट्स

n=input()
a=0
b=0
s=0
while a<n:
    v=str(b)
    h=len(v)
    g=[int(v[f])-int(v[0]) for f in range(1,h) if v[f]>=v[f-1]]
    d=[int(v[f])-int(v[0]) for f in range(1,h) if v[f]<=v[f-1]]
    if len(g)!=h-1 and len(d)!=h-1:
       a+=1
       s+=b
    b+=1
print s


1
मेरा सुझाव है कि ;व्हॉट्सएप को हटाने, और एक लंबी पंक्ति के लिए एक फ़ंक्शन को परिभाषित करने का उपयोग करके 2 लंबी लाइनों के लिए एक फ़ंक्शन को परिभाषित करें जो बहुत समान हैं, इसलिए आप कुछ कोड का पुन: उपयोग कर सकते हैं। इसके अलावा, आप कर सकते हैं a=b=s=0और len(g)!=h-1!=len(d)
mbomb007

सुझावों के लिए धन्यवाद। मुझे अब जाना है। लेकिन मैं बाद में इस पर काम करूंगा।
हैशब्रोन्स


0

लाल , 108 बाइट्स

func[n][i: s: 0 until[t: form i
if(t > u: sort copy t)and(t < reverse u)[s: s + i n: n - 1]i: i + 1
0 = n]s]

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

अधिक पठनीय:

f: func [ n ] [
    i: s: 0
    until [
       t: form i  
       if ( t > u: sort copy t ) and ( t < reverse u ) [
            s: s + i
            n: n - 1
       ]
       i: i + 1
       0 = n
    ]
    s
]

उपयोग करने का एक अच्छा अवसर form- form i5 बाइट्स से छोटा हैto-string i


0

MATL , 31 30 बाइट्स

l9`tVdZS&*0<a?wQtG>?.]y]QT]xvs

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

l       % Initialize counter to 1
9       % First value to check for being bouncy
`       % Start do-while loop
  tV    % duplicate the current number and convert to string
        % (let's use the iteration where the number is 1411)
        % stack: [1, 1411, '1411']
  d     % compute differences between the characters
        %  For non-bouncy numbers, this would be either all 
        %  positive values and 0, or all negative values and 0
        % stack: [1, 1411, [3 -3 0]]
  ZS    % keep only the signs of those differences
        % stack: [1, 1411, [1 -1 0]]
  &*    % multiply that array by its own transpose, so that
        %  each value is multiplied by every other value
        %  for non-bouncy numbers, all products will be >=0
        %  since it would have had only all -1s or all 1 (other than 0s)
        % stack: [1, 1411, [1 -1  0
                            -1  1 0
                            0  0  0]]
  0<a?  % if any value in the matrix is less than 0
    wQ    % switch the counter to top, increment it
          % stack: [1411, 2]
    tG>?  % duplicate it, check if it's gotten greater than the input limit
      .]    % if so, break out of loop
  y]    % else, duplicate bouncy number from inside stack,
        %  keeping a copy to be used for summing later
        % stack: [1411, 2, 1411]
  QT    % increment number, push True to continue loop
]     % loop end marker
x     % if we've broken out of loop, remove counter from stack
v     % concatenate the bouncy numbers we've collected in stack and 
s     % sum them

0

आर , 96 बाइट्स

function(n){while(n){y=diff(T%/%10^(0:log10(T))%%10);g=any(y<0)&any(y>0);F=F+T*g;n=n-g;T=T+1};F}

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

स्पष्टीकरण:

while(n){                         # while n > 0

        T%/%10^(0:log10(T))%%10   # split T into digits(T==TRUE==1 at the 1st loop)
y=diff(                         ) # compute the diff of digits i.e. digits[i] - digits[i+1]

g=any(y<0)&any(y>0)               # if at least one of the diff is < 0 and 
                                  # at least one is > 0 then T is "bouncy"

F=F+T*g                           # if bouncy increment F (F==FALSE==0 at the 1st loop)

n=n-g                             # decrement n by 1 if bouncy

T=T+1}                            # increment T by 1 and loop

F}                                # return F



0

सी (जीसीसी), 104 बाइट्स

f(b,o,u,n,c,y){for(o=u=0;b;u+=y?0:o+0*--b,++o)for(n=o,y=3;n/10;)c=n%10,n/=10,y&=(c-=n%10)<0?:c?2:y;b=u;}

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

Ungolfed:

f(n, // function: return type and type of arguments defaults to int;
     // abusing extra arguments to declare variables
  i,   // number currently being checked for bounciness
  s,   // sum of the bouncy numbers
  j,   // copy of i to be used for checking bounciness in a loop
  p,   // used for investigating the last digit of j
  b) { // whether i is not bouncy; uses the two least significant bits to indicate increasing/decreasing
    for(i = s = 0; // check numbers from zero up; initial sum is zero
        n; // continue until we have n bouncy numbers
        s += b ? 0 // not bouncy, no change to the sum
        : i + 0* --n, // bouncy, add it to the sum and one less bouncy number to go
        ++i) // either way, move to the next number
        for(j = i, b = 3; j/10; ) // make a copy of the current number, and truncate it from the right until there is just one digit left
        // bounciness starts as 0b11, meaning both increasing and decreasing; a value of 0 means bouncy
            p = j % 10, // get the last digit
            j /= 10, // truncate one digit from the right
            b &= // adjust bounciness:
                 (p -= j % 10) // compare current digit to the next
                 < 0 ? // not an increasing number, clear second to least significant bit
                 : p ? 2 // not a decreasing number, clear least significant bit
                 : b; // keep it the same
    n = s; // gcc shortcut for return s
}

u+=!y?--b,o:0,++oइसके बजाय सुझाव दें u+=y?0:o+0*--b,++o, ;y&=(c-=n%10)<0?:c?2:y)c=n%10,n/=10;इसके बजाय;)c=n%10,n/=10,y&=(c-=n%10)<0?:c?2:y;
सीलिंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.