Expand and ContractTips for golfing in HaskellTips for golfing in <all languages>Expand tabs (implement expand(1))Decimal concatenation of squaresExpand the numberEvaluate a Dice 10,000 rollExpand ExponentiationExpand that Australian stateExpand a numberExpand Sine and CosineExpand some numberCompound interest with additions
Convert two switches to a dual stack, and add outlet - possible here?
Accidentally leaked the solution to an assignment, what to do now? (I'm the prof)
When a company launches a new product do they "come out" with a new product or do they "come up" with a new product?
Arrow those variables!
A newer friend of my brother's gave him a load of baseball cards that are supposedly extremely valuable. Is this a scam?
Are astronomers waiting to see something in an image from a gravitational lens that they've already seen in an adjacent image?
Client team has low performances and low technical skills: we always fix their work and now they stop collaborate with us. How to solve?
Do I have a twin with permutated remainders?
Could an aircraft fly or hover using only jets of compressed air?
Does detail obscure or enhance action?
How does quantile regression compare to logistic regression with the variable split at the quantile?
Horror movie about a virus at the prom; beginning and end are stylized as a cartoon
How can I prevent hyper evolved versions of regular creatures from wiping out their cousins?
Codimension of non-flat locus
Why doesn't Newton's third law mean a person bounces back to where they started when they hit the ground?
How to move a thin line with the black arrow in Illustrator?
Today is the Center
Approximately how much travel time was saved by the opening of the Suez Canal in 1869?
Alternative to sending password over mail?
What does "Puller Prush Person" mean?
Do other languages have an "irreversible aspect"?
What is the word for reserving something for yourself before others do?
How old can references or sources in a thesis be?
Can a monk's single staff be considered dual wielded, as per the Dual Wielder feat?
Expand and Contract
Tips for golfing in HaskellTips for golfing in <all languages>Expand tabs (implement expand(1))Decimal concatenation of squaresExpand the numberEvaluate a Dice 10,000 rollExpand ExponentiationExpand that Australian stateExpand a numberExpand Sine and CosineExpand some numberCompound interest with additions
$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
2 days ago
$begingroup$
@Adám Yes, you may.
$endgroup$
– Esolanging Fruit
2 days ago
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 2 days ago
Esolanging FruitEsolanging Fruit
8,73932776
8,73932776
2
$begingroup$
May we print the numbers instead of returning a list?
$endgroup$
– Adám
2 days ago
$begingroup$
@Adám Yes, you may.
$endgroup$
– Esolanging Fruit
2 days ago
add a comment |
2
$begingroup$
May we print the numbers instead of returning a list?
$endgroup$
– Adám
2 days ago
$begingroup$
@Adám Yes, you may.
$endgroup$
– Esolanging Fruit
2 days ago
2
2
$begingroup$
May we print the numbers instead of returning a list?
$endgroup$
– Adám
2 days ago
$begingroup$
May we print the numbers instead of returning a list?
$endgroup$
– Adám
2 days ago
$begingroup$
@Adám Yes, you may.
$endgroup$
– Esolanging Fruit
2 days ago
$begingroup$
@Adám Yes, you may.
$endgroup$
– Esolanging Fruit
2 days ago
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
2 days ago
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
2 days ago
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
2 days ago
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
yesterday
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
yesterday
|
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=colorred10colorgreen00$) but does not change the number of captured trailing zeros for values such as $n=colorred1023colorgreen00$ (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
yesterday
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
->k1,$_+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
2 days ago
1
$begingroup$
That is horrendous coding, I like it. incidently, I can seto=1
, and get that second byte.
$endgroup$
– Aaron Hayman
2 days ago
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
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
2 days ago
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
2 days ago
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
2 days ago
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
yesterday
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
yesterday
|
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
2 days ago
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
2 days ago
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
2 days ago
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
yesterday
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
yesterday
|
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 yesterday
New contributor
answered 2 days ago
Paul MutserPaul Mutser
712
712
New contributor
New contributor
4
$begingroup$
Welcome to PPCG! Nice first answer.
$endgroup$
– Arnauld
2 days ago
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
2 days ago
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
2 days ago
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
yesterday
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
yesterday
|
show 4 more comments
4
$begingroup$
Welcome to PPCG! Nice first answer.
$endgroup$
– Arnauld
2 days ago
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
2 days ago
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
2 days ago
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
yesterday
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
yesterday
4
4
$begingroup$
Welcome to PPCG! Nice first answer.
$endgroup$
– Arnauld
2 days ago
$begingroup$
Welcome to PPCG! Nice first answer.
$endgroup$
– Arnauld
2 days ago
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
2 days ago
$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
2 days ago
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
2 days ago
$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
2 days ago
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
yesterday
$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
yesterday
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
yesterday
$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
yesterday
|
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=colorred10colorgreen00$) but does not change the number of captured trailing zeros for values such as $n=colorred1023colorgreen00$ (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
yesterday
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=colorred10colorgreen00$) but does not change the number of captured trailing zeros for values such as $n=colorred1023colorgreen00$ (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
yesterday
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=colorred10colorgreen00$) but does not change the number of captured trailing zeros for values such as $n=colorred1023colorgreen00$ (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=colorred10colorgreen00$) but does not change the number of captured trailing zeros for values such as $n=colorred1023colorgreen00$ (because of the extra non-zero middle digits, '10'
is actually not matched at all in such cases).
edited 2 days ago
answered 2 days ago
ArnauldArnauld
80.4k797333
80.4k797333
$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
yesterday
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
yesterday
$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
yesterday
$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
yesterday
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 2 days ago
answered 2 days ago
Chas BrownChas Brown
5,1291523
5,1291523
add a comment |
add a comment |
$begingroup$
Perl 6, 48 41 bytes
->k1,$_+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
->k1,$_+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
->k1,$_+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
->k1,$_+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 2 days ago
answered 2 days ago
Jo KingJo King
26.4k364130
26.4k364130
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 2 days ago
AdámAdám
28.9k276207
28.9k276207
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 2 days ago
answered 2 days ago
Kevin CruijssenKevin Cruijssen
42.3k570217
42.3k570217
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 2 days ago
Nick KennedyNick Kennedy
1,31649
1,31649
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 2 days ago
J42161217J42161217
13.8k21253
13.8k21253
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 2 days ago
NeilNeil
82.5k745179
82.5k745179
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
2 days ago
1
$begingroup$
That is horrendous coding, I like it. incidently, I can seto=1
, and get that second byte.
$endgroup$
– Aaron Hayman
2 days ago
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
2 days ago
1
$begingroup$
That is horrendous coding, I like it. incidently, I can seto=1
, and get that second byte.
$endgroup$
– Aaron Hayman
2 days ago
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 2 days ago
answered 2 days ago
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
2 days ago
1
$begingroup$
That is horrendous coding, I like it. incidently, I can seto=1
, and get that second byte.
$endgroup$
– Aaron Hayman
2 days ago
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
2 days ago
1
$begingroup$
That is horrendous coding, I like it. incidently, I can seto=1
, and get that second byte.
$endgroup$
– Aaron Hayman
2 days ago
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
2 days ago
$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
2 days ago
1
1
$begingroup$
That is horrendous coding, I like it. incidently, I can set
o=1
, and get that second byte.$endgroup$
– Aaron Hayman
2 days ago
$begingroup$
That is horrendous coding, I like it. incidently, I can set
o=1
, and get that second byte.$endgroup$
– Aaron Hayman
2 days ago
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 2 days ago
Erik the OutgolferErik the Outgolfer
32.9k429106
32.9k429106
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
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
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
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
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 18 hours ago
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 2 days ago
ShaggyShaggy
18.8k21768
18.8k21768
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 2 days ago
answered 2 days ago
Expired DataExpired Data
52313
52313
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 yesterday
ASCII-onlyASCII-only
4,4601338
4,4601338
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
2 days ago
$begingroup$
@Adám Yes, you may.
$endgroup$
– Esolanging Fruit
2 days ago