Expand and Contract
$begingroup$
Take a positive integer $k$ as input. Start with $n := 1$ and repeatedly increase $n$ by the largest integer power of ten $i$ such that $i le n$ and $i + n le k$.
Repeat until $n = k$ and return a list of all intermediate values of $n$, including both the initial $1$ and the final $k$.
During this process, growth will initially be limited by the former inequality, and only afterwards by the latter; the growth will take the form of an initial "expansion" period, during which $n$ is increased by ever-larger powers, followed by a "contract" period, during which $n$ is increased by ever-smaller powers in order to "zoom in" on the correct number.
Test Cases
1 => [1]
10 => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
321 => [1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 20, 30, 40, 50, 60, 70, 80, 90,
100, 200, 300, 310, 320, 321]
1002 => [1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 20, 30, 40, 50, 60, 70, 80, 90,
100, 200, 300, 400, 500, 600, 700, 800, 900,
1000, 1001, 1002]
This is code-golf, so the shortest answer (in bytes) wins.
code-golf number decimal
$endgroup$
add a comment |
$begingroup$
Take a positive integer $k$ as input. Start with $n := 1$ and repeatedly increase $n$ by the largest integer power of ten $i$ such that $i le n$ and $i + n le k$.
Repeat until $n = k$ and return a list of all intermediate values of $n$, including both the initial $1$ and the final $k$.
During this process, growth will initially be limited by the former inequality, and only afterwards by the latter; the growth will take the form of an initial "expansion" period, during which $n$ is increased by ever-larger powers, followed by a "contract" period, during which $n$ is increased by ever-smaller powers in order to "zoom in" on the correct number.
Test Cases
1 => [1]
10 => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
321 => [1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 20, 30, 40, 50, 60, 70, 80, 90,
100, 200, 300, 310, 320, 321]
1002 => [1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 20, 30, 40, 50, 60, 70, 80, 90,
100, 200, 300, 400, 500, 600, 700, 800, 900,
1000, 1001, 1002]
This is code-golf, so the shortest answer (in bytes) wins.
code-golf number decimal
$endgroup$
2
$begingroup$
May we print the numbers instead of returning a list?
$endgroup$
– Adám
Apr 3 at 8:01
$begingroup$
@Adám Yes, you may.
$endgroup$
– Esolanging Fruit
Apr 3 at 16:32
add a comment |
$begingroup$
Take a positive integer $k$ as input. Start with $n := 1$ and repeatedly increase $n$ by the largest integer power of ten $i$ such that $i le n$ and $i + n le k$.
Repeat until $n = k$ and return a list of all intermediate values of $n$, including both the initial $1$ and the final $k$.
During this process, growth will initially be limited by the former inequality, and only afterwards by the latter; the growth will take the form of an initial "expansion" period, during which $n$ is increased by ever-larger powers, followed by a "contract" period, during which $n$ is increased by ever-smaller powers in order to "zoom in" on the correct number.
Test Cases
1 => [1]
10 => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
321 => [1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 20, 30, 40, 50, 60, 70, 80, 90,
100, 200, 300, 310, 320, 321]
1002 => [1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 20, 30, 40, 50, 60, 70, 80, 90,
100, 200, 300, 400, 500, 600, 700, 800, 900,
1000, 1001, 1002]
This is code-golf, so the shortest answer (in bytes) wins.
code-golf number decimal
$endgroup$
Take a positive integer $k$ as input. Start with $n := 1$ and repeatedly increase $n$ by the largest integer power of ten $i$ such that $i le n$ and $i + n le k$.
Repeat until $n = k$ and return a list of all intermediate values of $n$, including both the initial $1$ and the final $k$.
During this process, growth will initially be limited by the former inequality, and only afterwards by the latter; the growth will take the form of an initial "expansion" period, during which $n$ is increased by ever-larger powers, followed by a "contract" period, during which $n$ is increased by ever-smaller powers in order to "zoom in" on the correct number.
Test Cases
1 => [1]
10 => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
321 => [1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 20, 30, 40, 50, 60, 70, 80, 90,
100, 200, 300, 310, 320, 321]
1002 => [1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 20, 30, 40, 50, 60, 70, 80, 90,
100, 200, 300, 400, 500, 600, 700, 800, 900,
1000, 1001, 1002]
This is code-golf, so the shortest answer (in bytes) wins.
code-golf number decimal
code-golf number decimal
asked Apr 3 at 5:05
Esolanging FruitEsolanging Fruit
8,73932776
8,73932776
2
$begingroup$
May we print the numbers instead of returning a list?
$endgroup$
– Adám
Apr 3 at 8:01
$begingroup$
@Adám Yes, you may.
$endgroup$
– Esolanging Fruit
Apr 3 at 16:32
add a comment |
2
$begingroup$
May we print the numbers instead of returning a list?
$endgroup$
– Adám
Apr 3 at 8:01
$begingroup$
@Adám Yes, you may.
$endgroup$
– Esolanging Fruit
Apr 3 at 16:32
2
2
$begingroup$
May we print the numbers instead of returning a list?
$endgroup$
– Adám
Apr 3 at 8:01
$begingroup$
May we print the numbers instead of returning a list?
$endgroup$
– Adám
Apr 3 at 8:01
$begingroup$
@Adám Yes, you may.
$endgroup$
– Esolanging Fruit
Apr 3 at 16:32
$begingroup$
@Adám Yes, you may.
$endgroup$
– Esolanging Fruit
Apr 3 at 16:32
add a comment |
15 Answers
15
active
oldest
votes
$begingroup$
Haskell, 72 68 64 63 bytes
f=(1!)
c!t|t==c=[c]|t>c=c:(c+10^(pred.length.show.min c$t-c))!t
Try it online!
Thanks Sriotchilism O'Zaic for -4 bytes!
Usage
f 321
[1,2,3,4,5,6,7,8,9,10,20,30,40,50,60,70,80,90,100,200,300,310,320,321]
Explanation
c!t -- c=current number, t=target number
|t==c=[c] -- Target is reached, return last number
|t>c=c:(c+10^(pred.length.show.min c$t-c))!t
c: -- Add current number to list
min c$t-c -- The minimum of the current number, and the difference between the current number and the target
length.show. -- The length of this number
pred. -- Minus 1
10^( ) -- Raise 10 to this power
c+ -- Add that to the current number
( )!t -- Recursion
New contributor
$endgroup$
4
$begingroup$
Welcome to PPCG! Nice first answer.
$endgroup$
– Arnauld
Apr 3 at 9:13
2
$begingroup$
I don't know Haskell, but maybe any of these tips might help: tips for golfing in Haskell and tips for golfing in <all languages>. But I agree, nice answer. +1 from me.
$endgroup$
– Kevin Cruijssen
Apr 3 at 9:21
2
$begingroup$
Welcome to the site! Since(^)
is higher precedence than(+)
you don't need parentheses around the(^)
expression. Same goes for(!)
and(:)
$endgroup$
– Sriotchilism O'Zaic
Apr 3 at 13:24
1
$begingroup$
pred.length.show.min c$t-c
can be shortened tolength(show.min c$t-c)-1
. Anonymous functions are acceptable, so you can drop the leadingf=
as explained in our guide to golfing rules in Haskell.
$endgroup$
– Laikoni
Apr 4 at 9:27
1
$begingroup$
Instead of guards, you can use only one case and a conditional:c!t=c: if t>c then (c+10^(length(show.min c$t-c)-1))!t else
. This allows to apply this tip to save a few more bytes: Try it online!
$endgroup$
– Laikoni
Apr 4 at 9:37
|
show 4 more comments
$begingroup$
JavaScript (ES6), 50 bytes
f=n=>n?[...f(n-(1+/(^10)?(0*$)/.exec(n)[2])),n]:
Try it online!
How?
Theory
The following steps are repeated until $n=0$:
- look for the number $k$ of trailing zeros in the decimal representation of $n$
- decrement $k$ if $n$ is an exact power of $10$
- subtract $x=10^k$ from $n$
Implementation
The value of $x$ is directly computed as a string with the following expression:
+---- leading '1'
|
1 + /(^10)?(0*$)/.exec(n)[2]
____/___/
| |
| +---- trailing zeros (the capturing group that is appended to the leading '1')
+--------- discard one zero if n starts with '10'
Note: Excluding the leading '10'
only affects exact powers of $10$ (e.g. $n=color{red}{10}color{green}{00}$) but does not change the number of captured trailing zeros for values such as $n=color{red}{10}23color{green}{00}$ (because of the extra non-zero middle digits, '10'
is actually not matched at all in such cases).
$endgroup$
$begingroup$
Ingenious noting you can do the iteration "backwards" keeping track of only one variable! It's a bit confusing that you usek
for something completely different than in the challenge description (in fact yourn
is a mix of OP'sn
andk
and yourx
is theiri
.)
$endgroup$
– Ørjan Johansen
Apr 4 at 17:36
add a comment |
$begingroup$
Python 2, 61 bytes
f=lambda k,n=1:n<k and[n]+f(k,n+10**~-len(`min(n,k-n)`))or[n]
Try it online!
$endgroup$
add a comment |
$begingroup$
Perl 6, 48 41 bytes
->k{1,{$_+10**min($_,k-$_).comb/10}...k}
Try it online!
Explanation:
->k{ } # Anonymous code block taking k
1, ...k # Start a sequence from 1 to k
{ } # Where each element is
$_+ # The previous element plus
10** # 10 to the power of
.comb # The length of
min($_,k-$_) # The min of the current count and the remainder
/10 # Minus one
$endgroup$
add a comment |
$begingroup$
APL (Dyalog Unicode), 30 bytesSBCS
Anonymous tacit prefix function. Prints numbers on separate lines to stdout.
{⍺=⍵:⍺⋄⍺∇⍵+10*⌊/⌊10⍟⍵,⍺-⎕←⍵}∘1
Try it online!
{
…}∘1
anonymous infix lambda with 1 curried as initial $n$:
⍺=⍵
if $k$ and $n$ are equal:
⍺
return (and implicitly print) $k$
⋄
else:
⎕←⍵
print $n$
⍺-
subtract that from $k$
⍵,
prepend $n$
10⍟
$log_{10}$ of those
⌊
floor those
⌊/
minimum of those
10*
ten raised to the power of that
⍵+
$n$ plus that
⍺∇
recurse using same $k$ and new $n$
$endgroup$
add a comment |
$begingroup$
05AB1E, 15 bytes
1[=ÐIαD_#‚ßg<°+
Port of @PaulMutser's (first) Haskell answer, so make sure to upvote him!!
Try it online or verify all test cases.
Outputs the numbers newline delimited.
If it must be a list, I'd have to add 3 bytes:
X[DˆÐIαD_#‚ßg<°+}¯
Try it online or verify all test cases.
Explanation:
1 # Push a 1 to the stack
[ # Start an infinite loop
= # Print the current number with trailing newline (without popping it)
Ð # Triplicate the current number
Iα # Get the absolute difference with the input
D # Duplicate that absolute difference
_ # If this difference is 0:
# # Stop the infinite loop
‚ß # Pair it with the current number, and pop and push the minimum
g<° # Calculate 10 to the power of the length of the minimum minus 1
+ # And add it to the current number
$endgroup$
add a comment |
$begingroup$
Jelly, 19 bytes
1µ«³_$DL’⁵*$+µ<³$п
Try it online!
$endgroup$
add a comment |
$begingroup$
Wolfram Language (Mathematica), 51 bytes
Union@NestList[#+10^Floor@Log10@Min[s-#,#]&,1,s=#]&
Try it online!
$endgroup$
add a comment |
$begingroup$
Batch, 131 bytes
@set/an=i=1
:e
@if %n%==%i%0 set i=%i%0
@echo %n%
:c
@set/an+=i
@if %n% leq %1 goto e
@set/an-=i,i/=10
@if %i% neq 0 goto c
Takes input as a command-line parameter and outputs the list of numbers to STDOUT. Explanation:
@set/an=i=1
Start with n=1
and i=1
representing the power of 10.
:e
@if %n%==%i%0 set i=%i%0
Multiply i
by 10 if n
has reached the next power of 10.
@echo %n%
Output the current value of n
.
:c
@set/an+=i
@if %n% leq %1 goto e
Repeat while i
can be added to n
without it exceeding the input.
@set/an-=i,i/=10
Restore the previous value of n
and divide i
by 10.
@if %i% neq 0 goto c
If i
is not zero then try adding i
to n
again.
$endgroup$
add a comment |
$begingroup$
R, 67 65 bytes
-2 bytes thanks to Giuseppe
k=scan();o=1;i=10^(k:0);while(T<k)o=c(o,T<-T+i[i<=T&i+T<=k][1]);o
Pretty simple. It takes a set of powers of 10 beyond what would be needed in reverse order i
.
(I would prefer to use i=10^rev(0:log10(k))
instead of i=10^(k:0)
since the latter is computationally ineffecient, but golf is golf!).
Then in a while loop, applies the conditions to i
and takes the first (i.e. largest); updates n
, and appends to output
Try it online!
$endgroup$
1
$begingroup$
Save a byte usingT
instead ofn
; it should be 2 but I don't think thatTRUE
is acceptable output fork=1
, so we seto=+T
. Try it!
$endgroup$
– Giuseppe
Apr 3 at 13:15
1
$begingroup$
That is horrendous coding, I like it. incidently, I can seto=1
, and get that second byte.
$endgroup$
– Aaron Hayman
Apr 3 at 13:23
add a comment |
$begingroup$
Jelly, 12 bytes
1+«ạæḟ⁵«Ɗɗ¥Ƭ
Try it online!
$endgroup$
add a comment |
$begingroup$
Pip, 27 bytes
Wa>Po+:y/t*Y1Ty>o|o+y>ay*:t
Try it online!
In pseudocode:
a = args[0]
o = 1
print o
while a > o {
y = 1
till y > o || o + y > a
y *= 10
o += y / 10
print o
}
I'm pretty pleased with the golfing tricks I was able to apply to shorten this algorithm. By initializing, updating, and printing stuff in the loop header, I was able to avoid needing curly braces for the loop body. There's probably a golfier algorithm, though.
$endgroup$
add a comment |
$begingroup$
Japt, 18 bytes
ÆT±ApTmTnU)sÊÉÃf§U
Try it
ÆT±ApTmTnU)sÊÉÃf§U :Implicit input of integer U
Æ :Map the range [0,U)
T± : Increment T (initially 0) by
A : 10
p : Raised to the power of
Tm : The minimum of T and
TnU : T subtracted from U
) : End minimum
s : Convert to string
Ê : Length
É : Subtract 1
à :End map
f :Filter
§U : Less than or equal to U
$endgroup$
add a comment |
$begingroup$
C# (Visual C# Interactive Compiler), 123 122 bytes
m=>{var a=new{1}.ToList();int s;for(;(s=a.Last())<m;)a.Add(s+(int)Math.Pow(10,(int)Math.Log(s<m-s?s:m-s,10)));return a;}
Try it online!
$endgroup$
add a comment |
$begingroup$
Prolog (SWI), 142 bytes
L-D-M:-append(L,[D],M).
N-L-C-X-R-I:-I=1,C is X*10,N-L-C-C-R-1;D is C+X,(D<N,L-D-M,N-M-D-X-R-I;D>N,N-L-C-(X/10)-R-0;L-D-R).
N-R:-N--0-1-R-1.
Try it online!
Explanation coming tomorrow or something
$endgroup$
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%2f182569%2fexpand-and-contract%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
15 Answers
15
active
oldest
votes
15 Answers
15
active
oldest
votes
active
oldest
votes
active
oldest
votes
$begingroup$
Haskell, 72 68 64 63 bytes
f=(1!)
c!t|t==c=[c]|t>c=c:(c+10^(pred.length.show.min c$t-c))!t
Try it online!
Thanks Sriotchilism O'Zaic for -4 bytes!
Usage
f 321
[1,2,3,4,5,6,7,8,9,10,20,30,40,50,60,70,80,90,100,200,300,310,320,321]
Explanation
c!t -- c=current number, t=target number
|t==c=[c] -- Target is reached, return last number
|t>c=c:(c+10^(pred.length.show.min c$t-c))!t
c: -- Add current number to list
min c$t-c -- The minimum of the current number, and the difference between the current number and the target
length.show. -- The length of this number
pred. -- Minus 1
10^( ) -- Raise 10 to this power
c+ -- Add that to the current number
( )!t -- Recursion
New contributor
$endgroup$
4
$begingroup$
Welcome to PPCG! Nice first answer.
$endgroup$
– Arnauld
Apr 3 at 9:13
2
$begingroup$
I don't know Haskell, but maybe any of these tips might help: tips for golfing in Haskell and tips for golfing in <all languages>. But I agree, nice answer. +1 from me.
$endgroup$
– Kevin Cruijssen
Apr 3 at 9:21
2
$begingroup$
Welcome to the site! Since(^)
is higher precedence than(+)
you don't need parentheses around the(^)
expression. Same goes for(!)
and(:)
$endgroup$
– Sriotchilism O'Zaic
Apr 3 at 13:24
1
$begingroup$
pred.length.show.min c$t-c
can be shortened tolength(show.min c$t-c)-1
. Anonymous functions are acceptable, so you can drop the leadingf=
as explained in our guide to golfing rules in Haskell.
$endgroup$
– Laikoni
Apr 4 at 9:27
1
$begingroup$
Instead of guards, you can use only one case and a conditional:c!t=c: if t>c then (c+10^(length(show.min c$t-c)-1))!t else
. This allows to apply this tip to save a few more bytes: Try it online!
$endgroup$
– Laikoni
Apr 4 at 9:37
|
show 4 more comments
$begingroup$
Haskell, 72 68 64 63 bytes
f=(1!)
c!t|t==c=[c]|t>c=c:(c+10^(pred.length.show.min c$t-c))!t
Try it online!
Thanks Sriotchilism O'Zaic for -4 bytes!
Usage
f 321
[1,2,3,4,5,6,7,8,9,10,20,30,40,50,60,70,80,90,100,200,300,310,320,321]
Explanation
c!t -- c=current number, t=target number
|t==c=[c] -- Target is reached, return last number
|t>c=c:(c+10^(pred.length.show.min c$t-c))!t
c: -- Add current number to list
min c$t-c -- The minimum of the current number, and the difference between the current number and the target
length.show. -- The length of this number
pred. -- Minus 1
10^( ) -- Raise 10 to this power
c+ -- Add that to the current number
( )!t -- Recursion
New contributor
$endgroup$
4
$begingroup$
Welcome to PPCG! Nice first answer.
$endgroup$
– Arnauld
Apr 3 at 9:13
2
$begingroup$
I don't know Haskell, but maybe any of these tips might help: tips for golfing in Haskell and tips for golfing in <all languages>. But I agree, nice answer. +1 from me.
$endgroup$
– Kevin Cruijssen
Apr 3 at 9:21
2
$begingroup$
Welcome to the site! Since(^)
is higher precedence than(+)
you don't need parentheses around the(^)
expression. Same goes for(!)
and(:)
$endgroup$
– Sriotchilism O'Zaic
Apr 3 at 13:24
1
$begingroup$
pred.length.show.min c$t-c
can be shortened tolength(show.min c$t-c)-1
. Anonymous functions are acceptable, so you can drop the leadingf=
as explained in our guide to golfing rules in Haskell.
$endgroup$
– Laikoni
Apr 4 at 9:27
1
$begingroup$
Instead of guards, you can use only one case and a conditional:c!t=c: if t>c then (c+10^(length(show.min c$t-c)-1))!t else
. This allows to apply this tip to save a few more bytes: Try it online!
$endgroup$
– Laikoni
Apr 4 at 9:37
|
show 4 more comments
$begingroup$
Haskell, 72 68 64 63 bytes
f=(1!)
c!t|t==c=[c]|t>c=c:(c+10^(pred.length.show.min c$t-c))!t
Try it online!
Thanks Sriotchilism O'Zaic for -4 bytes!
Usage
f 321
[1,2,3,4,5,6,7,8,9,10,20,30,40,50,60,70,80,90,100,200,300,310,320,321]
Explanation
c!t -- c=current number, t=target number
|t==c=[c] -- Target is reached, return last number
|t>c=c:(c+10^(pred.length.show.min c$t-c))!t
c: -- Add current number to list
min c$t-c -- The minimum of the current number, and the difference between the current number and the target
length.show. -- The length of this number
pred. -- Minus 1
10^( ) -- Raise 10 to this power
c+ -- Add that to the current number
( )!t -- Recursion
New contributor
$endgroup$
Haskell, 72 68 64 63 bytes
f=(1!)
c!t|t==c=[c]|t>c=c:(c+10^(pred.length.show.min c$t-c))!t
Try it online!
Thanks Sriotchilism O'Zaic for -4 bytes!
Usage
f 321
[1,2,3,4,5,6,7,8,9,10,20,30,40,50,60,70,80,90,100,200,300,310,320,321]
Explanation
c!t -- c=current number, t=target number
|t==c=[c] -- Target is reached, return last number
|t>c=c:(c+10^(pred.length.show.min c$t-c))!t
c: -- Add current number to list
min c$t-c -- The minimum of the current number, and the difference between the current number and the target
length.show. -- The length of this number
pred. -- Minus 1
10^( ) -- Raise 10 to this power
c+ -- Add that to the current number
( )!t -- Recursion
New contributor
edited Apr 4 at 7:17
New contributor
answered Apr 3 at 9:12
Paul MutserPaul Mutser
712
712
New contributor
New contributor
4
$begingroup$
Welcome to PPCG! Nice first answer.
$endgroup$
– Arnauld
Apr 3 at 9:13
2
$begingroup$
I don't know Haskell, but maybe any of these tips might help: tips for golfing in Haskell and tips for golfing in <all languages>. But I agree, nice answer. +1 from me.
$endgroup$
– Kevin Cruijssen
Apr 3 at 9:21
2
$begingroup$
Welcome to the site! Since(^)
is higher precedence than(+)
you don't need parentheses around the(^)
expression. Same goes for(!)
and(:)
$endgroup$
– Sriotchilism O'Zaic
Apr 3 at 13:24
1
$begingroup$
pred.length.show.min c$t-c
can be shortened tolength(show.min c$t-c)-1
. Anonymous functions are acceptable, so you can drop the leadingf=
as explained in our guide to golfing rules in Haskell.
$endgroup$
– Laikoni
Apr 4 at 9:27
1
$begingroup$
Instead of guards, you can use only one case and a conditional:c!t=c: if t>c then (c+10^(length(show.min c$t-c)-1))!t else
. This allows to apply this tip to save a few more bytes: Try it online!
$endgroup$
– Laikoni
Apr 4 at 9:37
|
show 4 more comments
4
$begingroup$
Welcome to PPCG! Nice first answer.
$endgroup$
– Arnauld
Apr 3 at 9:13
2
$begingroup$
I don't know Haskell, but maybe any of these tips might help: tips for golfing in Haskell and tips for golfing in <all languages>. But I agree, nice answer. +1 from me.
$endgroup$
– Kevin Cruijssen
Apr 3 at 9:21
2
$begingroup$
Welcome to the site! Since(^)
is higher precedence than(+)
you don't need parentheses around the(^)
expression. Same goes for(!)
and(:)
$endgroup$
– Sriotchilism O'Zaic
Apr 3 at 13:24
1
$begingroup$
pred.length.show.min c$t-c
can be shortened tolength(show.min c$t-c)-1
. Anonymous functions are acceptable, so you can drop the leadingf=
as explained in our guide to golfing rules in Haskell.
$endgroup$
– Laikoni
Apr 4 at 9:27
1
$begingroup$
Instead of guards, you can use only one case and a conditional:c!t=c: if t>c then (c+10^(length(show.min c$t-c)-1))!t else
. This allows to apply this tip to save a few more bytes: Try it online!
$endgroup$
– Laikoni
Apr 4 at 9:37
4
4
$begingroup$
Welcome to PPCG! Nice first answer.
$endgroup$
– Arnauld
Apr 3 at 9:13
$begingroup$
Welcome to PPCG! Nice first answer.
$endgroup$
– Arnauld
Apr 3 at 9:13
2
2
$begingroup$
I don't know Haskell, but maybe any of these tips might help: tips for golfing in Haskell and tips for golfing in <all languages>. But I agree, nice answer. +1 from me.
$endgroup$
– Kevin Cruijssen
Apr 3 at 9:21
$begingroup$
I don't know Haskell, but maybe any of these tips might help: tips for golfing in Haskell and tips for golfing in <all languages>. But I agree, nice answer. +1 from me.
$endgroup$
– Kevin Cruijssen
Apr 3 at 9:21
2
2
$begingroup$
Welcome to the site! Since
(^)
is higher precedence than (+)
you don't need parentheses around the (^)
expression. Same goes for (!)
and (:)
$endgroup$
– Sriotchilism O'Zaic
Apr 3 at 13:24
$begingroup$
Welcome to the site! Since
(^)
is higher precedence than (+)
you don't need parentheses around the (^)
expression. Same goes for (!)
and (:)
$endgroup$
– Sriotchilism O'Zaic
Apr 3 at 13:24
1
1
$begingroup$
pred.length.show.min c$t-c
can be shortened to length(show.min c$t-c)-1
. Anonymous functions are acceptable, so you can drop the leading f=
as explained in our guide to golfing rules in Haskell.$endgroup$
– Laikoni
Apr 4 at 9:27
$begingroup$
pred.length.show.min c$t-c
can be shortened to length(show.min c$t-c)-1
. Anonymous functions are acceptable, so you can drop the leading f=
as explained in our guide to golfing rules in Haskell.$endgroup$
– Laikoni
Apr 4 at 9:27
1
1
$begingroup$
Instead of guards, you can use only one case and a conditional:
c!t=c: if t>c then (c+10^(length(show.min c$t-c)-1))!t else
. This allows to apply this tip to save a few more bytes: Try it online!$endgroup$
– Laikoni
Apr 4 at 9:37
$begingroup$
Instead of guards, you can use only one case and a conditional:
c!t=c: if t>c then (c+10^(length(show.min c$t-c)-1))!t else
. This allows to apply this tip to save a few more bytes: Try it online!$endgroup$
– Laikoni
Apr 4 at 9:37
|
show 4 more comments
$begingroup$
JavaScript (ES6), 50 bytes
f=n=>n?[...f(n-(1+/(^10)?(0*$)/.exec(n)[2])),n]:
Try it online!
How?
Theory
The following steps are repeated until $n=0$:
- look for the number $k$ of trailing zeros in the decimal representation of $n$
- decrement $k$ if $n$ is an exact power of $10$
- subtract $x=10^k$ from $n$
Implementation
The value of $x$ is directly computed as a string with the following expression:
+---- leading '1'
|
1 + /(^10)?(0*$)/.exec(n)[2]
____/___/
| |
| +---- trailing zeros (the capturing group that is appended to the leading '1')
+--------- discard one zero if n starts with '10'
Note: Excluding the leading '10'
only affects exact powers of $10$ (e.g. $n=color{red}{10}color{green}{00}$) but does not change the number of captured trailing zeros for values such as $n=color{red}{10}23color{green}{00}$ (because of the extra non-zero middle digits, '10'
is actually not matched at all in such cases).
$endgroup$
$begingroup$
Ingenious noting you can do the iteration "backwards" keeping track of only one variable! It's a bit confusing that you usek
for something completely different than in the challenge description (in fact yourn
is a mix of OP'sn
andk
and yourx
is theiri
.)
$endgroup$
– Ørjan Johansen
Apr 4 at 17:36
add a comment |
$begingroup$
JavaScript (ES6), 50 bytes
f=n=>n?[...f(n-(1+/(^10)?(0*$)/.exec(n)[2])),n]:
Try it online!
How?
Theory
The following steps are repeated until $n=0$:
- look for the number $k$ of trailing zeros in the decimal representation of $n$
- decrement $k$ if $n$ is an exact power of $10$
- subtract $x=10^k$ from $n$
Implementation
The value of $x$ is directly computed as a string with the following expression:
+---- leading '1'
|
1 + /(^10)?(0*$)/.exec(n)[2]
____/___/
| |
| +---- trailing zeros (the capturing group that is appended to the leading '1')
+--------- discard one zero if n starts with '10'
Note: Excluding the leading '10'
only affects exact powers of $10$ (e.g. $n=color{red}{10}color{green}{00}$) but does not change the number of captured trailing zeros for values such as $n=color{red}{10}23color{green}{00}$ (because of the extra non-zero middle digits, '10'
is actually not matched at all in such cases).
$endgroup$
$begingroup$
Ingenious noting you can do the iteration "backwards" keeping track of only one variable! It's a bit confusing that you usek
for something completely different than in the challenge description (in fact yourn
is a mix of OP'sn
andk
and yourx
is theiri
.)
$endgroup$
– Ørjan Johansen
Apr 4 at 17:36
add a comment |
$begingroup$
JavaScript (ES6), 50 bytes
f=n=>n?[...f(n-(1+/(^10)?(0*$)/.exec(n)[2])),n]:
Try it online!
How?
Theory
The following steps are repeated until $n=0$:
- look for the number $k$ of trailing zeros in the decimal representation of $n$
- decrement $k$ if $n$ is an exact power of $10$
- subtract $x=10^k$ from $n$
Implementation
The value of $x$ is directly computed as a string with the following expression:
+---- leading '1'
|
1 + /(^10)?(0*$)/.exec(n)[2]
____/___/
| |
| +---- trailing zeros (the capturing group that is appended to the leading '1')
+--------- discard one zero if n starts with '10'
Note: Excluding the leading '10'
only affects exact powers of $10$ (e.g. $n=color{red}{10}color{green}{00}$) but does not change the number of captured trailing zeros for values such as $n=color{red}{10}23color{green}{00}$ (because of the extra non-zero middle digits, '10'
is actually not matched at all in such cases).
$endgroup$
JavaScript (ES6), 50 bytes
f=n=>n?[...f(n-(1+/(^10)?(0*$)/.exec(n)[2])),n]:
Try it online!
How?
Theory
The following steps are repeated until $n=0$:
- look for the number $k$ of trailing zeros in the decimal representation of $n$
- decrement $k$ if $n$ is an exact power of $10$
- subtract $x=10^k$ from $n$
Implementation
The value of $x$ is directly computed as a string with the following expression:
+---- leading '1'
|
1 + /(^10)?(0*$)/.exec(n)[2]
____/___/
| |
| +---- trailing zeros (the capturing group that is appended to the leading '1')
+--------- discard one zero if n starts with '10'
Note: Excluding the leading '10'
only affects exact powers of $10$ (e.g. $n=color{red}{10}color{green}{00}$) but does not change the number of captured trailing zeros for values such as $n=color{red}{10}23color{green}{00}$ (because of the extra non-zero middle digits, '10'
is actually not matched at all in such cases).
edited Apr 3 at 8:35
answered Apr 3 at 7:36
ArnauldArnauld
80.7k797334
80.7k797334
$begingroup$
Ingenious noting you can do the iteration "backwards" keeping track of only one variable! It's a bit confusing that you usek
for something completely different than in the challenge description (in fact yourn
is a mix of OP'sn
andk
and yourx
is theiri
.)
$endgroup$
– Ørjan Johansen
Apr 4 at 17:36
add a comment |
$begingroup$
Ingenious noting you can do the iteration "backwards" keeping track of only one variable! It's a bit confusing that you usek
for something completely different than in the challenge description (in fact yourn
is a mix of OP'sn
andk
and yourx
is theiri
.)
$endgroup$
– Ørjan Johansen
Apr 4 at 17:36
$begingroup$
Ingenious noting you can do the iteration "backwards" keeping track of only one variable! It's a bit confusing that you use
k
for something completely different than in the challenge description (in fact your n
is a mix of OP's n
and k
and your x
is their i
.)$endgroup$
– Ørjan Johansen
Apr 4 at 17:36
$begingroup$
Ingenious noting you can do the iteration "backwards" keeping track of only one variable! It's a bit confusing that you use
k
for something completely different than in the challenge description (in fact your n
is a mix of OP's n
and k
and your x
is their i
.)$endgroup$
– Ørjan Johansen
Apr 4 at 17:36
add a comment |
$begingroup$
Python 2, 61 bytes
f=lambda k,n=1:n<k and[n]+f(k,n+10**~-len(`min(n,k-n)`))or[n]
Try it online!
$endgroup$
add a comment |
$begingroup$
Python 2, 61 bytes
f=lambda k,n=1:n<k and[n]+f(k,n+10**~-len(`min(n,k-n)`))or[n]
Try it online!
$endgroup$
add a comment |
$begingroup$
Python 2, 61 bytes
f=lambda k,n=1:n<k and[n]+f(k,n+10**~-len(`min(n,k-n)`))or[n]
Try it online!
$endgroup$
Python 2, 61 bytes
f=lambda k,n=1:n<k and[n]+f(k,n+10**~-len(`min(n,k-n)`))or[n]
Try it online!
edited Apr 3 at 6:08
answered Apr 3 at 6:02
Chas BrownChas Brown
5,2191523
5,2191523
add a comment |
add a comment |
$begingroup$
Perl 6, 48 41 bytes
->k{1,{$_+10**min($_,k-$_).comb/10}...k}
Try it online!
Explanation:
->k{ } # Anonymous code block taking k
1, ...k # Start a sequence from 1 to k
{ } # Where each element is
$_+ # The previous element plus
10** # 10 to the power of
.comb # The length of
min($_,k-$_) # The min of the current count and the remainder
/10 # Minus one
$endgroup$
add a comment |
$begingroup$
Perl 6, 48 41 bytes
->k{1,{$_+10**min($_,k-$_).comb/10}...k}
Try it online!
Explanation:
->k{ } # Anonymous code block taking k
1, ...k # Start a sequence from 1 to k
{ } # Where each element is
$_+ # The previous element plus
10** # 10 to the power of
.comb # The length of
min($_,k-$_) # The min of the current count and the remainder
/10 # Minus one
$endgroup$
add a comment |
$begingroup$
Perl 6, 48 41 bytes
->k{1,{$_+10**min($_,k-$_).comb/10}...k}
Try it online!
Explanation:
->k{ } # Anonymous code block taking k
1, ...k # Start a sequence from 1 to k
{ } # Where each element is
$_+ # The previous element plus
10** # 10 to the power of
.comb # The length of
min($_,k-$_) # The min of the current count and the remainder
/10 # Minus one
$endgroup$
Perl 6, 48 41 bytes
->k{1,{$_+10**min($_,k-$_).comb/10}...k}
Try it online!
Explanation:
->k{ } # Anonymous code block taking k
1, ...k # Start a sequence from 1 to k
{ } # Where each element is
$_+ # The previous element plus
10** # 10 to the power of
.comb # The length of
min($_,k-$_) # The min of the current count and the remainder
/10 # Minus one
edited Apr 3 at 6:13
answered Apr 3 at 5:50
Jo KingJo King
26.6k365132
26.6k365132
add a comment |
add a comment |
$begingroup$
APL (Dyalog Unicode), 30 bytesSBCS
Anonymous tacit prefix function. Prints numbers on separate lines to stdout.
{⍺=⍵:⍺⋄⍺∇⍵+10*⌊/⌊10⍟⍵,⍺-⎕←⍵}∘1
Try it online!
{
…}∘1
anonymous infix lambda with 1 curried as initial $n$:
⍺=⍵
if $k$ and $n$ are equal:
⍺
return (and implicitly print) $k$
⋄
else:
⎕←⍵
print $n$
⍺-
subtract that from $k$
⍵,
prepend $n$
10⍟
$log_{10}$ of those
⌊
floor those
⌊/
minimum of those
10*
ten raised to the power of that
⍵+
$n$ plus that
⍺∇
recurse using same $k$ and new $n$
$endgroup$
add a comment |
$begingroup$
APL (Dyalog Unicode), 30 bytesSBCS
Anonymous tacit prefix function. Prints numbers on separate lines to stdout.
{⍺=⍵:⍺⋄⍺∇⍵+10*⌊/⌊10⍟⍵,⍺-⎕←⍵}∘1
Try it online!
{
…}∘1
anonymous infix lambda with 1 curried as initial $n$:
⍺=⍵
if $k$ and $n$ are equal:
⍺
return (and implicitly print) $k$
⋄
else:
⎕←⍵
print $n$
⍺-
subtract that from $k$
⍵,
prepend $n$
10⍟
$log_{10}$ of those
⌊
floor those
⌊/
minimum of those
10*
ten raised to the power of that
⍵+
$n$ plus that
⍺∇
recurse using same $k$ and new $n$
$endgroup$
add a comment |
$begingroup$
APL (Dyalog Unicode), 30 bytesSBCS
Anonymous tacit prefix function. Prints numbers on separate lines to stdout.
{⍺=⍵:⍺⋄⍺∇⍵+10*⌊/⌊10⍟⍵,⍺-⎕←⍵}∘1
Try it online!
{
…}∘1
anonymous infix lambda with 1 curried as initial $n$:
⍺=⍵
if $k$ and $n$ are equal:
⍺
return (and implicitly print) $k$
⋄
else:
⎕←⍵
print $n$
⍺-
subtract that from $k$
⍵,
prepend $n$
10⍟
$log_{10}$ of those
⌊
floor those
⌊/
minimum of those
10*
ten raised to the power of that
⍵+
$n$ plus that
⍺∇
recurse using same $k$ and new $n$
$endgroup$
APL (Dyalog Unicode), 30 bytesSBCS
Anonymous tacit prefix function. Prints numbers on separate lines to stdout.
{⍺=⍵:⍺⋄⍺∇⍵+10*⌊/⌊10⍟⍵,⍺-⎕←⍵}∘1
Try it online!
{
…}∘1
anonymous infix lambda with 1 curried as initial $n$:
⍺=⍵
if $k$ and $n$ are equal:
⍺
return (and implicitly print) $k$
⋄
else:
⎕←⍵
print $n$
⍺-
subtract that from $k$
⍵,
prepend $n$
10⍟
$log_{10}$ of those
⌊
floor those
⌊/
minimum of those
10*
ten raised to the power of that
⍵+
$n$ plus that
⍺∇
recurse using same $k$ and new $n$
answered Apr 3 at 8:21
AdámAdám
29k276207
29k276207
add a comment |
add a comment |
$begingroup$
05AB1E, 15 bytes
1[=ÐIαD_#‚ßg<°+
Port of @PaulMutser's (first) Haskell answer, so make sure to upvote him!!
Try it online or verify all test cases.
Outputs the numbers newline delimited.
If it must be a list, I'd have to add 3 bytes:
X[DˆÐIαD_#‚ßg<°+}¯
Try it online or verify all test cases.
Explanation:
1 # Push a 1 to the stack
[ # Start an infinite loop
= # Print the current number with trailing newline (without popping it)
Ð # Triplicate the current number
Iα # Get the absolute difference with the input
D # Duplicate that absolute difference
_ # If this difference is 0:
# # Stop the infinite loop
‚ß # Pair it with the current number, and pop and push the minimum
g<° # Calculate 10 to the power of the length of the minimum minus 1
+ # And add it to the current number
$endgroup$
add a comment |
$begingroup$
05AB1E, 15 bytes
1[=ÐIαD_#‚ßg<°+
Port of @PaulMutser's (first) Haskell answer, so make sure to upvote him!!
Try it online or verify all test cases.
Outputs the numbers newline delimited.
If it must be a list, I'd have to add 3 bytes:
X[DˆÐIαD_#‚ßg<°+}¯
Try it online or verify all test cases.
Explanation:
1 # Push a 1 to the stack
[ # Start an infinite loop
= # Print the current number with trailing newline (without popping it)
Ð # Triplicate the current number
Iα # Get the absolute difference with the input
D # Duplicate that absolute difference
_ # If this difference is 0:
# # Stop the infinite loop
‚ß # Pair it with the current number, and pop and push the minimum
g<° # Calculate 10 to the power of the length of the minimum minus 1
+ # And add it to the current number
$endgroup$
add a comment |
$begingroup$
05AB1E, 15 bytes
1[=ÐIαD_#‚ßg<°+
Port of @PaulMutser's (first) Haskell answer, so make sure to upvote him!!
Try it online or verify all test cases.
Outputs the numbers newline delimited.
If it must be a list, I'd have to add 3 bytes:
X[DˆÐIαD_#‚ßg<°+}¯
Try it online or verify all test cases.
Explanation:
1 # Push a 1 to the stack
[ # Start an infinite loop
= # Print the current number with trailing newline (without popping it)
Ð # Triplicate the current number
Iα # Get the absolute difference with the input
D # Duplicate that absolute difference
_ # If this difference is 0:
# # Stop the infinite loop
‚ß # Pair it with the current number, and pop and push the minimum
g<° # Calculate 10 to the power of the length of the minimum minus 1
+ # And add it to the current number
$endgroup$
05AB1E, 15 bytes
1[=ÐIαD_#‚ßg<°+
Port of @PaulMutser's (first) Haskell answer, so make sure to upvote him!!
Try it online or verify all test cases.
Outputs the numbers newline delimited.
If it must be a list, I'd have to add 3 bytes:
X[DˆÐIαD_#‚ßg<°+}¯
Try it online or verify all test cases.
Explanation:
1 # Push a 1 to the stack
[ # Start an infinite loop
= # Print the current number with trailing newline (without popping it)
Ð # Triplicate the current number
Iα # Get the absolute difference with the input
D # Duplicate that absolute difference
_ # If this difference is 0:
# # Stop the infinite loop
‚ß # Pair it with the current number, and pop and push the minimum
g<° # Calculate 10 to the power of the length of the minimum minus 1
+ # And add it to the current number
edited Apr 3 at 9:51
answered Apr 3 at 9:43
Kevin CruijssenKevin Cruijssen
42.6k571217
42.6k571217
add a comment |
add a comment |
$begingroup$
Jelly, 19 bytes
1µ«³_$DL’⁵*$+µ<³$п
Try it online!
$endgroup$
add a comment |
$begingroup$
Jelly, 19 bytes
1µ«³_$DL’⁵*$+µ<³$п
Try it online!
$endgroup$
add a comment |
$begingroup$
Jelly, 19 bytes
1µ«³_$DL’⁵*$+µ<³$п
Try it online!
$endgroup$
Jelly, 19 bytes
1µ«³_$DL’⁵*$+µ<³$п
Try it online!
answered Apr 3 at 7:41
Nick KennedyNick Kennedy
1,46649
1,46649
add a comment |
add a comment |
$begingroup$
Wolfram Language (Mathematica), 51 bytes
Union@NestList[#+10^Floor@Log10@Min[s-#,#]&,1,s=#]&
Try it online!
$endgroup$
add a comment |
$begingroup$
Wolfram Language (Mathematica), 51 bytes
Union@NestList[#+10^Floor@Log10@Min[s-#,#]&,1,s=#]&
Try it online!
$endgroup$
add a comment |
$begingroup$
Wolfram Language (Mathematica), 51 bytes
Union@NestList[#+10^Floor@Log10@Min[s-#,#]&,1,s=#]&
Try it online!
$endgroup$
Wolfram Language (Mathematica), 51 bytes
Union@NestList[#+10^Floor@Log10@Min[s-#,#]&,1,s=#]&
Try it online!
answered Apr 3 at 8:15
J42161217J42161217
13.9k21353
13.9k21353
add a comment |
add a comment |
$begingroup$
Batch, 131 bytes
@set/an=i=1
:e
@if %n%==%i%0 set i=%i%0
@echo %n%
:c
@set/an+=i
@if %n% leq %1 goto e
@set/an-=i,i/=10
@if %i% neq 0 goto c
Takes input as a command-line parameter and outputs the list of numbers to STDOUT. Explanation:
@set/an=i=1
Start with n=1
and i=1
representing the power of 10.
:e
@if %n%==%i%0 set i=%i%0
Multiply i
by 10 if n
has reached the next power of 10.
@echo %n%
Output the current value of n
.
:c
@set/an+=i
@if %n% leq %1 goto e
Repeat while i
can be added to n
without it exceeding the input.
@set/an-=i,i/=10
Restore the previous value of n
and divide i
by 10.
@if %i% neq 0 goto c
If i
is not zero then try adding i
to n
again.
$endgroup$
add a comment |
$begingroup$
Batch, 131 bytes
@set/an=i=1
:e
@if %n%==%i%0 set i=%i%0
@echo %n%
:c
@set/an+=i
@if %n% leq %1 goto e
@set/an-=i,i/=10
@if %i% neq 0 goto c
Takes input as a command-line parameter and outputs the list of numbers to STDOUT. Explanation:
@set/an=i=1
Start with n=1
and i=1
representing the power of 10.
:e
@if %n%==%i%0 set i=%i%0
Multiply i
by 10 if n
has reached the next power of 10.
@echo %n%
Output the current value of n
.
:c
@set/an+=i
@if %n% leq %1 goto e
Repeat while i
can be added to n
without it exceeding the input.
@set/an-=i,i/=10
Restore the previous value of n
and divide i
by 10.
@if %i% neq 0 goto c
If i
is not zero then try adding i
to n
again.
$endgroup$
add a comment |
$begingroup$
Batch, 131 bytes
@set/an=i=1
:e
@if %n%==%i%0 set i=%i%0
@echo %n%
:c
@set/an+=i
@if %n% leq %1 goto e
@set/an-=i,i/=10
@if %i% neq 0 goto c
Takes input as a command-line parameter and outputs the list of numbers to STDOUT. Explanation:
@set/an=i=1
Start with n=1
and i=1
representing the power of 10.
:e
@if %n%==%i%0 set i=%i%0
Multiply i
by 10 if n
has reached the next power of 10.
@echo %n%
Output the current value of n
.
:c
@set/an+=i
@if %n% leq %1 goto e
Repeat while i
can be added to n
without it exceeding the input.
@set/an-=i,i/=10
Restore the previous value of n
and divide i
by 10.
@if %i% neq 0 goto c
If i
is not zero then try adding i
to n
again.
$endgroup$
Batch, 131 bytes
@set/an=i=1
:e
@if %n%==%i%0 set i=%i%0
@echo %n%
:c
@set/an+=i
@if %n% leq %1 goto e
@set/an-=i,i/=10
@if %i% neq 0 goto c
Takes input as a command-line parameter and outputs the list of numbers to STDOUT. Explanation:
@set/an=i=1
Start with n=1
and i=1
representing the power of 10.
:e
@if %n%==%i%0 set i=%i%0
Multiply i
by 10 if n
has reached the next power of 10.
@echo %n%
Output the current value of n
.
:c
@set/an+=i
@if %n% leq %1 goto e
Repeat while i
can be added to n
without it exceeding the input.
@set/an-=i,i/=10
Restore the previous value of n
and divide i
by 10.
@if %i% neq 0 goto c
If i
is not zero then try adding i
to n
again.
answered Apr 3 at 9:25
NeilNeil
82.7k745179
82.7k745179
add a comment |
add a comment |
$begingroup$
R, 67 65 bytes
-2 bytes thanks to Giuseppe
k=scan();o=1;i=10^(k:0);while(T<k)o=c(o,T<-T+i[i<=T&i+T<=k][1]);o
Pretty simple. It takes a set of powers of 10 beyond what would be needed in reverse order i
.
(I would prefer to use i=10^rev(0:log10(k))
instead of i=10^(k:0)
since the latter is computationally ineffecient, but golf is golf!).
Then in a while loop, applies the conditions to i
and takes the first (i.e. largest); updates n
, and appends to output
Try it online!
$endgroup$
1
$begingroup$
Save a byte usingT
instead ofn
; it should be 2 but I don't think thatTRUE
is acceptable output fork=1
, so we seto=+T
. Try it!
$endgroup$
– Giuseppe
Apr 3 at 13:15
1
$begingroup$
That is horrendous coding, I like it. incidently, I can seto=1
, and get that second byte.
$endgroup$
– Aaron Hayman
Apr 3 at 13:23
add a comment |
$begingroup$
R, 67 65 bytes
-2 bytes thanks to Giuseppe
k=scan();o=1;i=10^(k:0);while(T<k)o=c(o,T<-T+i[i<=T&i+T<=k][1]);o
Pretty simple. It takes a set of powers of 10 beyond what would be needed in reverse order i
.
(I would prefer to use i=10^rev(0:log10(k))
instead of i=10^(k:0)
since the latter is computationally ineffecient, but golf is golf!).
Then in a while loop, applies the conditions to i
and takes the first (i.e. largest); updates n
, and appends to output
Try it online!
$endgroup$
1
$begingroup$
Save a byte usingT
instead ofn
; it should be 2 but I don't think thatTRUE
is acceptable output fork=1
, so we seto=+T
. Try it!
$endgroup$
– Giuseppe
Apr 3 at 13:15
1
$begingroup$
That is horrendous coding, I like it. incidently, I can seto=1
, and get that second byte.
$endgroup$
– Aaron Hayman
Apr 3 at 13:23
add a comment |
$begingroup$
R, 67 65 bytes
-2 bytes thanks to Giuseppe
k=scan();o=1;i=10^(k:0);while(T<k)o=c(o,T<-T+i[i<=T&i+T<=k][1]);o
Pretty simple. It takes a set of powers of 10 beyond what would be needed in reverse order i
.
(I would prefer to use i=10^rev(0:log10(k))
instead of i=10^(k:0)
since the latter is computationally ineffecient, but golf is golf!).
Then in a while loop, applies the conditions to i
and takes the first (i.e. largest); updates n
, and appends to output
Try it online!
$endgroup$
R, 67 65 bytes
-2 bytes thanks to Giuseppe
k=scan();o=1;i=10^(k:0);while(T<k)o=c(o,T<-T+i[i<=T&i+T<=k][1]);o
Pretty simple. It takes a set of powers of 10 beyond what would be needed in reverse order i
.
(I would prefer to use i=10^rev(0:log10(k))
instead of i=10^(k:0)
since the latter is computationally ineffecient, but golf is golf!).
Then in a while loop, applies the conditions to i
and takes the first (i.e. largest); updates n
, and appends to output
Try it online!
edited Apr 3 at 13:41
answered Apr 3 at 13:08
Aaron HaymanAaron Hayman
3516
3516
1
$begingroup$
Save a byte usingT
instead ofn
; it should be 2 but I don't think thatTRUE
is acceptable output fork=1
, so we seto=+T
. Try it!
$endgroup$
– Giuseppe
Apr 3 at 13:15
1
$begingroup$
That is horrendous coding, I like it. incidently, I can seto=1
, and get that second byte.
$endgroup$
– Aaron Hayman
Apr 3 at 13:23
add a comment |
1
$begingroup$
Save a byte usingT
instead ofn
; it should be 2 but I don't think thatTRUE
is acceptable output fork=1
, so we seto=+T
. Try it!
$endgroup$
– Giuseppe
Apr 3 at 13:15
1
$begingroup$
That is horrendous coding, I like it. incidently, I can seto=1
, and get that second byte.
$endgroup$
– Aaron Hayman
Apr 3 at 13:23
1
1
$begingroup$
Save a byte using
T
instead of n
; it should be 2 but I don't think that TRUE
is acceptable output for k=1
, so we set o=+T
. Try it!$endgroup$
– Giuseppe
Apr 3 at 13:15
$begingroup$
Save a byte using
T
instead of n
; it should be 2 but I don't think that TRUE
is acceptable output for k=1
, so we set o=+T
. Try it!$endgroup$
– Giuseppe
Apr 3 at 13:15
1
1
$begingroup$
That is horrendous coding, I like it. incidently, I can set
o=1
, and get that second byte.$endgroup$
– Aaron Hayman
Apr 3 at 13:23
$begingroup$
That is horrendous coding, I like it. incidently, I can set
o=1
, and get that second byte.$endgroup$
– Aaron Hayman
Apr 3 at 13:23
add a comment |
$begingroup$
Jelly, 12 bytes
1+«ạæḟ⁵«Ɗɗ¥Ƭ
Try it online!
$endgroup$
add a comment |
$begingroup$
Jelly, 12 bytes
1+«ạæḟ⁵«Ɗɗ¥Ƭ
Try it online!
$endgroup$
add a comment |
$begingroup$
Jelly, 12 bytes
1+«ạæḟ⁵«Ɗɗ¥Ƭ
Try it online!
$endgroup$
Jelly, 12 bytes
1+«ạæḟ⁵«Ɗɗ¥Ƭ
Try it online!
answered Apr 3 at 18:11
Erik the OutgolferErik the Outgolfer
33k429106
33k429106
add a comment |
add a comment |
$begingroup$
Pip, 27 bytes
Wa>Po+:y/t*Y1Ty>o|o+y>ay*:t
Try it online!
In pseudocode:
a = args[0]
o = 1
print o
while a > o {
y = 1
till y > o || o + y > a
y *= 10
o += y / 10
print o
}
I'm pretty pleased with the golfing tricks I was able to apply to shorten this algorithm. By initializing, updating, and printing stuff in the loop header, I was able to avoid needing curly braces for the loop body. There's probably a golfier algorithm, though.
$endgroup$
add a comment |
$begingroup$
Pip, 27 bytes
Wa>Po+:y/t*Y1Ty>o|o+y>ay*:t
Try it online!
In pseudocode:
a = args[0]
o = 1
print o
while a > o {
y = 1
till y > o || o + y > a
y *= 10
o += y / 10
print o
}
I'm pretty pleased with the golfing tricks I was able to apply to shorten this algorithm. By initializing, updating, and printing stuff in the loop header, I was able to avoid needing curly braces for the loop body. There's probably a golfier algorithm, though.
$endgroup$
add a comment |
$begingroup$
Pip, 27 bytes
Wa>Po+:y/t*Y1Ty>o|o+y>ay*:t
Try it online!
In pseudocode:
a = args[0]
o = 1
print o
while a > o {
y = 1
till y > o || o + y > a
y *= 10
o += y / 10
print o
}
I'm pretty pleased with the golfing tricks I was able to apply to shorten this algorithm. By initializing, updating, and printing stuff in the loop header, I was able to avoid needing curly braces for the loop body. There's probably a golfier algorithm, though.
$endgroup$
Pip, 27 bytes
Wa>Po+:y/t*Y1Ty>o|o+y>ay*:t
Try it online!
In pseudocode:
a = args[0]
o = 1
print o
while a > o {
y = 1
till y > o || o + y > a
y *= 10
o += y / 10
print o
}
I'm pretty pleased with the golfing tricks I was able to apply to shorten this algorithm. By initializing, updating, and printing stuff in the loop header, I was able to avoid needing curly braces for the loop body. There's probably a golfier algorithm, though.
answered Apr 5 at 6:47
DLoscDLosc
19.4k33990
19.4k33990
add a comment |
add a comment |
$begingroup$
Japt, 18 bytes
ÆT±ApTmTnU)sÊÉÃf§U
Try it
ÆT±ApTmTnU)sÊÉÃf§U :Implicit input of integer U
Æ :Map the range [0,U)
T± : Increment T (initially 0) by
A : 10
p : Raised to the power of
Tm : The minimum of T and
TnU : T subtracted from U
) : End minimum
s : Convert to string
Ê : Length
É : Subtract 1
à :End map
f :Filter
§U : Less than or equal to U
$endgroup$
add a comment |
$begingroup$
Japt, 18 bytes
ÆT±ApTmTnU)sÊÉÃf§U
Try it
ÆT±ApTmTnU)sÊÉÃf§U :Implicit input of integer U
Æ :Map the range [0,U)
T± : Increment T (initially 0) by
A : 10
p : Raised to the power of
Tm : The minimum of T and
TnU : T subtracted from U
) : End minimum
s : Convert to string
Ê : Length
É : Subtract 1
à :End map
f :Filter
§U : Less than or equal to U
$endgroup$
add a comment |
$begingroup$
Japt, 18 bytes
ÆT±ApTmTnU)sÊÉÃf§U
Try it
ÆT±ApTmTnU)sÊÉÃf§U :Implicit input of integer U
Æ :Map the range [0,U)
T± : Increment T (initially 0) by
A : 10
p : Raised to the power of
Tm : The minimum of T and
TnU : T subtracted from U
) : End minimum
s : Convert to string
Ê : Length
É : Subtract 1
à :End map
f :Filter
§U : Less than or equal to U
$endgroup$
Japt, 18 bytes
ÆT±ApTmTnU)sÊÉÃf§U
Try it
ÆT±ApTmTnU)sÊÉÃf§U :Implicit input of integer U
Æ :Map the range [0,U)
T± : Increment T (initially 0) by
A : 10
p : Raised to the power of
Tm : The minimum of T and
TnU : T subtracted from U
) : End minimum
s : Convert to string
Ê : Length
É : Subtract 1
à :End map
f :Filter
§U : Less than or equal to U
answered Apr 3 at 13:32
ShaggyShaggy
18.9k21768
18.9k21768
add a comment |
add a comment |
$begingroup$
C# (Visual C# Interactive Compiler), 123 122 bytes
m=>{var a=new{1}.ToList();int s;for(;(s=a.Last())<m;)a.Add(s+(int)Math.Pow(10,(int)Math.Log(s<m-s?s:m-s,10)));return a;}
Try it online!
$endgroup$
add a comment |
$begingroup$
C# (Visual C# Interactive Compiler), 123 122 bytes
m=>{var a=new{1}.ToList();int s;for(;(s=a.Last())<m;)a.Add(s+(int)Math.Pow(10,(int)Math.Log(s<m-s?s:m-s,10)));return a;}
Try it online!
$endgroup$
add a comment |
$begingroup$
C# (Visual C# Interactive Compiler), 123 122 bytes
m=>{var a=new{1}.ToList();int s;for(;(s=a.Last())<m;)a.Add(s+(int)Math.Pow(10,(int)Math.Log(s<m-s?s:m-s,10)));return a;}
Try it online!
$endgroup$
C# (Visual C# Interactive Compiler), 123 122 bytes
m=>{var a=new{1}.ToList();int s;for(;(s=a.Last())<m;)a.Add(s+(int)Math.Pow(10,(int)Math.Log(s<m-s?s:m-s,10)));return a;}
Try it online!
edited Apr 3 at 16:56
answered Apr 3 at 16:50
Expired DataExpired Data
57314
57314
add a comment |
add a comment |
$begingroup$
Prolog (SWI), 142 bytes
L-D-M:-append(L,[D],M).
N-L-C-X-R-I:-I=1,C is X*10,N-L-C-C-R-1;D is C+X,(D<N,L-D-M,N-M-D-X-R-I;D>N,N-L-C-(X/10)-R-0;L-D-R).
N-R:-N--0-1-R-1.
Try it online!
Explanation coming tomorrow or something
$endgroup$
add a comment |
$begingroup$
Prolog (SWI), 142 bytes
L-D-M:-append(L,[D],M).
N-L-C-X-R-I:-I=1,C is X*10,N-L-C-C-R-1;D is C+X,(D<N,L-D-M,N-M-D-X-R-I;D>N,N-L-C-(X/10)-R-0;L-D-R).
N-R:-N--0-1-R-1.
Try it online!
Explanation coming tomorrow or something
$endgroup$
add a comment |
$begingroup$
Prolog (SWI), 142 bytes
L-D-M:-append(L,[D],M).
N-L-C-X-R-I:-I=1,C is X*10,N-L-C-C-R-1;D is C+X,(D<N,L-D-M,N-M-D-X-R-I;D>N,N-L-C-(X/10)-R-0;L-D-R).
N-R:-N--0-1-R-1.
Try it online!
Explanation coming tomorrow or something
$endgroup$
Prolog (SWI), 142 bytes
L-D-M:-append(L,[D],M).
N-L-C-X-R-I:-I=1,C is X*10,N-L-C-C-R-1;D is C+X,(D<N,L-D-M,N-M-D-X-R-I;D>N,N-L-C-(X/10)-R-0;L-D-R).
N-R:-N--0-1-R-1.
Try it online!
Explanation coming tomorrow or something
answered Apr 4 at 13:52
ASCII-onlyASCII-only
4,4701338
4,4701338
add a comment |
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).
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%2f182569%2fexpand-and-contract%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
2
$begingroup$
May we print the numbers instead of returning a list?
$endgroup$
– Adám
Apr 3 at 8:01
$begingroup$
@Adám Yes, you may.
$endgroup$
– Esolanging Fruit
Apr 3 at 16:32