How many consecutive descending numbers in my number?












13














2019 has come and probably everyone has noticed the peculiarity of this number: it's in fact composed by two sub-numbers (20 and 19) representing a sequence of consecutive descending numbers.



Challenge



Given a number x, return the length of the maximum sequence of consecutive, descending numbers that can be formed by taking sub-numbers of x.



Notes :




  • sub-numbers cannot contain leading zeros (e.g. 1009 cannot be split into 10,09)

  • consecutive and descending means that a number in the sequence must be equal to the previous number -1, or $n_{i+1} = n_{i}-1$ (e.g. 52 cannot be split into 5,2 because 5 and 2 are not consecutive, 2 ≠ 5 - 1)

  • the sequence must be obtained by using the full number, e.g. in 7321 you can't discard 7 and get the sequence 3,2,1

  • only one sequence can be obtained from the number, e.g. 3211098 cannot be split into two sequences 3,2,1 and 10,9,8


Input




  • An integer number (>= 0) : can be a number, or a string, or list of digits


Output




  • A single integer given the maximum number of decreasing sub-numbers (note that the lower-bound of this number is 1, i.e. a number is composed by itself in a descending sequence of length one)


Examples :



2019         --> 20,19           --> output : 2
201200199198 --> 201,200,199,198 --> output : 4
3246 --> 3246 --> output : 1
87654 --> 8,7,6,5,4 --> output : 5
123456 --> 123456 --> output : 1
1009998 --> 100,99,98 --> output : 3
100908 --> 100908 --> output : 1
1110987 --> 11,10,9,8,7 --> output : 5
210 --> 2,1,0 --> output : 3
1 --> 1 --> output : 1
0 --> 0 --> output : 1
312 --> 312 --> output : 1
191 --> 191 --> output : 1


General rules:




  • This is code-golf, so shortest answer in bytes wins.

    Don't let code-golf languages discourage you from posting answers with non-codegolfing languages. Try to come up with an as short as possible answer for 'any' programming language.


  • Standard rules apply for your answer with default I/O rules, so you are allowed to use STDIN/STDOUT, functions/method with the proper parameters and return-type, full programs. Your call.


  • Default Loopholes are forbidden.

  • If possible, please add a link with a test for your code (i.e. TIO).

  • Also, adding an explanation for your answer is highly recommended.










share|improve this question




















  • 1




    Migrated from sandbox : codegolf.meta.stackexchange.com/questions/2140/…
    – digEmAll
    yesterday










  • Suggested test case: 1 --> 1.
    – Kamil Drakari
    yesterday










  • Additional suggested test cases: 312 --> 1 and 191 --> 1 to ensure answers aren't truncating the first or last number (13,12 and 19,18 in these cases).
    – Kamil Drakari
    yesterday






  • 1




    Is the test case 210 -> 2,1,0 wrong (same with 0 -> 0)? The tasks says "sub-numbers cannot contain leading zeros", is zero a special case?
    – BMO
    yesterday








  • 2




    @BMO: well, here the topic is kinda phylosofical... :D to me, 0 is a number with no (useless) leading zero, so yes zero is a special case
    – digEmAll
    yesterday


















13














2019 has come and probably everyone has noticed the peculiarity of this number: it's in fact composed by two sub-numbers (20 and 19) representing a sequence of consecutive descending numbers.



Challenge



Given a number x, return the length of the maximum sequence of consecutive, descending numbers that can be formed by taking sub-numbers of x.



Notes :




  • sub-numbers cannot contain leading zeros (e.g. 1009 cannot be split into 10,09)

  • consecutive and descending means that a number in the sequence must be equal to the previous number -1, or $n_{i+1} = n_{i}-1$ (e.g. 52 cannot be split into 5,2 because 5 and 2 are not consecutive, 2 ≠ 5 - 1)

  • the sequence must be obtained by using the full number, e.g. in 7321 you can't discard 7 and get the sequence 3,2,1

  • only one sequence can be obtained from the number, e.g. 3211098 cannot be split into two sequences 3,2,1 and 10,9,8


Input




  • An integer number (>= 0) : can be a number, or a string, or list of digits


Output




  • A single integer given the maximum number of decreasing sub-numbers (note that the lower-bound of this number is 1, i.e. a number is composed by itself in a descending sequence of length one)


Examples :



2019         --> 20,19           --> output : 2
201200199198 --> 201,200,199,198 --> output : 4
3246 --> 3246 --> output : 1
87654 --> 8,7,6,5,4 --> output : 5
123456 --> 123456 --> output : 1
1009998 --> 100,99,98 --> output : 3
100908 --> 100908 --> output : 1
1110987 --> 11,10,9,8,7 --> output : 5
210 --> 2,1,0 --> output : 3
1 --> 1 --> output : 1
0 --> 0 --> output : 1
312 --> 312 --> output : 1
191 --> 191 --> output : 1


General rules:




  • This is code-golf, so shortest answer in bytes wins.

    Don't let code-golf languages discourage you from posting answers with non-codegolfing languages. Try to come up with an as short as possible answer for 'any' programming language.


  • Standard rules apply for your answer with default I/O rules, so you are allowed to use STDIN/STDOUT, functions/method with the proper parameters and return-type, full programs. Your call.


  • Default Loopholes are forbidden.

  • If possible, please add a link with a test for your code (i.e. TIO).

  • Also, adding an explanation for your answer is highly recommended.










share|improve this question




















  • 1




    Migrated from sandbox : codegolf.meta.stackexchange.com/questions/2140/…
    – digEmAll
    yesterday










  • Suggested test case: 1 --> 1.
    – Kamil Drakari
    yesterday










  • Additional suggested test cases: 312 --> 1 and 191 --> 1 to ensure answers aren't truncating the first or last number (13,12 and 19,18 in these cases).
    – Kamil Drakari
    yesterday






  • 1




    Is the test case 210 -> 2,1,0 wrong (same with 0 -> 0)? The tasks says "sub-numbers cannot contain leading zeros", is zero a special case?
    – BMO
    yesterday








  • 2




    @BMO: well, here the topic is kinda phylosofical... :D to me, 0 is a number with no (useless) leading zero, so yes zero is a special case
    – digEmAll
    yesterday
















13












13








13







2019 has come and probably everyone has noticed the peculiarity of this number: it's in fact composed by two sub-numbers (20 and 19) representing a sequence of consecutive descending numbers.



Challenge



Given a number x, return the length of the maximum sequence of consecutive, descending numbers that can be formed by taking sub-numbers of x.



Notes :




  • sub-numbers cannot contain leading zeros (e.g. 1009 cannot be split into 10,09)

  • consecutive and descending means that a number in the sequence must be equal to the previous number -1, or $n_{i+1} = n_{i}-1$ (e.g. 52 cannot be split into 5,2 because 5 and 2 are not consecutive, 2 ≠ 5 - 1)

  • the sequence must be obtained by using the full number, e.g. in 7321 you can't discard 7 and get the sequence 3,2,1

  • only one sequence can be obtained from the number, e.g. 3211098 cannot be split into two sequences 3,2,1 and 10,9,8


Input




  • An integer number (>= 0) : can be a number, or a string, or list of digits


Output




  • A single integer given the maximum number of decreasing sub-numbers (note that the lower-bound of this number is 1, i.e. a number is composed by itself in a descending sequence of length one)


Examples :



2019         --> 20,19           --> output : 2
201200199198 --> 201,200,199,198 --> output : 4
3246 --> 3246 --> output : 1
87654 --> 8,7,6,5,4 --> output : 5
123456 --> 123456 --> output : 1
1009998 --> 100,99,98 --> output : 3
100908 --> 100908 --> output : 1
1110987 --> 11,10,9,8,7 --> output : 5
210 --> 2,1,0 --> output : 3
1 --> 1 --> output : 1
0 --> 0 --> output : 1
312 --> 312 --> output : 1
191 --> 191 --> output : 1


General rules:




  • This is code-golf, so shortest answer in bytes wins.

    Don't let code-golf languages discourage you from posting answers with non-codegolfing languages. Try to come up with an as short as possible answer for 'any' programming language.


  • Standard rules apply for your answer with default I/O rules, so you are allowed to use STDIN/STDOUT, functions/method with the proper parameters and return-type, full programs. Your call.


  • Default Loopholes are forbidden.

  • If possible, please add a link with a test for your code (i.e. TIO).

  • Also, adding an explanation for your answer is highly recommended.










share|improve this question















2019 has come and probably everyone has noticed the peculiarity of this number: it's in fact composed by two sub-numbers (20 and 19) representing a sequence of consecutive descending numbers.



Challenge



Given a number x, return the length of the maximum sequence of consecutive, descending numbers that can be formed by taking sub-numbers of x.



Notes :




  • sub-numbers cannot contain leading zeros (e.g. 1009 cannot be split into 10,09)

  • consecutive and descending means that a number in the sequence must be equal to the previous number -1, or $n_{i+1} = n_{i}-1$ (e.g. 52 cannot be split into 5,2 because 5 and 2 are not consecutive, 2 ≠ 5 - 1)

  • the sequence must be obtained by using the full number, e.g. in 7321 you can't discard 7 and get the sequence 3,2,1

  • only one sequence can be obtained from the number, e.g. 3211098 cannot be split into two sequences 3,2,1 and 10,9,8


Input




  • An integer number (>= 0) : can be a number, or a string, or list of digits


Output




  • A single integer given the maximum number of decreasing sub-numbers (note that the lower-bound of this number is 1, i.e. a number is composed by itself in a descending sequence of length one)


Examples :



2019         --> 20,19           --> output : 2
201200199198 --> 201,200,199,198 --> output : 4
3246 --> 3246 --> output : 1
87654 --> 8,7,6,5,4 --> output : 5
123456 --> 123456 --> output : 1
1009998 --> 100,99,98 --> output : 3
100908 --> 100908 --> output : 1
1110987 --> 11,10,9,8,7 --> output : 5
210 --> 2,1,0 --> output : 3
1 --> 1 --> output : 1
0 --> 0 --> output : 1
312 --> 312 --> output : 1
191 --> 191 --> output : 1


General rules:




  • This is code-golf, so shortest answer in bytes wins.

    Don't let code-golf languages discourage you from posting answers with non-codegolfing languages. Try to come up with an as short as possible answer for 'any' programming language.


  • Standard rules apply for your answer with default I/O rules, so you are allowed to use STDIN/STDOUT, functions/method with the proper parameters and return-type, full programs. Your call.


  • Default Loopholes are forbidden.

  • If possible, please add a link with a test for your code (i.e. TIO).

  • Also, adding an explanation for your answer is highly recommended.







code-golf






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 21 hours ago









Veskah

82414




82414










asked yesterday









digEmAll

2,589411




