How many consecutive descending numbers in my number?
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 into10
,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 into5,2
because5
and2
are not consecutive,2 ≠ 5 - 1
) - the sequence must be obtained by using the full number, e.g. in
7321
you can't discard7
and get the sequence3
,2
,1
- only one sequence can be obtained from the number, e.g.
3211098
cannot be split into two sequences3
,2
,1
and10
,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
add a comment |
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 into10
,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 into5,2
because5
and2
are not consecutive,2 ≠ 5 - 1
) - the sequence must be obtained by using the full number, e.g. in
7321
you can't discard7
and get the sequence3
,2
,1
- only one sequence can be obtained from the number, e.g.
3211098
cannot be split into two sequences3
,2
,1
and10
,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
1
Migrated from sandbox : codegolf.meta.stackexchange.com/questions/2140/…
– digEmAll
yesterday
1
Is the test case210 -> 2,1,0
wrong (same with0 -> 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
add a comment |
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 into10
,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 into5,2
because5
and2
are not consecutive,2 ≠ 5 - 1
) - the sequence must be obtained by using the full number, e.g. in
7321
you can't discard7
and get the sequence3
,2
,1
- only one sequence can be obtained from the number, e.g.
3211098
cannot be split into two sequences3
,2
,1
and10
,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
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 into10
,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 into5,2
because5
and2
are not consecutive,2 ≠ 5 - 1
) - the sequence must be obtained by using the full number, e.g. in
7321
you can't discard7
and get the sequence3
,2
,1
- only one sequence can be obtained from the number, e.g.
3211098
cannot be split into two sequences3
,2
,1
and10
,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
code-golf
edited yesterday
Veskah
82414
82414
asked yesterday
digEmAll
2,599411
2,599411
1
Migrated from sandbox : codegolf.meta.stackexchange.com/questions/2140/…
– digEmAll
yesterday
1
Is the test case210 -> 2,1,0
wrong (same with0 -> 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
add a comment |
1
Migrated from sandbox : codegolf.meta.stackexchange.com/questions/2140/…
– digEmAll
yesterday
1
Is the test case210 -> 2,1,0
wrong (same with0 -> 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
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
add a comment |
13 Answers
13
active
oldest
votes
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!
add a comment |
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
add a comment |
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
add a comment |
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
New contributor
add a comment |
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
1
Code golf - where adding 1 byte to your program to go fromn!
ton lg n
just isn't worth it.
– corsiKa
5 hours ago
add a comment |
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
add a comment |
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==
)) anda
is one greater than the first number of the respective previous splitx
(a==x!!0+1
).
and
- appending the next digit
b
from the input list to the current numbera
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
.
add a comment |
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!
Since you are usingrange
3 times you can defineR=range
outside of both functions and then useR(whatever)
instead ofrange(whatever)
to save 4 bytes.
– ElPedro
8 hours ago
add a comment |
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.
add a comment |
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.
add a comment |
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!
add a comment |
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!
add a comment |
Japt, 27 bytes
ò pÊÔpÊqÊfl²i1Uì q"l?"¹ÌèÊÉ
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:
ò #Get the range [0...input]
pÊ #Add an "l" to the end
Ô #Reverse it
pÊ #Add an "l" to the end
qÊ #Add an "l" between each number and turn to a string
f ¹ #Find the substrings that match this regex:
l² # The string "ll"
i1 # With this inserted between the "l"s:
Uì # All the digits of the input
q"l?" # With optional spaces between each one
Ì #Get the last match
èÊ #Count the number of "l"s
É #Subtract 1
I think this works for 27.
– Shaggy
15 hours ago
25 bytes
– Shaggy
15 hours ago
@Shaggy both of those fail on input21201
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
10 hours ago
Ah, OK. In that case: 26 bytes
– Shaggy
10 hours ago
@Shaggy That and the 28 byte solutions I had fail on210
because there isn't a delimiter after 0. Here's a fixed 28 byte that works.
– Kamil Drakari
40 mins ago
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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!
add a comment |
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!
add a comment |
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!
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!
answered yesterday
Arnauld
72.6k689306
72.6k689306
add a comment |
add a comment |
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
add a comment |
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
add a comment |
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
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
edited yesterday
answered yesterday
Jonathan Allan
50.8k534165
50.8k534165
add a comment |
add a comment |
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
add a comment |
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
add a comment |
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
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
edited yesterday
answered yesterday
Jo King
21k248110
21k248110
add a comment |
add a comment |
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
New contributor
add a comment |
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
New contributor
add a comment |
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
New contributor
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
New contributor
edited 5 hours ago
New contributor
answered 9 hours ago
Nishioka
513
513
New contributor
New contributor
add a comment |
add a comment |
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
1
Code golf - where adding 1 byte to your program to go fromn!
ton lg n
just isn't worth it.
– corsiKa
5 hours ago
add a comment |
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
1
Code golf - where adding 1 byte to your program to go fromn!
ton lg n
just isn't worth it.
– corsiKa
5 hours ago
add a comment |
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
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
edited yesterday
answered yesterday
Kevin Cruijssen
35.9k554188
35.9k554188
1
Code golf - where adding 1 byte to your program to go fromn!
ton lg n
just isn't worth it.
– corsiKa
5 hours ago
add a comment |
1
Code golf - where adding 1 byte to your program to go fromn!
ton lg n
just isn't worth it.
– corsiKa
5 hours 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
5 hours ago
Code golf - where adding 1 byte to your program to go from
n!
to n lg n
just isn't worth it.– corsiKa
5 hours ago
add a comment |
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
add a comment |
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
add a comment |
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
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
answered yesterday
Sok
3,587722
3,587722
add a comment |
add a comment |
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==
)) anda
is one greater than the first number of the respective previous splitx
(a==x!!0+1
).
and
- appending the next digit
b
from the input list to the current numbera
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
.
add a comment |
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==
)) anda
is one greater than the first number of the respective previous splitx
(a==x!!0+1
).
and
- appending the next digit
b
from the input list to the current numbera
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
.
add a comment |
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==
)) anda
is one greater than the first number of the respective previous splitx
(a==x!!0+1
).
and
- appending the next digit
b
from the input list to the current numbera
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
.
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==
)) anda
is one greater than the first number of the respective previous splitx
(a==x!!0+1
).
and
- appending the next digit
b
from the input list to the current numbera
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
.
edited 10 hours ago
answered 11 hours ago
nimi
31.4k32185
31.4k32185
add a comment |
add a comment |
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!
Since you are usingrange
3 times you can defineR=range
outside of both functions and then useR(whatever)
instead ofrange(whatever)
to save 4 bytes.
– ElPedro
8 hours ago
add a comment |
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!
Since you are usingrange
3 times you can defineR=range
outside of both functions and then useR(whatever)
instead ofrange(whatever)
to save 4 bytes.
– ElPedro
8 hours ago
add a comment |
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!
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!
edited 6 hours ago
answered yesterday
Neil A.
1,188120
1,188120
Since you are usingrange
3 times you can defineR=range
outside of both functions and then useR(whatever)
instead ofrange(whatever)
to save 4 bytes.
– ElPedro
8 hours ago
add a comment |
Since you are usingrange
3 times you can defineR=range
outside of both functions and then useR(whatever)
instead ofrange(whatever)
to save 4 bytes.
– ElPedro
8 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
8 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
8 hours ago
add a comment |
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.
add a comment |
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.
add a comment |
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.
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.
edited yesterday
answered yesterday
Dennis♦
187k32297735
187k32297735
add a comment |
add a comment |
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.
add a comment |
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.
add a comment |
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.
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.
answered yesterday
Neil
79.5k744177
79.5k744177
add a comment |
add a comment |
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!
add a comment |
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!
add a comment |
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!
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!
edited 9 hours ago
answered 10 hours ago
nimi
31.4k32185
31.4k32185
add a comment |
add a comment |
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!
add a comment |
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!
add a comment |
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!
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!
answered 5 hours ago
Dennis♦
187k32297735
187k32297735
add a comment |
add a comment |
Japt, 27 bytes
ò pÊÔpÊqÊfl²i1Uì q"l?"¹ÌèÊÉ
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:
ò #Get the range [0...input]
pÊ #Add an "l" to the end
Ô #Reverse it
pÊ #Add an "l" to the end
qÊ #Add an "l" between each number and turn to a string
f ¹ #Find the substrings that match this regex:
l² # The string "ll"
i1 # With this inserted between the "l"s:
Uì # All the digits of the input
q"l?" # With optional spaces between each one
Ì #Get the last match
èÊ #Count the number of "l"s
É #Subtract 1
I think this works for 27.
– Shaggy
15 hours ago
25 bytes
– Shaggy
15 hours ago
@Shaggy both of those fail on input21201
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
10 hours ago
Ah, OK. In that case: 26 bytes
– Shaggy
10 hours ago
@Shaggy That and the 28 byte solutions I had fail on210
because there isn't a delimiter after 0. Here's a fixed 28 byte that works.
– Kamil Drakari
40 mins ago
add a comment |
Japt, 27 bytes
ò pÊÔpÊqÊfl²i1Uì q"l?"¹ÌèÊÉ
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:
ò #Get the range [0...input]
pÊ #Add an "l" to the end
Ô #Reverse it
pÊ #Add an "l" to the end
qÊ #Add an "l" between each number and turn to a string
f ¹ #Find the substrings that match this regex:
l² # The string "ll"
i1 # With this inserted between the "l"s:
Uì # All the digits of the input
q"l?" # With optional spaces between each one
Ì #Get the last match
èÊ #Count the number of "l"s
É #Subtract 1
I think this works for 27.
– Shaggy
15 hours ago
25 bytes
– Shaggy
15 hours ago
@Shaggy both of those fail on input21201
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
10 hours ago
Ah, OK. In that case: 26 bytes
– Shaggy
10 hours ago
@Shaggy That and the 28 byte solutions I had fail on210
because there isn't a delimiter after 0. Here's a fixed 28 byte that works.
– Kamil Drakari
40 mins ago
add a comment |
Japt, 27 bytes
ò pÊÔpÊqÊfl²i1Uì q"l?"¹ÌèÊÉ
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:
ò #Get the range [0...input]
pÊ #Add an "l" to the end
Ô #Reverse it
pÊ #Add an "l" to the end
qÊ #Add an "l" between each number and turn to a string
f ¹ #Find the substrings that match this regex:
l² # The string "ll"
i1 # With this inserted between the "l"s:
Uì # All the digits of the input
q"l?" # With optional spaces between each one
Ì #Get the last match
èÊ #Count the number of "l"s
É #Subtract 1
Japt, 27 bytes
ò pÊÔpÊqÊfl²i1Uì q"l?"¹ÌèÊÉ
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:
ò #Get the range [0...input]
pÊ #Add an "l" to the end
Ô #Reverse it
pÊ #Add an "l" to the end
qÊ #Add an "l" between each number and turn to a string
f ¹ #Find the substrings that match this regex:
l² # The string "ll"
i1 # With this inserted between the "l"s:
Uì # All the digits of the input
q"l?" # With optional spaces between each one
Ì #Get the last match
èÊ #Count the number of "l"s
É #Subtract 1
edited 15 mins ago
answered yesterday
Kamil Drakari
2,981416
2,981416
I think this works for 27.
– Shaggy
15 hours ago
25 bytes
– Shaggy
15 hours ago
@Shaggy both of those fail on input21201
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
10 hours ago
Ah, OK. In that case: 26 bytes
– Shaggy
10 hours ago
@Shaggy That and the 28 byte solutions I had fail on210
because there isn't a delimiter after 0. Here's a fixed 28 byte that works.
– Kamil Drakari
40 mins ago
add a comment |
I think this works for 27.
– Shaggy
15 hours ago
25 bytes
– Shaggy
15 hours ago
@Shaggy both of those fail on input21201
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
10 hours ago
Ah, OK. In that case: 26 bytes
– Shaggy
10 hours ago
@Shaggy That and the 28 byte solutions I had fail on210
because there isn't a delimiter after 0. Here's a fixed 28 byte that works.
– Kamil Drakari
40 mins ago
I think this works for 27.
– Shaggy
15 hours ago
I think this works for 27.
– Shaggy
15 hours ago
25 bytes
– Shaggy
15 hours ago
25 bytes
– Shaggy
15 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
10 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
10 hours ago
Ah, OK. In that case: 26 bytes
– Shaggy
10 hours ago
Ah, OK. In that case: 26 bytes
– Shaggy
10 hours ago
@Shaggy That and the 28 byte solutions I had fail on
210
because there isn't a delimiter after 0. Here's a fixed 28 byte that works.– Kamil Drakari
40 mins ago
@Shaggy That and the 28 byte solutions I had fail on
210
because there isn't a delimiter after 0. Here's a fixed 28 byte that works.– Kamil Drakari
40 mins ago
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
1
Migrated from sandbox : codegolf.meta.stackexchange.com/questions/2140/…
– digEmAll
yesterday
1
Is the test case
210 -> 2,1,0
wrong (same with0 -> 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