2,589411








  • 1




    Migrated from sandbox : codegolf.meta.stackexchange.com/questions/2140/…
    – digEmAll
    yesterday










  • Suggested test case: 1 --> 1.
    – Kamil Drakari
    yesterday










  • Additional suggested test cases: 312 --> 1 and 191 --> 1 to ensure answers aren't truncating the first or last number (13,12 and 19,18 in these cases).
    – Kamil Drakari
    yesterday






  • 1




    Is the test case 210 -> 2,1,0 wrong (same with 0 -> 0)? The tasks says "sub-numbers cannot contain leading zeros", is zero a special case?
    – BMO
    yesterday








  • 2




    @BMO: well, here the topic is kinda phylosofical... :D to me, 0 is a number with no (useless) leading zero, so yes zero is a special case
    – digEmAll
    yesterday
















  • 1




    Migrated from sandbox : codegolf.meta.stackexchange.com/questions/2140/…
    – digEmAll
    yesterday










  • Suggested test case: 1 --> 1.
    – Kamil Drakari
    yesterday










  • Additional suggested test cases: 312 --> 1 and 191 --> 1 to ensure answers aren't truncating the first or last number (13,12 and 19,18 in these cases).
    – Kamil Drakari
    yesterday






  • 1




    Is the test case 210 -> 2,1,0 wrong (same with 0 -> 0)? The tasks says "sub-numbers cannot contain leading zeros", is zero a special case?
    – BMO
    yesterday








  • 2




    @BMO: well, here the topic is kinda phylosofical... :D to me, 0 is a number with no (useless) leading zero, so yes zero is a special case
    – digEmAll
    yesterday










1




1




Migrated from sandbox : codegolf.meta.stackexchange.com/questions/2140/…
– digEmAll
yesterday




Migrated from sandbox : codegolf.meta.stackexchange.com/questions/2140/…
– digEmAll
yesterday












Suggested test case: 1 --> 1.
– Kamil Drakari
yesterday




Suggested test case: 1 --> 1.
– Kamil Drakari
yesterday












Additional suggested test cases: 312 --> 1 and 191 --> 1 to ensure answers aren't truncating the first or last number (13,12 and 19,18 in these cases).
– Kamil Drakari
yesterday




Additional suggested test cases: 312 --> 1 and 191 --> 1 to ensure answers aren't truncating the first or last number (13,12 and 19,18 in these cases).
– Kamil Drakari
yesterday




1




1




Is the test case 210 -> 2,1,0 wrong (same with 0 -> 0)? The tasks says "sub-numbers cannot contain leading zeros", is zero a special case?
– BMO
yesterday






Is the test case 210 -> 2,1,0 wrong (same with 0 -> 0)? The tasks says "sub-numbers cannot contain leading zeros", is zero a special case?
– BMO
yesterday






2




2




@BMO: well, here the topic is kinda phylosofical... :D to me, 0 is a number with no (useless) leading zero, so yes zero is a special case
– digEmAll
yesterday






@BMO: well, here the topic is kinda phylosofical... :D to me, 0 is a number with no (useless) leading zero, so yes zero is a special case
– digEmAll
yesterday












13 Answers
13






active

oldest

votes


















5














JavaScript (ES6), 66 bytes



Takes input as a string.





f=(s,n=x='',o=p=n,i=0)=>s[i++]?o==s?i:f(s,--n,o+n,i):f(s,p+s[x++])


Try it online!






share|improve this answer





























    4















    Jelly,  15  9 bytes



    Bugfix thanks to Dennis



    ŻṚẆDfŒṖẈṀ


    Try it online! (even 321 takes half a minute since the code is at least $O(N^2)$)



    How?



    ŻṚẆDfŒṖẈṀ - Link: integer, n
    Ż - [0..n]
    Ṛ - reverse
    Ẇ - all contiguous slices (of implicit range(n)) = [[n],...,[2],[1],[0],[n,n-1],...,[2,1],[1,0],...,[n,n-1,n-2,...,2,1,0]]
    D - to decimal (vectorises)
    ŒṖ - partitions of (implicit decimal digits of) n
    f - filter discard from left if in right
    Ẉ - length of each
    Ṁ - maximum





    share|improve this answer































      4















      Perl 6, 43 41 bytes





      {/(<-[0]>.*?|0)+<?{2>set 1..*Z+$0}>/;+$0}


      Try it online!



      Regex based solution. I'm trying to come up with a better way to match from a descending list instead, but Perl 6 doesn't do partitions well



      Explanation:



      {                                        }  # Anonymous code block
      / /; # Match in the input
      <-[0]>.*? # Non-greedy number not starting with 0
      |0 # Or 0
      ( )+ # Repeatedly for the rest of the number
      <?{ }> # Where
      1..*Z+$0 # Each matched number plus the ascending numbers
      # For example 1,2,3 Z+ 9,8,7 is 10,10,10
      set # Coerced to a set
      2> # Is smaller than length 2?
      +$0 # Return the length of the list





      share|improve this answer































        3















        Python 3, 232 228 187 181 180 150 bytes





        e=enumerate
        t=int
        h=lambda n,s=1:max([1]+[i-len(n[j:])and h(n[j:],s+1)or s+1 for j,_ in e(n)for i,_ in e(n[:j],1)if(t(n[:j])-t(n[j:j+i])==1)*t(n[0])])


        Try it online!



        Initial ungolfed code:



        def count_consecutives(left, right, so_far=1):
        for i,_ in enumerate(left, start=1):
        left_part_of_right, right_part_of_right = right[:i], right[i:]
        if (int(left) - int(left_part_of_right)) == 1:
        if i == len(right):
        return so_far + 1
        return count_consecutives(left_part_of_right, right_part_of_right, so_far + 1)
        return so_far

        def how_many_consecutives(n):
        for i, _ in enumerate(n):
        left, right = n[:i], n[i:]
        for j, _ in enumerate(left, start=1):
        left_part_of_right = right[:j]
        if int(left) - int(left_part_of_right) == 1 and int(n[i]) > 0:
        return count_consecutives(left, right)
        return 1





        share|improve this answer










        New contributor




        Nishioka is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
        Check out our Code of Conduct.


























          2















          05AB1E, 10 bytes



          ÝRŒʒJQ}€gà


          Extremely slow, so the TIO below only works for test cases below 750..



          Try it online.



          Explanation:





          Ý           # Create a list in the range [0, (implicit) input]
          # i.e. 109 → [0,1,2,...,107,108,109]
          R # Reverse it
          # i.e. [0,1,2,...,107,108,109] → [109,108,107,...,2,1,0]
          Π# Get all possible sublists of this list
          # i.e. [109,108,107,...,2,1,0]
          # → [[109],[109,108],[109,108,107],...,[2,1,0],[1],[1,0],[0]]
          ʒ } # Filter it by:
          J # Where the sublist joined together
          # i.e. [10,9] → "109"
          # i.e. [109,108,107] → "109108107"
          Q # Are equal to the (implicit) input
          # i.e. 109 and "109" → 1 (truthy)
          # i.e. 109 and "109108107" → 0 (falsey)
          €g # After filtering, take the length of each remaining inner list
          # i.e. [[109],[[10,9]] → [1,2]
          à # And only leave the maximum length (which is output implicitly)
          # i.e. [1,2] → 2





          share|improve this answer



















          • 1




            Code golf - where adding 1 byte to your program to go from n! to n lg n just isn't worth it.
            – corsiKa
            1 hour ago



















          2














          Pyth, 16 bytes



          lef!.EhM.+vMT./z


          Try it online here, or verify all the test cases at once here.



          lef!.EhM.+vMT./z   Implicit: z=input as string
          ./z Get all divisions of z into disjoint substrings
          f Filter the above, as T, keeping those where the following is truthy:
          vMT Parse each substring as an int
          .+ Get difference between each pair
          hM Increment each
          !.E Are all elements 0? { NOT(ANY(...)) }
          e Take the last element of the filtered divisions
          Divisions are generated with fewest substrings first, so last remaining division is also the longest
          l Length of the above, implicit print





          share|improve this answer





























            2














            Haskell, 87 bytes



            maximum.map length.(0#)
            a#(b:c)=[a:x|c==||b>0,x<-b#c,a==x!!0+1]++(10*a+b)#c
            a#b=[[a]]


            Input is a list of digits.



            Try it online!



            Function # builds a list of all possible splits by looking at both




            • prepending the current number a to all splits returned by a recursive call with the rest of the input (x<-b#c), but only if the next number not zero (b>0) (or it's the last number in the input (c==)) and a is one greater than the first number of the respective previous split x (a==x!!0+1).


            and




            • appending the next digit b from the input list to the current number a and going on with the rest of the input ((10*a+b)#c)


            Base case is when the input list is empty (i.e. does not pattern match (b:c)). The recursion starts with the current number a being 0 ((0#)), which never hits the first branch (prepending a to all previous splits), because it will never be greater than any number of the splits.



            Take the length of each split and find the maximum (maximum.map length).



            A variant with also 87 bytes:



            fst.maximum.(0#)
            a#(b:c)=[(r+1,a)|c==||b>0,(r,x)<-b#c,a==x+1]++(10*a+b)#c
            a#b=[(1,a)]


            which basically works the same way, but instead of keeping the whole split in a list, it only keeps a pair (r,x) of the length of the split r an the first number in the split x.






            share|improve this answer































              2















              Python 3, 302 282 271 bytes



              -10 bytes thanks to the tip by @ElPedro.



              Takes input as a string. Basically, it takes increasing larger slices of the number from the left, and sees if for that slice of the number a sequence can be formed using all the numbers.





              R=range
              I=int
              L=len
              def g(n,m,t=1):
              for i in R(1,L(m)+1):
              if I(m)==I(n[:i])+1:
              if i==L(n):return-~t
              return g(n[i:],n[:i],t+1)
              return 1
              def f(n):
              for i in R(L(n)):
              x=n[:i]
              for j in R(1,L(x)+1):
              if (I(x)==I(n[i:i+j])+1)*I(n[i]):return g(n[i:],x)
              return 1


              Try it online!






              share|improve this answer























              • Since you are using range 3 times you can define R=range outside of both functions and then use R(whatever) instead of range(whatever) to save 4 bytes.
                – ElPedro
                4 hours ago



















              1















              Japt, 30 bytes



              ;õ0 Ô+J f,+Uì q",?" +J mèJ ²ÎÉ


              Try it online! or Check most test cases



              This doesn't score well, but it uses a unique method and there might be room to golf it a lot more. It also performs well enough that all test cases other than 201200199198 avoid timing out.



              Explanation:



              ;                                 #Set J = ","
              õ0 #Get the range [0...input]
              Ô #Reverse it
              +J #Add a comma to the end, casting to a string by joining with ","
              f #Get the substring that matches this regex:
              , # Starts with a comma
              +Uì # Has all the digits of the input
              q",?" # Optionally, there can be commas between any digits
              +J # Ends with a comma
              mèJ #Count the number of commas in the result
              ²Î #Use 2 instead if no substring matched
              É #Subtract 1





              share|improve this answer





















              • I think this works for 27.
                – Shaggy
                12 hours ago












              • 25 bytes
                – Shaggy
                12 hours ago










              • @Shaggy both of those fail on input 21201 because they don't enforce that the sequence end aligns correctly (from my original version the "ends with a comma" line). This or this alternative works.
                – Kamil Drakari
                7 hours ago










              • Ah, OK. In that case: 26 bytes
                – Shaggy
                6 hours ago



















              1















              Jelly, 11 bytes



              ŒṖḌ’DɗƑƇẈṀ


              Byte for byte, no match for the other Jelly solution, but this one should be roughly $Oleft(n^{0.3}right)$.



              Try it online!



              How it works



              ŒṖḌ’DɗƑƇẈṀ  Main link. Argument: n (integer)

              ŒṖ Yield all partitions of n's digit list in base 10.
              Ƈ Comb; keep only partitions for which the link to the left returns 1.
              Ƒ Fixed; yield 1 if calling the link to the left returns its argument.
              Cumulatively reduce the partition by the link to the left.
              ɗ Combine the three links to the left into a dyadic chain.
              Ḍ Undecimal; convert a digit list into an integer.
              ’ Decrement the result.
              D Decimal; convert the integer back to a digit list.





              share|improve this answer































                1















                Charcoal, 26 bytes



                F⊕LθF⊕Lθ⊞υ⭆κ⁻I…θιλI﹪⌕υθ⊕Lθ


                Try it online! Link is to verbose version of code. Explanation:



                F⊕Lθ


                Loop i from 0 to the length of the input.



                F⊕Lθ


                Loop k from 0 to the length of the input.



                ⊞υ⭆κ⁻I…θ⊕ιλ


                Calculate the first k numbers in the descending sequence starting from the number given by the first i digits of the input, concatenate them, and accumulate each resulting string in the predefined empty list.



                I﹪⌕υθ⊕Lθ


                Find the position of the first matching copy of the input and reduce it modulo 1 more than the length of the input.



                Example: For an input of 2019 the following strings are generated:



                 0
                1 0
                2 0-1
                3 0-1-2
                4 0-1-2-3
                5
                6 2
                7 21
                8 210
                9 210-1
                10
                11 20
                12 2019
                13 201918
                14 20191817
                15
                16 201
                17 201200
                18 201200199
                19 201200199198
                20
                21 2019
                22 20192018
                23 201920182017
                24 2019201820172016


                2019 is then found at index 12, which is reduced modulo 5 to give 2, the desired answer.






                share|improve this answer





























                  1














                  Haskell, 65 bytes



                  f i=[y|x<-[0..],y<-[1..length i],i==(show=<<[x+y-1,x+y-2..x])]!!0


                  Input is a string.



                  Try it online!



                  Completely different to my other answer. A simple brute force that tries all lists of consecutive descending numbers until it finds one that equals the input list.



                  If we limit the input number to 64-bit integers, we can save 6 bytes by looping y through [1..19], because the largest 64-bit integer has 19 digits and there's no need to test lists with more elements.



                  Haskell, 59 bytes



                  f i=[y|x<-[0..],y<-[1..19],i==(show=<<[x+y-1,x+y-2..x])]!!0


                  Try it online!






                  share|improve this answer































                    1















                    Python 2, 95 bytes





                    lambda n:max(j-i for j in range(n+1)for i in range(-1,j)if''.join(map(str,range(j,i,-1)))==`n`)


                    Another slow, brute-force solution.



                    Try it online!






                    share|improve this answer





















                      Your Answer





                      StackExchange.ifUsing("editor", function () {
                      return StackExchange.using("mathjaxEditing", function () {
                      StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
                      StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
                      });
                      });
                      }, "mathjax-editing");

                      StackExchange.ifUsing("editor", function () {
                      StackExchange.using("externalEditor", function () {
                      StackExchange.using("snippets", function () {
                      StackExchange.snippets.init();
                      });
                      });
                      }, "code-snippets");

                      StackExchange.ready(function() {
                      var channelOptions = {
                      tags: "".split(" "),
                      id: "200"
                      };
                      initTagRenderer("".split(" "), "".split(" "), channelOptions);

                      StackExchange.using("externalEditor", function() {
                      // Have to fire editor after snippets, if snippets enabled
                      if (StackExchange.settings.snippets.snippetsEnabled) {
                      StackExchange.using("snippets", function() {
                      createEditor();
                      });
                      }
                      else {
                      createEditor();
                      }
                      });

                      function createEditor() {
                      StackExchange.prepareEditor({
                      heartbeatType: 'answer',
                      autoActivateHeartbeat: false,
                      convertImagesToLinks: false,
                      noModals: true,
                      showLowRepImageUploadWarning: true,
                      reputationToPostImages: null,
                      bindNavPrevention: true,
                      postfix: "",
                      imageUploader: {
                      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
                      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
                      allowUrls: true
                      },
                      onDemand: true,
                      discardSelector: ".discard-answer"
                      ,immediatelyShowMarkdownHelp:true
                      });


                      }
                      });














                      draft saved

                      draft discarded


















                      StackExchange.ready(
                      function () {
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodegolf.stackexchange.com%2fquestions%2f178373%2fhow-many-consecutive-descending-numbers-in-my-number%23new-answer', 'question_page');
                      }
                      );

                      Post as a guest















                      Required, but never shown

























                      13 Answers
                      13






                      active

                      oldest

                      votes








                      13 Answers
                      13






                      active

                      oldest

                      votes









                      active

                      oldest

                      votes






                      active

                      oldest

                      votes









                      5














                      JavaScript (ES6), 66 bytes



                      Takes input as a string.





                      f=(s,n=x='',o=p=n,i=0)=>s[i++]?o==s?i:f(s,--n,o+n,i):f(s,p+s[x++])


                      Try it online!






                      share|improve this answer


























                        5














                        JavaScript (ES6), 66 bytes



                        Takes input as a string.





                        f=(s,n=x='',o=p=n,i=0)=>s[i++]?o==s?i:f(s,--n,o+n,i):f(s,p+s[x++])


                        Try it online!






                        share|improve this answer
























                          5












                          5








                          5






                          JavaScript (ES6), 66 bytes



                          Takes input as a string.





                          f=(s,n=x='',o=p=n,i=0)=>s[i++]?o==s?i:f(s,--n,o+n,i):f(s,p+s[x++])


                          Try it online!






                          share|improve this answer












                          JavaScript (ES6), 66 bytes



                          Takes input as a string.





                          f=(s,n=x='',o=p=n,i=0)=>s[i++]?o==s?i:f(s,--n,o+n,i):f(s,p+s[x++])


                          Try it online!







                          share|improve this answer












                          share|improve this answer



                          share|improve this answer










                          answered yesterday









                          Arnauld

                          72.6k689306




                          72.6k689306























                              4















                              Jelly,  15  9 bytes



                              Bugfix thanks to Dennis



                              ŻṚẆDfŒṖẈṀ


                              Try it online! (even 321 takes half a minute since the code is at least $O(N^2)$)



                              How?



                              ŻṚẆDfŒṖẈṀ - Link: integer, n
                              Ż - [0..n]
                              Ṛ - reverse
                              Ẇ - all contiguous slices (of implicit range(n)) = [[n],...,[2],[1],[0],[n,n-1],...,[2,1],[1,0],...,[n,n-1,n-2,...,2,1,0]]
                              D - to decimal (vectorises)
                              ŒṖ - partitions of (implicit decimal digits of) n
                              f - filter discard from left if in right
                              Ẉ - length of each
                              Ṁ - maximum





                              share|improve this answer




























                                4















                                Jelly,  15  9 bytes



                                Bugfix thanks to Dennis



                                ŻṚẆDfŒṖẈṀ


                                Try it online! (even 321 takes half a minute since the code is at least $O(N^2)$)



                                How?



                                ŻṚẆDfŒṖẈṀ - Link: integer, n
                                Ż - [0..n]
                                Ṛ - reverse
                                Ẇ - all contiguous slices (of implicit range(n)) = [[n],...,[2],[1],[0],[n,n-1],...,[2,1],[1,0],...,[n,n-1,n-2,...,2,1,0]]
                                D - to decimal (vectorises)
                                ŒṖ - partitions of (implicit decimal digits of) n
                                f - filter discard from left if in right
                                Ẉ - length of each
                                Ṁ - maximum





                                share|improve this answer


























                                  4












                                  4








                                  4







                                  Jelly,  15  9 bytes



                                  Bugfix thanks to Dennis



                                  ŻṚẆDfŒṖẈṀ


                                  Try it online! (even 321 takes half a minute since the code is at least $O(N^2)$)



                                  How?



                                  ŻṚẆDfŒṖẈṀ - Link: integer, n
                                  Ż - [0..n]
                                  Ṛ - reverse
                                  Ẇ - all contiguous slices (of implicit range(n)) = [[n],...,[2],[1],[0],[n,n-1],...,[2,1],[1,0],...,[n,n-1,n-2,...,2,1,0]]
                                  D - to decimal (vectorises)
                                  ŒṖ - partitions of (implicit decimal digits of) n
                                  f - filter discard from left if in right
                                  Ẉ - length of each
                                  Ṁ - maximum





                                  share|improve this answer















                                  Jelly,  15  9 bytes



                                  Bugfix thanks to Dennis



                                  ŻṚẆDfŒṖẈṀ


                                  Try it online! (even 321 takes half a minute since the code is at least $O(N^2)$)



                                  How?



                                  ŻṚẆDfŒṖẈṀ - Link: integer, n
                                  Ż - [0..n]
                                  Ṛ - reverse
                                  Ẇ - all contiguous slices (of implicit range(n)) = [[n],...,[2],[1],[0],[n,n-1],...,[2,1],[1,0],...,[n,n-1,n-2,...,2,1,0]]
                                  D - to decimal (vectorises)
                                  ŒṖ - partitions of (implicit decimal digits of) n
                                  f - filter discard from left if in right
                                  Ẉ - length of each
                                  Ṁ - maximum






                                  share|improve this answer














                                  share|improve this answer



                                  share|improve this answer








                                  edited yesterday

























                                  answered yesterday









                                  Jonathan Allan

                                  50.8k534165




                                  50.8k534165























                                      4















                                      Perl 6, 43 41 bytes





                                      {/(<-[0]>.*?|0)+<?{2>set 1..*Z+$0}>/;+$0}


                                      Try it online!



                                      Regex based solution. I'm trying to come up with a better way to match from a descending list instead, but Perl 6 doesn't do partitions well



                                      Explanation:



                                      {                                        }  # Anonymous code block
                                      / /; # Match in the input
                                      <-[0]>.*? # Non-greedy number not starting with 0
                                      |0 # Or 0
                                      ( )+ # Repeatedly for the rest of the number
                                      <?{ }> # Where
                                      1..*Z+$0 # Each matched number plus the ascending numbers
                                      # For example 1,2,3 Z+ 9,8,7 is 10,10,10
                                      set # Coerced to a set
                                      2> # Is smaller than length 2?
                                      +$0 # Return the length of the list





                                      share|improve this answer




























                                        4















                                        Perl 6, 43 41 bytes





                                        {/(<-[0]>.*?|0)+<?{2>set 1..*Z+$0}>/;+$0}


                                        Try it online!



                                        Regex based solution. I'm trying to come up with a better way to match from a descending list instead, but Perl 6 doesn't do partitions well



                                        Explanation:



                                        {                                        }  # Anonymous code block
                                        / /; # Match in the input
                                        <-[0]>.*? # Non-greedy number not starting with 0
                                        |0 # Or 0
                                        ( )+ # Repeatedly for the rest of the number
                                        <?{ }> # Where
                                        1..*Z+$0 # Each matched number plus the ascending numbers
                                        # For example 1,2,3 Z+ 9,8,7 is 10,10,10
                                        set # Coerced to a set
                                        2> # Is smaller than length 2?
                                        +$0 # Return the length of the list





                                        share|improve this answer


























                                          4












                                          4








                                          4







                                          Perl 6, 43 41 bytes





                                          {/(<-[0]>.*?|0)+<?{2>set 1..*Z+$0}>/;+$0}


                                          Try it online!



                                          Regex based solution. I'm trying to come up with a better way to match from a descending list instead, but Perl 6 doesn't do partitions well



                                          Explanation:



                                          {                                        }  # Anonymous code block
                                          / /; # Match in the input
                                          <-[0]>.*? # Non-greedy number not starting with 0
                                          |0 # Or 0
                                          ( )+ # Repeatedly for the rest of the number
                                          <?{ }> # Where
                                          1..*Z+$0 # Each matched number plus the ascending numbers
                                          # For example 1,2,3 Z+ 9,8,7 is 10,10,10
                                          set # Coerced to a set
                                          2> # Is smaller than length 2?
                                          +$0 # Return the length of the list





                                          share|improve this answer















                                          Perl 6, 43 41 bytes





                                          {/(<-[0]>.*?|0)+<?{2>set 1..*Z+$0}>/;+$0}


                                          Try it online!



                                          Regex based solution. I'm trying to come up with a better way to match from a descending list instead, but Perl 6 doesn't do partitions well



                                          Explanation:



                                          {                                        }  # Anonymous code block
                                          / /; # Match in the input
                                          <-[0]>.*? # Non-greedy number not starting with 0
                                          |0 # Or 0
                                          ( )+ # Repeatedly for the rest of the number
                                          <?{ }> # Where
                                          1..*Z+$0 # Each matched number plus the ascending numbers
                                          # For example 1,2,3 Z+ 9,8,7 is 10,10,10
                                          set # Coerced to a set
                                          2> # Is smaller than length 2?
                                          +$0 # Return the length of the list






                                          share|improve this answer














                                          share|improve this answer



                                          share|improve this answer








                                          edited 23 hours ago

























                                          answered yesterday









                                          Jo King

                                          21k248110




                                          21k248110























                                              3















                                              Python 3, 232 228 187 181 180 150 bytes





                                              e=enumerate
                                              t=int
                                              h=lambda n,s=1:max([1]+[i-len(n[j:])and h(n[j:],s+1)or s+1 for j,_ in e(n)for i,_ in e(n[:j],1)if(t(n[:j])-t(n[j:j+i])==1)*t(n[0])])


                                              Try it online!



                                              Initial ungolfed code:



                                              def count_consecutives(left, right, so_far=1):
                                              for i,_ in enumerate(left, start=1):
                                              left_part_of_right, right_part_of_right = right[:i], right[i:]
                                              if (int(left) - int(left_part_of_right)) == 1:
                                              if i == len(right):
                                              return so_far + 1
                                              return count_consecutives(left_part_of_right, right_part_of_right, so_far + 1)
                                              return so_far

                                              def how_many_consecutives(n):
                                              for i, _ in enumerate(n):
                                              left, right = n[:i], n[i:]
                                              for j, _ in enumerate(left, start=1):
                                              left_part_of_right = right[:j]
                                              if int(left) - int(left_part_of_right) == 1 and int(n[i]) > 0:
                                              return count_consecutives(left, right)
                                              return 1





                                              share|improve this answer










                                              New contributor




                                              Nishioka is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                                              Check out our Code of Conduct.























                                                3















                                                Python 3, 232 228 187 181 180 150 bytes





                                                e=enumerate
                                                t=int
                                                h=lambda n,s=1:max([1]+[i-len(n[j:])and h(n[j:],s+1)or s+1 for j,_ in e(n)for i,_ in e(n[:j],1)if(t(n[:j])-t(n[j:j+i])==1)*t(n[0])])


                                                Try it online!



                                                Initial ungolfed code:



                                                def count_consecutives(left, right, so_far=1):
                                                for i,_ in enumerate(left, start=1):
                                                left_part_of_right, right_part_of_right = right[:i], right[i:]
                                                if (int(left) - int(left_part_of_right)) == 1:
                                                if i == len(right):
                                                return so_far + 1
                                                return count_consecutives(left_part_of_right, right_part_of_right, so_far + 1)
                                                return so_far

                                                def how_many_consecutives(n):
                                                for i, _ in enumerate(n):
                                                left, right = n[:i], n[i:]
                                                for j, _ in enumerate(left, start=1):
                                                left_part_of_right = right[:j]
                                                if int(left) - int(left_part_of_right) == 1 and int(n[i]) > 0:
                                                return count_consecutives(left, right)
                                                return 1





                                                share|improve this answer










                                                New contributor




                                                Nishioka is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                                                Check out our Code of Conduct.





















                                                  3












                                                  3








                                                  3







                                                  Python 3, 232 228 187 181 180 150 bytes





                                                  e=enumerate
                                                  t=int
                                                  h=lambda n,s=1:max([1]+[i-len(n[j:])and h(n[j:],s+1)or s+1 for j,_ in e(n)for i,_ in e(n[:j],1)if(t(n[:j])-t(n[j:j+i])==1)*t(n[0])])


                                                  Try it online!



                                                  Initial ungolfed code:



                                                  def count_consecutives(left, right, so_far=1):
                                                  for i,_ in enumerate(left, start=1):
                                                  left_part_of_right, right_part_of_right = right[:i], right[i:]
                                                  if (int(left) - int(left_part_of_right)) == 1:
                                                  if i == len(right):
                                                  return so_far + 1
                                                  return count_consecutives(left_part_of_right, right_part_of_right, so_far + 1)
                                                  return so_far

                                                  def how_many_consecutives(n):
                                                  for i, _ in enumerate(n):
                                                  left, right = n[:i], n[i:]
                                                  for j, _ in enumerate(left, start=1):
                                                  left_part_of_right = right[:j]
                                                  if int(left) - int(left_part_of_right) == 1 and int(n[i]) > 0:
                                                  return count_consecutives(left, right)
                                                  return 1





                                                  share|improve this answer










                                                  New contributor




                                                  Nishioka is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                                                  Check out our Code of Conduct.










                                                  Python 3, 232 228 187 181 180 150 bytes





                                                  e=enumerate
                                                  t=int
                                                  h=lambda n,s=1:max([1]+[i-len(n[j:])and h(n[j:],s+1)or s+1 for j,_ in e(n)for i,_ in e(n[:j],1)if(t(n[:j])-t(n[j:j+i])==1)*t(n[0])])


                                                  Try it online!



                                                  Initial ungolfed code:



                                                  def count_consecutives(left, right, so_far=1):
                                                  for i,_ in enumerate(left, start=1):
                                                  left_part_of_right, right_part_of_right = right[:i], right[i:]
                                                  if (int(left) - int(left_part_of_right)) == 1:
                                                  if i == len(right):
                                                  return so_far + 1
                                                  return count_consecutives(left_part_of_right, right_part_of_right, so_far + 1)
                                                  return so_far

                                                  def how_many_consecutives(n):
                                                  for i, _ in enumerate(n):
                                                  left, right = n[:i], n[i:]
                                                  for j, _ in enumerate(left, start=1):
                                                  left_part_of_right = right[:j]
                                                  if int(left) - int(left_part_of_right) == 1 and int(n[i]) > 0:
                                                  return count_consecutives(left, right)
                                                  return 1






                                                  share|improve this answer










                                                  New contributor




                                                  Nishioka is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                                                  Check out our Code of Conduct.









                                                  share|improve this answer



                                                  share|improve this answer








                                                  edited 1 hour ago





















                                                  New contributor




                                                  Nishioka is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                                                  Check out our Code of Conduct.









                                                  answered 6 hours ago









                                                  Nishioka

                                                  513




                                                  513




                                                  New contributor




                                                  Nishioka is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                                                  Check out our Code of Conduct.





                                                  New contributor





                                                  Nishioka is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                                                  Check out our Code of Conduct.






                                                  Nishioka is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                                                  Check out our Code of Conduct.























                                                      2















                                                      05AB1E, 10 bytes



                                                      ÝRŒʒJQ}€gà


                                                      Extremely slow, so the TIO below only works for test cases below 750..



                                                      Try it online.



                                                      Explanation:





                                                      Ý           # Create a list in the range [0, (implicit) input]
                                                      # i.e. 109 → [0,1,2,...,107,108,109]
                                                      R # Reverse it
                                                      # i.e. [0,1,2,...,107,108,109] → [109,108,107,...,2,1,0]
                                                      Π# Get all possible sublists of this list
                                                      # i.e. [109,108,107,...,2,1,0]
                                                      # → [[109],[109,108],[109,108,107],...,[2,1,0],[1],[1,0],[0]]
                                                      ʒ } # Filter it by:
                                                      J # Where the sublist joined together
                                                      # i.e. [10,9] → "109"
                                                      # i.e. [109,108,107] → "109108107"
                                                      Q # Are equal to the (implicit) input
                                                      # i.e. 109 and "109" → 1 (truthy)
                                                      # i.e. 109 and "109108107" → 0 (falsey)
                                                      €g # After filtering, take the length of each remaining inner list
                                                      # i.e. [[109],[[10,9]] → [1,2]
                                                      à # And only leave the maximum length (which is output implicitly)
                                                      # i.e. [1,2] → 2





                                                      share|improve this answer



















                                                      • 1




                                                        Code golf - where adding 1 byte to your program to go from n! to n lg n just isn't worth it.
                                                        – corsiKa
                                                        1 hour ago
















                                                      2















                                                      05AB1E, 10 bytes



                                                      ÝRŒʒJQ}€gà


                                                      Extremely slow, so the TIO below only works for test cases below 750..



                                                      Try it online.



                                                      Explanation:





                                                      Ý           # Create a list in the range [0, (implicit) input]
                                                      # i.e. 109 → [0,1,2,...,107,108,109]
                                                      R # Reverse it
                                                      # i.e. [0,1,2,...,107,108,109] → [109,108,107,...,2,1,0]
                                                      Π# Get all possible sublists of this list
                                                      # i.e. [109,108,107,...,2,1,0]
                                                      # → [[109],[109,108],[109,108,107],...,[2,1,0],[1],[1,0],[0]]
                                                      ʒ } # Filter it by:
                                                      J # Where the sublist joined together
                                                      # i.e. [10,9] → "109"
                                                      # i.e. [109,108,107] → "109108107"
                                                      Q # Are equal to the (implicit) input
                                                      # i.e. 109 and "109" → 1 (truthy)
                                                      # i.e. 109 and "109108107" → 0 (falsey)
                                                      €g # After filtering, take the length of each remaining inner list
                                                      # i.e. [[109],[[10,9]] → [1,2]
                                                      à # And only leave the maximum length (which is output implicitly)
                                                      # i.e. [1,2] → 2





                                                      share|improve this answer



















                                                      • 1




                                                        Code golf - where adding 1 byte to your program to go from n! to n lg n just isn't worth it.
                                                        – corsiKa
                                                        1 hour ago














                                                      2












                                                      2








                                                      2







                                                      05AB1E, 10 bytes



                                                      ÝRŒʒJQ}€gà


                                                      Extremely slow, so the TIO below only works for test cases below 750..



                                                      Try it online.



                                                      Explanation:





                                                      Ý           # Create a list in the range [0, (implicit) input]
                                                      # i.e. 109 → [0,1,2,...,107,108,109]
                                                      R # Reverse it
                                                      # i.e. [0,1,2,...,107,108,109] → [109,108,107,...,2,1,0]
                                                      Π# Get all possible sublists of this list
                                                      # i.e. [109,108,107,...,2,1,0]
                                                      # → [[109],[109,108],[109,108,107],...,[2,1,0],[1],[1,0],[0]]
                                                      ʒ } # Filter it by:
                                                      J # Where the sublist joined together
                                                      # i.e. [10,9] → "109"
                                                      # i.e. [109,108,107] → "109108107"
                                                      Q # Are equal to the (implicit) input
                                                      # i.e. 109 and "109" → 1 (truthy)
                                                      # i.e. 109 and "109108107" → 0 (falsey)
                                                      €g # After filtering, take the length of each remaining inner list
                                                      # i.e. [[109],[[10,9]] → [1,2]
                                                      à # And only leave the maximum length (which is output implicitly)
                                                      # i.e. [1,2] → 2





                                                      share|improve this answer















                                                      05AB1E, 10 bytes



                                                      ÝRŒʒJQ}€gà


                                                      Extremely slow, so the TIO below only works for test cases below 750..



                                                      Try it online.



                                                      Explanation:





                                                      Ý           # Create a list in the range [0, (implicit) input]
                                                      # i.e. 109 → [0,1,2,...,107,108,109]
                                                      R # Reverse it
                                                      # i.e. [0,1,2,...,107,108,109] → [109,108,107,...,2,1,0]
                                                      Π# Get all possible sublists of this list
                                                      # i.e. [109,108,107,...,2,1,0]
                                                      # → [[109],[109,108],[109,108,107],...,[2,1,0],[1],[1,0],[0]]
                                                      ʒ } # Filter it by:
                                                      J # Where the sublist joined together
                                                      # i.e. [10,9] → "109"
                                                      # i.e. [109,108,107] → "109108107"
                                                      Q # Are equal to the (implicit) input
                                                      # i.e. 109 and "109" → 1 (truthy)
                                                      # i.e. 109 and "109108107" → 0 (falsey)
                                                      €g # After filtering, take the length of each remaining inner list
                                                      # i.e. [[109],[[10,9]] → [1,2]
                                                      à # And only leave the maximum length (which is output implicitly)
                                                      # i.e. [1,2] → 2






                                                      share|improve this answer














                                                      share|improve this answer



                                                      share|improve this answer








                                                      edited yesterday

























                                                      answered yesterday









                                                      Kevin Cruijssen

                                                      35.9k554188




                                                      35.9k554188








                                                      • 1




                                                        Code golf - where adding 1 byte to your program to go from n! to n lg n just isn't worth it.
                                                        – corsiKa
                                                        1 hour ago














                                                      • 1




                                                        Code golf - where adding 1 byte to your program to go from n! to n lg n just isn't worth it.
                                                        – corsiKa
                                                        1 hour ago








                                                      1




                                                      1




                                                      Code golf - where adding 1 byte to your program to go from n! to n lg n just isn't worth it.
                                                      – corsiKa
                                                      1 hour ago




                                                      Code golf - where adding 1 byte to your program to go from n! to n lg n just isn't worth it.
                                                      – corsiKa
                                                      1 hour ago











                                                      2














                                                      Pyth, 16 bytes



                                                      lef!.EhM.+vMT./z


                                                      Try it online here, or verify all the test cases at once here.



                                                      lef!.EhM.+vMT./z   Implicit: z=input as string
                                                      ./z Get all divisions of z into disjoint substrings
                                                      f Filter the above, as T, keeping those where the following is truthy:
                                                      vMT Parse each substring as an int
                                                      .+ Get difference between each pair
                                                      hM Increment each
                                                      !.E Are all elements 0? { NOT(ANY(...)) }
                                                      e Take the last element of the filtered divisions
                                                      Divisions are generated with fewest substrings first, so last remaining division is also the longest
                                                      l Length of the above, implicit print





                                                      share|improve this answer


























                                                        2














                                                        Pyth, 16 bytes



                                                        lef!.EhM.+vMT./z


                                                        Try it online here, or verify all the test cases at once here.



                                                        lef!.EhM.+vMT./z   Implicit: z=input as string
                                                        ./z Get all divisions of z into disjoint substrings
                                                        f Filter the above, as T, keeping those where the following is truthy:
                                                        vMT Parse each substring as an int
                                                        .+ Get difference between each pair
                                                        hM Increment each
                                                        !.E Are all elements 0? { NOT(ANY(...)) }
                                                        e Take the last element of the filtered divisions
                                                        Divisions are generated with fewest substrings first, so last remaining division is also the longest
                                                        l Length of the above, implicit print





                                                        share|improve this answer
























                                                          2












                                                          2








                                                          2






                                                          Pyth, 16 bytes



                                                          lef!.EhM.+vMT./z


                                                          Try it online here, or verify all the test cases at once here.



                                                          lef!.EhM.+vMT./z   Implicit: z=input as string
                                                          ./z Get all divisions of z into disjoint substrings
                                                          f Filter the above, as T, keeping those where the following is truthy:
                                                          vMT Parse each substring as an int
                                                          .+ Get difference between each pair
                                                          hM Increment each
                                                          !.E Are all elements 0? { NOT(ANY(...)) }
                                                          e Take the last element of the filtered divisions
                                                          Divisions are generated with fewest substrings first, so last remaining division is also the longest
                                                          l Length of the above, implicit print





                                                          share|improve this answer












                                                          Pyth, 16 bytes



                                                          lef!.EhM.+vMT./z


                                                          Try it online here, or verify all the test cases at once here.



                                                          lef!.EhM.+vMT./z   Implicit: z=input as string
                                                          ./z Get all divisions of z into disjoint substrings
                                                          f Filter the above, as T, keeping those where the following is truthy:
                                                          vMT Parse each substring as an int
                                                          .+ Get difference between each pair
                                                          hM Increment each
                                                          !.E Are all elements 0? { NOT(ANY(...)) }
                                                          e Take the last element of the filtered divisions
                                                          Divisions are generated with fewest substrings first, so last remaining division is also the longest
                                                          l Length of the above, implicit print






                                                          share|improve this answer












                                                          share|improve this answer



                                                          share|improve this answer










                                                          answered yesterday









                                                          Sok

                                                          3,587722




                                                          3,587722























                                                              2














                                                              Haskell, 87 bytes



                                                              maximum.map length.(0#)
                                                              a#(b:c)=[a:x|c==||b>0,x<-b#c,a==x!!0+1]++(10*a+b)#c
                                                              a#b=[[a]]


                                                              Input is a list of digits.



                                                              Try it online!



                                                              Function # builds a list of all possible splits by looking at both




                                                              • prepending the current number a to all splits returned by a recursive call with the rest of the input (x<-b#c), but only if the next number not zero (b>0) (or it's the last number in the input (c==)) and a is one greater than the first number of the respective previous split x (a==x!!0+1).


                                                              and




                                                              • appending the next digit b from the input list to the current number a and going on with the rest of the input ((10*a+b)#c)


                                                              Base case is when the input list is empty (i.e. does not pattern match (b:c)). The recursion starts with the current number a being 0 ((0#)), which never hits the first branch (prepending a to all previous splits), because it will never be greater than any number of the splits.



                                                              Take the length of each split and find the maximum (maximum.map length).



                                                              A variant with also 87 bytes:



                                                              fst.maximum.(0#)
                                                              a#(b:c)=[(r+1,a)|c==||b>0,(r,x)<-b#c,a==x+1]++(10*a+b)#c
                                                              a#b=[(1,a)]


                                                              which basically works the same way, but instead of keeping the whole split in a list, it only keeps a pair (r,x) of the length of the split r an the first number in the split x.






                                                              share|improve this answer




























                                                                2














                                                                Haskell, 87 bytes



                                                                maximum.map length.(0#)
                                                                a#(b:c)=[a:x|c==||b>0,x<-b#c,a==x!!0+1]++(10*a+b)#c
                                                                a#b=[[a]]


                                                                Input is a list of digits.



                                                                Try it online!



                                                                Function # builds a list of all possible splits by looking at both




                                                                • prepending the current number a to all splits returned by a recursive call with the rest of the input (x<-b#c), but only if the next number not zero (b>0) (or it's the last number in the input (c==)) and a is one greater than the first number of the respective previous split x (a==x!!0+1).


                                                                and




                                                                • appending the next digit b from the input list to the current number a and going on with the rest of the input ((10*a+b)#c)


                                                                Base case is when the input list is empty (i.e. does not pattern match (b:c)). The recursion starts with the current number a being 0 ((0#)), which never hits the first branch (prepending a to all previous splits), because it will never be greater than any number of the splits.



                                                                Take the length of each split and find the maximum (maximum.map length).



                                                                A variant with also 87 bytes:



                                                                fst.maximum.(0#)
                                                                a#(b:c)=[(r+1,a)|c==||b>0,(r,x)<-b#c,a==x+1]++(10*a+b)#c
                                                                a#b=[(1,a)]


                                                                which basically works the same way, but instead of keeping the whole split in a list, it only keeps a pair (r,x) of the length of the split r an the first number in the split x.






                                                                share|improve this answer


























                                                                  2












                                                                  2








                                                                  2






                                                                  Haskell, 87 bytes



                                                                  maximum.map length.(0#)
                                                                  a#(b:c)=[a:x|c==||b>0,x<-b#c,a==x!!0+1]++(10*a+b)#c
                                                                  a#b=[[a]]


                                                                  Input is a list of digits.



                                                                  Try it online!



                                                                  Function # builds a list of all possible splits by looking at both




                                                                  • prepending the current number a to all splits returned by a recursive call with the rest of the input (x<-b#c), but only if the next number not zero (b>0) (or it's the last number in the input (c==)) and a is one greater than the first number of the respective previous split x (a==x!!0+1).


                                                                  and




                                                                  • appending the next digit b from the input list to the current number a and going on with the rest of the input ((10*a+b)#c)


                                                                  Base case is when the input list is empty (i.e. does not pattern match (b:c)). The recursion starts with the current number a being 0 ((0#)), which never hits the first branch (prepending a to all previous splits), because it will never be greater than any number of the splits.



                                                                  Take the length of each split and find the maximum (maximum.map length).



                                                                  A variant with also 87 bytes:



                                                                  fst.maximum.(0#)
                                                                  a#(b:c)=[(r+1,a)|c==||b>0,(r,x)<-b#c,a==x+1]++(10*a+b)#c
                                                                  a#b=[(1,a)]


                                                                  which basically works the same way, but instead of keeping the whole split in a list, it only keeps a pair (r,x) of the length of the split r an the first number in the split x.






                                                                  share|improve this answer














                                                                  Haskell, 87 bytes



                                                                  maximum.map length.(0#)
                                                                  a#(b:c)=[a:x|c==||b>0,x<-b#c,a==x!!0+1]++(10*a+b)#c
                                                                  a#b=[[a]]


                                                                  Input is a list of digits.



                                                                  Try it online!



                                                                  Function # builds a list of all possible splits by looking at both




                                                                  • prepending the current number a to all splits returned by a recursive call with the rest of the input (x<-b#c), but only if the next number not zero (b>0) (or it's the last number in the input (c==)) and a is one greater than the first number of the respective previous split x (a==x!!0+1).


                                                                  and




                                                                  • appending the next digit b from the input list to the current number a and going on with the rest of the input ((10*a+b)#c)


                                                                  Base case is when the input list is empty (i.e. does not pattern match (b:c)). The recursion starts with the current number a being 0 ((0#)), which never hits the first branch (prepending a to all previous splits), because it will never be greater than any number of the splits.



                                                                  Take the length of each split and find the maximum (maximum.map length).



                                                                  A variant with also 87 bytes:



                                                                  fst.maximum.(0#)
                                                                  a#(b:c)=[(r+1,a)|c==||b>0,(r,x)<-b#c,a==x+1]++(10*a+b)#c
                                                                  a#b=[(1,a)]


                                                                  which basically works the same way, but instead of keeping the whole split in a list, it only keeps a pair (r,x) of the length of the split r an the first number in the split x.







                                                                  share|improve this answer














                                                                  share|improve this answer



                                                                  share|improve this answer








                                                                  edited 7 hours ago

























                                                                  answered 7 hours ago









                                                                  nimi

                                                                  31.4k32185




                                                                  31.4k32185























                                                                      2















                                                                      Python 3, 302 282 271 bytes



                                                                      -10 bytes thanks to the tip by @ElPedro.



                                                                      Takes input as a string. Basically, it takes increasing larger slices of the number from the left, and sees if for that slice of the number a sequence can be formed using all the numbers.





                                                                      R=range
                                                                      I=int
                                                                      L=len
                                                                      def g(n,m,t=1):
                                                                      for i in R(1,L(m)+1):
                                                                      if I(m)==I(n[:i])+1:
                                                                      if i==L(n):return-~t
                                                                      return g(n[i:],n[:i],t+1)
                                                                      return 1
                                                                      def f(n):
                                                                      for i in R(L(n)):
                                                                      x=n[:i]
                                                                      for j in R(1,L(x)+1):
                                                                      if (I(x)==I(n[i:i+j])+1)*I(n[i]):return g(n[i:],x)
                                                                      return 1


                                                                      Try it online!






                                                                      share|improve this answer























                                                                      • Since you are using range 3 times you can define R=range outside of both functions and then use R(whatever) instead of range(whatever) to save 4 bytes.
                                                                        – ElPedro
                                                                        4 hours ago
















                                                                      2















                                                                      Python 3, 302 282 271 bytes



                                                                      -10 bytes thanks to the tip by @ElPedro.



                                                                      Takes input as a string. Basically, it takes increasing larger slices of the number from the left, and sees if for that slice of the number a sequence can be formed using all the numbers.





                                                                      R=range
                                                                      I=int
                                                                      L=len
                                                                      def g(n,m,t=1):
                                                                      for i in R(1,L(m)+1):
                                                                      if I(m)==I(n[:i])+1:
                                                                      if i==L(n):return-~t
                                                                      return g(n[i:],n[:i],t+1)
                                                                      return 1
                                                                      def f(n):
                                                                      for i in R(L(n)):
                                                                      x=n[:i]
                                                                      for j in R(1,L(x)+1):
                                                                      if (I(x)==I(n[i:i+j])+1)*I(n[i]):return g(n[i:],x)
                                                                      return 1


                                                                      Try it online!






                                                                      share|improve this answer























                                                                      • Since you are using range 3 times you can define R=range outside of both functions and then use R(whatever) instead of range(whatever) to save 4 bytes.
                                                                        – ElPedro
                                                                        4 hours ago














                                                                      2












                                                                      2








                                                                      2







                                                                      Python 3, 302 282 271 bytes



                                                                      -10 bytes thanks to the tip by @ElPedro.



                                                                      Takes input as a string. Basically, it takes increasing larger slices of the number from the left, and sees if for that slice of the number a sequence can be formed using all the numbers.





                                                                      R=range
                                                                      I=int
                                                                      L=len
                                                                      def g(n,m,t=1):
                                                                      for i in R(1,L(m)+1):
                                                                      if I(m)==I(n[:i])+1:
                                                                      if i==L(n):return-~t
                                                                      return g(n[i:],n[:i],t+1)
                                                                      return 1
                                                                      def f(n):
                                                                      for i in R(L(n)):
                                                                      x=n[:i]
                                                                      for j in R(1,L(x)+1):
                                                                      if (I(x)==I(n[i:i+j])+1)*I(n[i]):return g(n[i:],x)
                                                                      return 1


                                                                      Try it online!






                                                                      share|improve this answer















                                                                      Python 3, 302 282 271 bytes



                                                                      -10 bytes thanks to the tip by @ElPedro.



                                                                      Takes input as a string. Basically, it takes increasing larger slices of the number from the left, and sees if for that slice of the number a sequence can be formed using all the numbers.





                                                                      R=range
                                                                      I=int
                                                                      L=len
                                                                      def g(n,m,t=1):
                                                                      for i in R(1,L(m)+1):
                                                                      if I(m)==I(n[:i])+1:
                                                                      if i==L(n):return-~t
                                                                      return g(n[i:],n[:i],t+1)
                                                                      return 1
                                                                      def f(n):
                                                                      for i in R(L(n)):
                                                                      x=n[:i]
                                                                      for j in R(1,L(x)+1):
                                                                      if (I(x)==I(n[i:i+j])+1)*I(n[i]):return g(n[i:],x)
                                                                      return 1


                                                                      Try it online!







                                                                      share|improve this answer














                                                                      share|improve this answer



                                                                      share|improve this answer








                                                                      edited 2 hours ago

























                                                                      answered yesterday









                                                                      Neil A.

                                                                      1,178120




                                                                      1,178120












                                                                      • Since you are using range 3 times you can define R=range outside of both functions and then use R(whatever) instead of range(whatever) to save 4 bytes.
                                                                        – ElPedro
                                                                        4 hours ago


















                                                                      • Since you are using range 3 times you can define R=range outside of both functions and then use R(whatever) instead of range(whatever) to save 4 bytes.
                                                                        – ElPedro
                                                                        4 hours ago
















                                                                      Since you are using range 3 times you can define R=range outside of both functions and then use R(whatever) instead of range(whatever) to save 4 bytes.
                                                                      – ElPedro
                                                                      4 hours ago




                                                                      Since you are using range 3 times you can define R=range outside of both functions and then use R(whatever) instead of range(whatever) to save 4 bytes.
                                                                      – ElPedro
                                                                      4 hours ago











                                                                      1















                                                                      Japt, 30 bytes



                                                                      ;õ0 Ô+J f,+Uì q",?" +J mèJ ²ÎÉ


                                                                      Try it online! or Check most test cases



                                                                      This doesn't score well, but it uses a unique method and there might be room to golf it a lot more. It also performs well enough that all test cases other than 201200199198 avoid timing out.



                                                                      Explanation:



                                                                      ;                                 #Set J = ","
                                                                      õ0 #Get the range [0...input]
                                                                      Ô #Reverse it
                                                                      +J #Add a comma to the end, casting to a string by joining with ","
                                                                      f #Get the substring that matches this regex:
                                                                      , # Starts with a comma
                                                                      +Uì # Has all the digits of the input
                                                                      q",?" # Optionally, there can be commas between any digits
                                                                      +J # Ends with a comma
                                                                      mèJ #Count the number of commas in the result
                                                                      ²Î #Use 2 instead if no substring matched
                                                                      É #Subtract 1





                                                                      share|improve this answer





















                                                                      • I think this works for 27.
                                                                        – Shaggy
                                                                        12 hours ago












                                                                      • 25 bytes
                                                                        – Shaggy
                                                                        12 hours ago










                                                                      • @Shaggy both of those fail on input 21201 because they don't enforce that the sequence end aligns correctly (from my original version the "ends with a comma" line). This or this alternative works.
                                                                        – Kamil Drakari
                                                                        7 hours ago










                                                                      • Ah, OK. In that case: 26 bytes
                                                                        – Shaggy
                                                                        6 hours ago
















                                                                      1















                                                                      Japt, 30 bytes



                                                                      ;õ0 Ô+J f,+Uì q",?" +J mèJ ²ÎÉ


                                                                      Try it online! or Check most test cases



                                                                      This doesn't score well, but it uses a unique method and there might be room to golf it a lot more. It also performs well enough that all test cases other than 201200199198 avoid timing out.



                                                                      Explanation:



                                                                      ;                                 #Set J = ","
                                                                      õ0 #Get the range [0...input]
                                                                      Ô #Reverse it
                                                                      +J #Add a comma to the end, casting to a string by joining with ","
                                                                      f #Get the substring that matches this regex:
                                                                      , # Starts with a comma
                                                                      +Uì # Has all the digits of the input
                                                                      q",?" # Optionally, there can be commas between any digits
                                                                      +J # Ends with a comma
                                                                      mèJ #Count the number of commas in the result
                                                                      ²Î #Use 2 instead if no substring matched
                                                                      É #Subtract 1





                                                                      share|improve this answer





















                                                                      • I think this works for 27.
                                                                        – Shaggy
                                                                        12 hours ago












                                                                      • 25 bytes
                                                                        – Shaggy
                                                                        12 hours ago










                                                                      • @Shaggy both of those fail on input 21201 because they don't enforce that the sequence end aligns correctly (from my original version the "ends with a comma" line). This or this alternative works.
                                                                        – Kamil Drakari
                                                                        7 hours ago










                                                                      • Ah, OK. In that case: 26 bytes
                                                                        – Shaggy
                                                                        6 hours ago














                                                                      1












                                                                      1








                                                                      1







                                                                      Japt, 30 bytes



                                                                      ;õ0 Ô+J f,+Uì q",?" +J mèJ ²ÎÉ


                                                                      Try it online! or Check most test cases



                                                                      This doesn't score well, but it uses a unique method and there might be room to golf it a lot more. It also performs well enough that all test cases other than 201200199198 avoid timing out.



                                                                      Explanation:



                                                                      ;                                 #Set J = ","
                                                                      õ0 #Get the range [0...input]
                                                                      Ô #Reverse it
                                                                      +J #Add a comma to the end, casting to a string by joining with ","
                                                                      f #Get the substring that matches this regex:
                                                                      , # Starts with a comma
                                                                      +Uì # Has all the digits of the input
                                                                      q",?" # Optionally, there can be commas between any digits
                                                                      +J # Ends with a comma
                                                                      mèJ #Count the number of commas in the result
                                                                      ²Î #Use 2 instead if no substring matched
                                                                      É #Subtract 1





                                                                      share|improve this answer













                                                                      Japt, 30 bytes



                                                                      ;õ0 Ô+J f,+Uì q",?" +J mèJ ²ÎÉ


                                                                      Try it online! or Check most test cases



                                                                      This doesn't score well, but it uses a unique method and there might be room to golf it a lot more. It also performs well enough that all test cases other than 201200199198 avoid timing out.



                                                                      Explanation:



                                                                      ;                                 #Set J = ","
                                                                      õ0 #Get the range [0...input]
                                                                      Ô #Reverse it
                                                                      +J #Add a comma to the end, casting to a string by joining with ","
                                                                      f #Get the substring that matches this regex:
                                                                      , # Starts with a comma
                                                                      +Uì # Has all the digits of the input
                                                                      q",?" # Optionally, there can be commas between any digits
                                                                      +J # Ends with a comma
                                                                      mèJ #Count the number of commas in the result
                                                                      ²Î #Use 2 instead if no substring matched
                                                                      É #Subtract 1






                                                                      share|improve this answer












                                                                      share|improve this answer



                                                                      share|improve this answer










                                                                      answered yesterday









                                                                      Kamil Drakari

                                                                      2,981416




                                                                      2,981416












                                                                      • I think this works for 27.
                                                                        – Shaggy
                                                                        12 hours ago












                                                                      • 25 bytes
                                                                        – Shaggy
                                                                        12 hours ago










                                                                      • @Shaggy both of those fail on input 21201 because they don't enforce that the sequence end aligns correctly (from my original version the "ends with a comma" line). This or this alternative works.
                                                                        – Kamil Drakari
                                                                        7 hours ago










                                                                      • Ah, OK. In that case: 26 bytes
                                                                        – Shaggy
                                                                        6 hours ago


















                                                                      • I think this works for 27.
                                                                        – Shaggy
                                                                        12 hours ago












                                                                      • 25 bytes
                                                                        – Shaggy
                                                                        12 hours ago










                                                                      • @Shaggy both of those fail on input 21201 because they don't enforce that the sequence end aligns correctly (from my original version the "ends with a comma" line). This or this alternative works.
                                                                        – Kamil Drakari
                                                                        7 hours ago










                                                                      • Ah, OK. In that case: 26 bytes
                                                                        – Shaggy
                                                                        6 hours ago
















                                                                      I think this works for 27.
                                                                      – Shaggy
                                                                      12 hours ago






                                                                      I think this works for 27.
                                                                      – Shaggy
                                                                      12 hours ago














                                                                      25 bytes
                                                                      – Shaggy
                                                                      12 hours ago




                                                                      25 bytes
                                                                      – Shaggy
                                                                      12 hours ago












                                                                      @Shaggy both of those fail on input 21201 because they don't enforce that the sequence end aligns correctly (from my original version the "ends with a comma" line). This or this alternative works.
                                                                      – Kamil Drakari
                                                                      7 hours ago




                                                                      @Shaggy both of those fail on input 21201 because they don't enforce that the sequence end aligns correctly (from my original version the "ends with a comma" line). This or this alternative works.
                                                                      – Kamil Drakari
                                                                      7 hours ago












                                                                      Ah, OK. In that case: 26 bytes
                                                                      – Shaggy
                                                                      6 hours ago




                                                                      Ah, OK. In that case: 26 bytes
                                                                      – Shaggy
                                                                      6 hours ago











                                                                      1















                                                                      Jelly, 11 bytes



                                                                      ŒṖḌ’DɗƑƇẈṀ


                                                                      Byte for byte, no match for the other Jelly solution, but this one should be roughly $Oleft(n^{0.3}right)$.



                                                                      Try it online!



                                                                      How it works



                                                                      ŒṖḌ’DɗƑƇẈṀ  Main link. Argument: n (integer)

                                                                      ŒṖ Yield all partitions of n's digit list in base 10.
                                                                      Ƈ Comb; keep only partitions for which the link to the left returns 1.
                                                                      Ƒ Fixed; yield 1 if calling the link to the left returns its argument.
                                                                      Cumulatively reduce the partition by the link to the left.
                                                                      ɗ Combine the three links to the left into a dyadic chain.
                                                                      Ḍ Undecimal; convert a digit list into an integer.
                                                                      ’ Decrement the result.
                                                                      D Decimal; convert the integer back to a digit list.





                                                                      share|improve this answer




























                                                                        1















                                                                        Jelly, 11 bytes



                                                                        ŒṖḌ’DɗƑƇẈṀ


                                                                        Byte for byte, no match for the other Jelly solution, but this one should be roughly $Oleft(n^{0.3}right)$.



                                                                        Try it online!



                                                                        How it works



                                                                        ŒṖḌ’DɗƑƇẈṀ  Main link. Argument: n (integer)

                                                                        ŒṖ Yield all partitions of n's digit list in base 10.
                                                                        Ƈ Comb; keep only partitions for which the link to the left returns 1.
                                                                        Ƒ Fixed; yield 1 if calling the link to the left returns its argument.
                                                                        Cumulatively reduce the partition by the link to the left.
                                                                        ɗ Combine the three links to the left into a dyadic chain.
                                                                        Ḍ Undecimal; convert a digit list into an integer.
                                                                        ’ Decrement the result.
                                                                        D Decimal; convert the integer back to a digit list.





                                                                        share|improve this answer


























                                                                          1












                                                                          1








                                                                          1







                                                                          Jelly, 11 bytes



                                                                          ŒṖḌ’DɗƑƇẈṀ


                                                                          Byte for byte, no match for the other Jelly solution, but this one should be roughly $Oleft(n^{0.3}right)$.



                                                                          Try it online!



                                                                          How it works



                                                                          ŒṖḌ’DɗƑƇẈṀ  Main link. Argument: n (integer)

                                                                          ŒṖ Yield all partitions of n's digit list in base 10.
                                                                          Ƈ Comb; keep only partitions for which the link to the left returns 1.
                                                                          Ƒ Fixed; yield 1 if calling the link to the left returns its argument.
                                                                          Cumulatively reduce the partition by the link to the left.
                                                                          ɗ Combine the three links to the left into a dyadic chain.
                                                                          Ḍ Undecimal; convert a digit list into an integer.
                                                                          ’ Decrement the result.
                                                                          D Decimal; convert the integer back to a digit list.





                                                                          share|improve this answer















                                                                          Jelly, 11 bytes



                                                                          ŒṖḌ’DɗƑƇẈṀ


                                                                          Byte for byte, no match for the other Jelly solution, but this one should be roughly $Oleft(n^{0.3}right)$.



                                                                          Try it online!



                                                                          How it works



                                                                          ŒṖḌ’DɗƑƇẈṀ  Main link. Argument: n (integer)

                                                                          ŒṖ Yield all partitions of n's digit list in base 10.
                                                                          Ƈ Comb; keep only partitions for which the link to the left returns 1.
                                                                          Ƒ Fixed; yield 1 if calling the link to the left returns its argument.
                                                                          Cumulatively reduce the partition by the link to the left.
                                                                          ɗ Combine the three links to the left into a dyadic chain.
                                                                          Ḍ Undecimal; convert a digit list into an integer.
                                                                          ’ Decrement the result.
                                                                          D Decimal; convert the integer back to a digit list.






                                                                          share|improve this answer














                                                                          share|improve this answer



                                                                          share|improve this answer








                                                                          edited yesterday

























                                                                          answered yesterday









                                                                          Dennis

                                                                          187k32297735




                                                                          187k32297735























                                                                              1















                                                                              Charcoal, 26 bytes



                                                                              F⊕LθF⊕Lθ⊞υ⭆κ⁻I…θιλI﹪⌕υθ⊕Lθ


                                                                              Try it online! Link is to verbose version of code. Explanation:



                                                                              F⊕Lθ


                                                                              Loop i from 0 to the length of the input.



                                                                              F⊕Lθ


                                                                              Loop k from 0 to the length of the input.



                                                                              ⊞υ⭆κ⁻I…θ⊕ιλ


                                                                              Calculate the first k numbers in the descending sequence starting from the number given by the first i digits of the input, concatenate them, and accumulate each resulting string in the predefined empty list.



                                                                              I﹪⌕υθ⊕Lθ


                                                                              Find the position of the first matching copy of the input and reduce it modulo 1 more than the length of the input.



                                                                              Example: For an input of 2019 the following strings are generated:



                                                                               0
                                                                              1 0
                                                                              2 0-1
                                                                              3 0-1-2
                                                                              4 0-1-2-3
                                                                              5
                                                                              6 2
                                                                              7 21
                                                                              8 210
                                                                              9 210-1
                                                                              10
                                                                              11 20
                                                                              12 2019
                                                                              13 201918
                                                                              14 20191817
                                                                              15
                                                                              16 201
                                                                              17 201200
                                                                              18 201200199
                                                                              19 201200199198
                                                                              20
                                                                              21 2019
                                                                              22 20192018
                                                                              23 201920182017
                                                                              24 2019201820172016


                                                                              2019 is then found at index 12, which is reduced modulo 5 to give 2, the desired answer.






                                                                              share|improve this answer


























                                                                                1















                                                                                Charcoal, 26 bytes



                                                                                F⊕LθF⊕Lθ⊞υ⭆κ⁻I…θιλI﹪⌕υθ⊕Lθ


                                                                                Try it online! Link is to verbose version of code. Explanation:



                                                                                F⊕Lθ


                                                                                Loop i from 0 to the length of the input.



                                                                                F⊕Lθ


                                                                                Loop k from 0 to the length of the input.



                                                                                ⊞υ⭆κ⁻I…θ⊕ιλ


                                                                                Calculate the first k numbers in the descending sequence starting from the number given by the first i digits of the input, concatenate them, and accumulate each resulting string in the predefined empty list.



                                                                                I﹪⌕υθ⊕Lθ


                                                                                Find the position of the first matching copy of the input and reduce it modulo 1 more than the length of the input.



                                                                                Example: For an input of 2019 the following strings are generated:



                                                                                 0
                                                                                1 0
                                                                                2 0-1
                                                                                3 0-1-2
                                                                                4 0-1-2-3
                                                                                5
                                                                                6 2
                                                                                7 21
                                                                                8 210
                                                                                9 210-1
                                                                                10
                                                                                11 20
                                                                                12 2019
                                                                                13 201918
                                                                                14 20191817
                                                                                15
                                                                                16 201
                                                                                17 201200
                                                                                18 201200199
                                                                                19 201200199198
                                                                                20
                                                                                21 2019
                                                                                22 20192018
                                                                                23 201920182017
                                                                                24 2019201820172016


                                                                                2019 is then found at index 12, which is reduced modulo 5 to give 2, the desired answer.






                                                                                share|improve this answer
























                                                                                  1












                                                                                  1








                                                                                  1







                                                                                  Charcoal, 26 bytes



                                                                                  F⊕LθF⊕Lθ⊞υ⭆κ⁻I…θιλI﹪⌕υθ⊕Lθ


                                                                                  Try it online! Link is to verbose version of code. Explanation:



                                                                                  F⊕Lθ


                                                                                  Loop i from 0 to the length of the input.



                                                                                  F⊕Lθ


                                                                                  Loop k from 0 to the length of the input.



                                                                                  ⊞υ⭆κ⁻I…θ⊕ιλ


                                                                                  Calculate the first k numbers in the descending sequence starting from the number given by the first i digits of the input, concatenate them, and accumulate each resulting string in the predefined empty list.



                                                                                  I﹪⌕υθ⊕Lθ


                                                                                  Find the position of the first matching copy of the input and reduce it modulo 1 more than the length of the input.



                                                                                  Example: For an input of 2019 the following strings are generated:



                                                                                   0
                                                                                  1 0
                                                                                  2 0-1
                                                                                  3 0-1-2
                                                                                  4 0-1-2-3
                                                                                  5
                                                                                  6 2
                                                                                  7 21
                                                                                  8 210
                                                                                  9 210-1
                                                                                  10
                                                                                  11 20
                                                                                  12 2019
                                                                                  13 201918
                                                                                  14 20191817
                                                                                  15
                                                                                  16 201
                                                                                  17 201200
                                                                                  18 201200199
                                                                                  19 201200199198
                                                                                  20
                                                                                  21 2019
                                                                                  22 20192018
                                                                                  23 201920182017
                                                                                  24 2019201820172016


                                                                                  2019 is then found at index 12, which is reduced modulo 5 to give 2, the desired answer.






                                                                                  share|improve this answer













                                                                                  Charcoal, 26 bytes



                                                                                  F⊕LθF⊕Lθ⊞υ⭆κ⁻I…θιλI﹪⌕υθ⊕Lθ


                                                                                  Try it online! Link is to verbose version of code. Explanation:



                                                                                  F⊕Lθ


                                                                                  Loop i from 0 to the length of the input.



                                                                                  F⊕Lθ


                                                                                  Loop k from 0 to the length of the input.



                                                                                  ⊞υ⭆κ⁻I…θ⊕ιλ


                                                                                  Calculate the first k numbers in the descending sequence starting from the number given by the first i digits of the input, concatenate them, and accumulate each resulting string in the predefined empty list.



                                                                                  I﹪⌕υθ⊕Lθ


                                                                                  Find the position of the first matching copy of the input and reduce it modulo 1 more than the length of the input.



                                                                                  Example: For an input of 2019 the following strings are generated:



                                                                                   0
                                                                                  1 0
                                                                                  2 0-1
                                                                                  3 0-1-2
                                                                                  4 0-1-2-3
                                                                                  5
                                                                                  6 2
                                                                                  7 21
                                                                                  8 210
                                                                                  9 210-1
                                                                                  10
                                                                                  11 20
                                                                                  12 2019
                                                                                  13 201918
                                                                                  14 20191817
                                                                                  15
                                                                                  16 201
                                                                                  17 201200
                                                                                  18 201200199
                                                                                  19 201200199198
                                                                                  20
                                                                                  21 2019
                                                                                  22 20192018
                                                                                  23 201920182017
                                                                                  24 2019201820172016


                                                                                  2019 is then found at index 12, which is reduced modulo 5 to give 2, the desired answer.







                                                                                  share|improve this answer












                                                                                  share|improve this answer



                                                                                  share|improve this answer










                                                                                  answered yesterday









                                                                                  Neil

                                                                                  79.5k744177




                                                                                  79.5k744177























                                                                                      1














                                                                                      Haskell, 65 bytes



                                                                                      f i=[y|x<-[0..],y<-[1..length i],i==(show=<<[x+y-1,x+y-2..x])]!!0


                                                                                      Input is a string.



                                                                                      Try it online!



                                                                                      Completely different to my other answer. A simple brute force that tries all lists of consecutive descending numbers until it finds one that equals the input list.



                                                                                      If we limit the input number to 64-bit integers, we can save 6 bytes by looping y through [1..19], because the largest 64-bit integer has 19 digits and there's no need to test lists with more elements.



                                                                                      Haskell, 59 bytes



                                                                                      f i=[y|x<-[0..],y<-[1..19],i==(show=<<[x+y-1,x+y-2..x])]!!0


                                                                                      Try it online!






                                                                                      share|improve this answer




























                                                                                        1














                                                                                        Haskell, 65 bytes



                                                                                        f i=[y|x<-[0..],y<-[1..length i],i==(show=<<[x+y-1,x+y-2..x])]!!0


                                                                                        Input is a string.



                                                                                        Try it online!



                                                                                        Completely different to my other answer. A simple brute force that tries all lists of consecutive descending numbers until it finds one that equals the input list.



                                                                                        If we limit the input number to 64-bit integers, we can save 6 bytes by looping y through [1..19], because the largest 64-bit integer has 19 digits and there's no need to test lists with more elements.



                                                                                        Haskell, 59 bytes



                                                                                        f i=[y|x<-[0..],y<-[1..19],i==(show=<<[x+y-1,x+y-2..x])]!!0


                                                                                        Try it online!






                                                                                        share|improve this answer


























                                                                                          1












                                                                                          1








                                                                                          1






                                                                                          Haskell, 65 bytes



                                                                                          f i=[y|x<-[0..],y<-[1..length i],i==(show=<<[x+y-1,x+y-2..x])]!!0


                                                                                          Input is a string.



                                                                                          Try it online!



                                                                                          Completely different to my other answer. A simple brute force that tries all lists of consecutive descending numbers until it finds one that equals the input list.



                                                                                          If we limit the input number to 64-bit integers, we can save 6 bytes by looping y through [1..19], because the largest 64-bit integer has 19 digits and there's no need to test lists with more elements.



                                                                                          Haskell, 59 bytes



                                                                                          f i=[y|x<-[0..],y<-[1..19],i==(show=<<[x+y-1,x+y-2..x])]!!0


                                                                                          Try it online!






                                                                                          share|improve this answer














                                                                                          Haskell, 65 bytes



                                                                                          f i=[y|x<-[0..],y<-[1..length i],i==(show=<<[x+y-1,x+y-2..x])]!!0


                                                                                          Input is a string.



                                                                                          Try it online!



                                                                                          Completely different to my other answer. A simple brute force that tries all lists of consecutive descending numbers until it finds one that equals the input list.



                                                                                          If we limit the input number to 64-bit integers, we can save 6 bytes by looping y through [1..19], because the largest 64-bit integer has 19 digits and there's no need to test lists with more elements.



                                                                                          Haskell, 59 bytes



                                                                                          f i=[y|x<-[0..],y<-[1..19],i==(show=<<[x+y-1,x+y-2..x])]!!0


                                                                                          Try it online!







                                                                                          share|improve this answer














                                                                                          share|improve this answer



                                                                                          share|improve this answer








                                                                                          edited 5 hours ago

























                                                                                          answered 6 hours ago









                                                                                          nimi

                                                                                          31.4k32185




                                                                                          31.4k32185























                                                                                              1















                                                                                              Python 2, 95 bytes





                                                                                              lambda n:max(j-i for j in range(n+1)for i in range(-1,j)if''.join(map(str,range(j,i,-1)))==`n`)


                                                                                              Another slow, brute-force solution.



                                                                                              Try it online!






                                                                                              share|improve this answer


























                                                                                                1















                                                                                                Python 2, 95 bytes





                                                                                                lambda n:max(j-i for j in range(n+1)for i in range(-1,j)if''.join(map(str,range(j,i,-1)))==`n`)


                                                                                                Another slow, brute-force solution.



                                                                                                Try it online!






                                                                                                share|improve this answer
























                                                                                                  1












                                                                                                  1








                                                                                                  1







                                                                                                  Python 2, 95 bytes





                                                                                                  lambda n:max(j-i for j in range(n+1)for i in range(-1,j)if''.join(map(str,range(j,i,-1)))==`n`)


                                                                                                  Another slow, brute-force solution.



                                                                                                  Try it online!






                                                                                                  share|improve this answer













                                                                                                  Python 2, 95 bytes





                                                                                                  lambda n:max(j-i for j in range(n+1)for i in range(-1,j)if''.join(map(str,range(j,i,-1)))==`n`)


                                                                                                  Another slow, brute-force solution.



                                                                                                  Try it online!







                                                                                                  share|improve this answer












                                                                                                  share|improve this answer



                                                                                                  share|improve this answer










                                                                                                  answered 2 hours ago









                                                                                                  Dennis

                                                                                                  187k32297735




                                                                                                  187k32297735






























                                                                                                      draft saved

                                                                                                      draft discarded




















































                                                                                                      If this is an answer to a challenge…




                                                                                                      • …Be sure to follow the challenge specification. However, please refrain from exploiting obvious loopholes. Answers abusing any of the standard loopholes are considered invalid. If you think a specification is unclear or underspecified, comment on the question instead.


                                                                                                      • …Try to optimize your score. For instance, answers to code-golf challenges should attempt to be as short as possible. You can always include a readable version of the code in addition to the competitive one.
                                                                                                        Explanations of your answer make it more interesting to read and are very much encouraged.


                                                                                                      • …Include a short header which indicates the language(s) of your code and its score, as defined by the challenge.



                                                                                                      More generally…




                                                                                                      • …Please make sure to answer the question and provide sufficient detail.


                                                                                                      • …Avoid asking for help, clarification or responding to other answers (use comments instead).






                                                                                                      Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                                                                                                      Please pay close attention to the following guidance:


                                                                                                      • Please be sure to answer the question. Provide details and share your research!

                                                                                                      But avoid



                                                                                                      • Asking for help, clarification, or responding to other answers.

                                                                                                      • Making statements based on opinion; back them up with references or personal experience.


                                                                                                      To learn more, see our tips on writing great answers.




                                                                                                      draft saved


                                                                                                      draft discarded














                                                                                                      StackExchange.ready(
                                                                                                      function () {
                                                                                                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodegolf.stackexchange.com%2fquestions%2f178373%2fhow-many-consecutive-descending-numbers-in-my-number%23new-answer', 'question_page');
                                                                                                      }
                                                                                                      );

                                                                                                      Post as a guest















                                                                                                      Required, but never shown





















































                                                                                                      Required, but never shown














                                                                                                      Required, but never shown












                                                                                                      Required, but never shown







                                                                                                      Required, but never shown

































                                                                                                      Required, but never shown














                                                                                                      Required, but never shown












                                                                                                      Required, but never shown







                                                                                                      Required, but never shown







                                                                                                      Popular posts from this blog

                                                                                                      An IMO inspired problem

                                                                                                      Management

                                                                                                      Investment