38
\$\begingroup\$

A lexicographically increasing number is an integer whose digits are in strictly increasing order. Print all lexicographically increasing numbers under 10000.

Here are lines of the expected output:

0 1 2 3 4 5 6 7 8 9 12 13 14 15 16 17 18 19 23 24 25 26 27 28 29 34 35 36 37 38 39 45 46 47 48 49 56 57 58 59 67 68 69 78 79 89 123 124 125 126 127 128 129 134 135 136 137 138 139 145 146 147 148 149 156 157 158 159 167 168 169 178 179 189 234 235 236 237 238 239 245 246 247 248 249 256 257 258 259 267 268 269 278 279 289 345 346 347 348 349 356 357 358 359 367 368 369 378 379 389 456 457 458 459 467 468 469 478 479 489 567 568 569 578 579 589 678 679 689 789 1234 1235 1236 1237 1238 1239 1245 1246 1247 1248 1249 1256 1257 1258 1259 1267 1268 1269 1278 1279 1289 1345 1346 1347 1348 1349 1356 1357 1358 1359 1367 1368 1369 1378 1379 1389 1456 1457 1458 1459 1467 1468 1469 1478 1479 1489 1567 1568 1569 1578 1579 1589 1678 1679 1689 1789 2345 2346 2347 2348 2349 2356 2357 2358 2359 2367 2368 2369 2378 2379 2389 2456 2457 2458 2459 2467 2468 2469 2478 2479 2489 2567 2568 2569 2578 2579 2589 2678 2679 2689 2789 3456 3457 3458 3459 3467 3468 3469 3478 3479 3489 3567 3568 3569 3578 3579 3589 3678 3679 3689 3789 4567 4568 4569 4578 4579 4589 4678 4679 4689 4789 5678 5679 5689 5789 6789 

This is a code golf challenge! Shortest answer wins!

(P.S. looking for a python solution)

\$\endgroup\$
9
  • 3
    \$\begingroup\$ do we need to print them on separate lines or is space-separated OK? \$\endgroup\$ Commented Nov 16, 2018 at 19:29
  • 3
    \$\begingroup\$ Welcome to PPCG! Nice first challenge. For future challenges, I can recommend using the Sandbox to refine a challenge and get meaningful feedback before posting it to main. \$\endgroup\$ Commented Nov 16, 2018 at 19:38
  • 4
    \$\begingroup\$ To expand on @Giuseppe's question, can we output separated by commas, spaces, in array format [0,1,...], etc. or must we output each number on a separate line? \$\endgroup\$ Commented Nov 16, 2018 at 19:42
  • 10
    \$\begingroup\$ Do the numbers need to be in a specific order, or do they just need to all exist? \$\endgroup\$ Commented Nov 16, 2018 at 19:56
  • 15
    \$\begingroup\$ @VarunPatro, please update the challenge to explicitly state that each number by on a separate line (although I'd recommend against that requirement) and make sure to inform any existing solutions that don't do so. \$\endgroup\$ Commented Nov 16, 2018 at 20:32

53 Answers 53

32
\$\begingroup\$

Python 2, 56 bytes

for n in range(9999): if eval('<'.join(`n`))**n:print n 

Try it online!

Converts each number like 124 to an expression 1<2<4 and evaluates it to check if the digits are sorted,

A hiccup happens for one-digit numbers giving an expression that just is the number itself. This causes 0 to evaluate to a Falsey value even though it should be printed. This is fixed by a trick suggested by Erik the Outgolfer of doing **n, which gives truthy value 0**0 for n=0 and doesn't affect the truth value otherwise.

\$\endgroup\$
7
  • \$\begingroup\$ What does the ` do in `n`? \$\endgroup\$ Commented Nov 16, 2018 at 21:58
  • 1
    \$\begingroup\$ @BruceWayne It takes the string representation. This was removed in Python 3. \$\endgroup\$ Commented Nov 16, 2018 at 22:00
  • 5
    \$\begingroup\$ @BruceWayne Note that it's the same as the repr() function, not the str() function. They aren't always the same. Here's an example. \$\endgroup\$ Commented Nov 16, 2018 at 22:39
  • 1
    \$\begingroup\$ @mbomb007 thanks for that comment! I would have thought it was str() equivalent. \$\endgroup\$ Commented Nov 16, 2018 at 22:48
  • 2
    \$\begingroup\$ We can handle the 0 case with a bit of trickery. \$\endgroup\$ Commented Nov 17, 2018 at 16:04
14
\$\begingroup\$

Python 2, 55 bytes

i=0 exec"print i\ni+=1\nif eval('<'.join(`i`)):1;"*7000 

Try it online!

\$\endgroup\$
11
\$\begingroup\$

Haskell, 50 bytes

unlines[s|s<-show<$>[0..6^5],s==scanl1(max.succ)s] 

Try it online!

Outputs a multiline string. We check that the number s increasing using s==scanl1(max.succ)s, a variant of the usual sortedness check s==scanl1 max s that ensures strict sortedness by incrementing each digit character before taking the maximum of it and the next digit.

Ourous saved a byte by using 6^5 as the upper bound in place of a 4-digit number.

\$\endgroup\$
0
9
\$\begingroup\$

Jelly, 7 bytes

9ŒPḌḣ⁹Y 

Try it online!

How it works

9ŒPḌḣ⁹Y Main link. No arguments. 9 Set the return value to 9. ŒP Powerset; promote 9 to [1, ..., 9] and generate all subsets. Ḍ Undecimal; map the subsets of digits to the integers they represent. ⁹ Yield 256. ḣ Dyadic head; take the first 256 elements of the integer list. Y Separate the result by linefeeds. 
\$\endgroup\$
2
  • 2
    \$\begingroup\$ I'm trying to figure out how 0 gets included here but I don't know Jelly. Am I correct that Jelly's powerset includes the empty array which then gets converted to 0 when "undecimaled"? \$\endgroup\$ Commented Nov 17, 2018 at 0:21
  • 1
    \$\begingroup\$ Yes, that's exactly what happens. \$\endgroup\$ Commented Nov 17, 2018 at 0:37
8
\$\begingroup\$

Japt -R, 12 11 8 bytes

L²Ç¶ìüÃð 

Test it

L :100 ² :Squared Ç :Map the range [0,L²) ì : Split to a digit array ü : For the sake of simplicity*, let's say: Sort & deduplicate : Implicitly rejoin to an integer ¶ : Test for equality with original number à :End map ð :Get 0-based indices of truthy elements :Implicitly join with newlines and output 

*Or, to offer a better explanation: the ü method sorts an array and splits it into equal elements (e.g., [8,4,8,4].ü() -> [[4,4],[8,8]]) and then, in what seems to be a strange quirk and hopefully not a bug, the ì method, when converting the array back to a number, takes the first element of each nested array, rather than first flattening the array, which is what I expected when I tried this trick (e.g., [[4,4],[8,8]].ì() -> 48).

\$\endgroup\$
4
  • 1
    \$\begingroup\$ Nice. Similar to what I had: L²Ç¥ì ü ¬Ãð \$\endgroup\$ Commented Nov 16, 2018 at 19:39
  • 2
    \$\begingroup\$ I have to say, that ü trick you guys used is genius :-) @Oliver \$\endgroup\$ Commented Nov 16, 2018 at 19:45
  • 1
    \$\begingroup\$ @Oliver, you must have posted that as I was updating; great minds ... :) \$\endgroup\$ Commented Nov 16, 2018 at 19:48
  • \$\begingroup\$ @ETHproductions, like most things, I tried it on a whim - amazed it works. \$\endgroup\$ Commented Nov 16, 2018 at 19:48
6
\$\begingroup\$

R, 62 49 bytes

`[`=write;0[1];for(i in 1:4)combn(1:9,i)[1,i,,""] 

Try it online!

Because combn iterates through its input in the order given, it's easy to create all the lexicographically increasing integers, printing them out in order. write prints them each i-digit number in lines of width i, neatly fulfilling the newline requirement as well.

\$\endgroup\$
2
  • \$\begingroup\$ great idea exploiting combn ! \$\endgroup\$ Commented Nov 17, 2018 at 14:36
  • \$\begingroup\$ Extremely clever aliasing! \$\endgroup\$ Commented Nov 18, 2018 at 12:15
6
\$\begingroup\$

PowerShell, 42 40 bytes

0..1e4|?{-join("$_"|% t*y|sort -u)-eq$_} 

Try it online!

Loop from 0 to 1e4 (i.e., 10000). Pull out those objects where |?{...} the number as a string $_ is -equal to the number cast toCharArray and then sorted with the -unique flag. In other words, only numbers that are the same as their sorted and deduplicated strings. Each of those are left on the pipeline and output is implicit.

\$\endgroup\$
6
\$\begingroup\$

Perl 6, 25 bytes

[<](.comb)&&.say for ^1e4 

-1 byte thanks to nwellnhof

Try it online!

.comb produces a list of the digits of each number, and [<] does a less-than reduction on that list, equivalent to: digit1 < digit2 < ... < digitN.

\$\endgroup\$
2
  • 2
    \$\begingroup\$ [<](.comb)&&.say saves a byte. \$\endgroup\$ Commented Nov 17, 2018 at 9:56
  • \$\begingroup\$ This is surprisingly readable. (I already know a little Perl 6, but still...) \$\endgroup\$ Commented Nov 19, 2018 at 20:38
5
\$\begingroup\$

Haskell, 56 55 bytes

Edit: -1 byte thanks to @Ourous

mapM print$filter(and.(zipWith(<)<*>tail).show)[0..6^5] 

Try it online!

\$\endgroup\$
0
4
\$\begingroup\$

Pyth, 10 bytes

jiRThc2yS9 

Try it online!

How it works

jiRThc2yS9 S9 Yield [1, 2, 3, 4, 5, 6, 7, 8, 9]. y Take all 512 subsets. c2 Split the array of subsets into 2 pieces (256 subsets each). h Head; take the first piece. iRT Convert each subset from base 10 to integer. j Separate by newlines. 
\$\endgroup\$
4
\$\begingroup\$

Regenerate -a, 72 bytes

0|([1-9])(([2-9])(){$3-$1-1}(([3-9])(){$6-$3-1}(([4-9])(){$9-$6-1})?)?)? 

Appropriately, outputs the numbers in lexicographic order. Attempt This Online!

Explanation

0| 

Match 0, or:

([1-9]) 

Match a digit 1 through 9 (capture group 1).

(...)? 

Either stop there, or continue:

([2-9]) 

Match a digit 2 through 9 (capture group 3), and:

(){$3-$1-1} 

Match an empty group X times, where X equals the second digit minus the first digit minus 1. If the second digit is not larger than the first digit, this quantity is negative, and using a negative number as a repetition count causes the match to fail. Thus, only matches where the second digit is larger than the first digit are included.

(...)? 

Either stop there, or continue:

([3-9]) 

Match a digit 3 through 9 (capture group 6), and:

(){$6-$3-1} 

Match an empty group Y times, where Y equals the third digit minus the second digit minus 1 (ensuring that the third digit is larger than the second digit).

(...)? 

Either stop there, or continue:

([4-9]) 

Match a digit 4 through 9 (capture group 9), and:

(){$9-$6-1} 

Match an empty group Z times, where Z equals the fourth digit minus the third digit minus 1 (ensuring that the fourth digit is larger than the third digit).

\$\endgroup\$
1
  • \$\begingroup\$ Very clever. But -36 bytes! \$\endgroup\$ Commented Jul 2, 2022 at 23:10
4
+100
\$\begingroup\$

Regenerate -a, 36 34 bytes

0|(([2-9])$4{$1/$2}|$3![1-9]()){4} 

Attempt This Online!

This was directly inspired by the language's creator's answer, but I figured this big optimization building on that idea was worth its own post.

 0 # Zero must be matched as a special case, because no other # numbers have a leading '0' digit. | ( ([2-9]) # \2 = a digit intended to be greater than the previous # one ($1), but until being validated below, it can # be any digit in [2-9]. # We could actually do ([0-9]) here and it'd generate the # same output, but would run slightly less efficiently. $4{$1/$2} # Repeat a nonexistent group $1/$2 number of times. $1 and $2 # are the literal contents of those captures interpreted as # numeric values upon which arithmetic can be done in a # quantifier, which we do here. $1/$2 will evaluate to # zero iff $2 is greater than $1, which is the only thing # that will allow it to match, because if it repeats more # than zero times, it tries to match the nonexistent group # $4 which can't match. | $3 # If the above fails to match, due to $1 containing the # digit '9', the regex engine will try other matches, even # if they use short-circuiting alternation. So we put a # dummy match here, which can only match on iterations # other than the first one. Once this matches, it will be # the only thing that can match in all subsequent # iterations, because the attempted math "$2-$1-1" will # fail still - now due to $1 no longer being a number (it # will be blank). # Short-circuiting alternation - never try the following unless the all of # the above failed to match. ! [1-9] # Match the first digit. This can only happen on the first # iteration, thanks to the short-circuiting alternation. () # $3 = empty capture - lets subsequent iterations know that # they are no longer the first iteration ) # $1 = whatever digit was matched above, for use by the next # iteration {4} # Repeat the above loop for exactly 4 iterations. This # allows a variable number of digits, due to the "$3" dummy # alternative. 

Alternative 34 bytes:

0|(([2-9])$3{$1/$2}|{#1}![1-9]){4} 

Attempt This Online!

It might not be intended that this is possible, but Regenerate allows a quantifier to be preceded by nothing. This is what's happening with {#1} - it's impossible for it to match on the first iteration because $1 hasn't been captured yet and doesn't have a length. On subsequent iterations, a match of nothing gets repeated one time (the length of $1).

\$\endgroup\$
1
  • 3
    \$\begingroup\$ Oh wow, nice work. The "repeat nothing" idiom was originally unintentional, I think, but once I discovered it was useful, I decided it was a feature rather than a bug. :) \$\endgroup\$ Commented Jul 5, 2022 at 18:14
3
\$\begingroup\$

V, 41 bytes

7000ïÎaÛ Îy$úúP Ç^¨ä*©±$/d ÎãlD 爱/d HO0 

Try it online!

Hexdump:

00000000: 3730 3030 efce 61db 0ace 7924 fafa 500a 7000..a...y$..P. 00000010: c75e a8e4 2aa9 b124 2f64 0ace e36c 440a .^..*..$/d...lD. 00000020: e788 b12f 640a 484f 30 .../d.HO0 
\$\endgroup\$
3
\$\begingroup\$

Charcoal, 19 bytes

ΦEXχ⁴Iι¬Φι∧쬋§ι⊖μλ 

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

 χ Predefined variable 10 X To the power ⁴ Literal 4 E Map over implicit range ι Current value I Cast to string Φ Filter over strings where ι Current string Φ Filtered over characters μ Character index (is nonzero) ∧ And μ Character index ⊖ Decremented § Indexed into ι Current string ¬ Is not ‹ Less than λ Current character ¬ Results in an empty string Implicitly print matches on separate lines 
\$\endgroup\$
3
\$\begingroup\$

J, 26 bytes

,.(#~(-:/:~@~.)@":"0)i.1e4 

Try it online!

explanation

,. (#~ (-: /:~@~.)@":"0) i.1e4 i.1e4 NB. list 0 to 9999 "0 NB. for each number in the input list @":"0 NB. convert it to a string and (#~ ( ) NB. remove any not passing this test: -: NB. the string of digits matches @~. NB. the nub of the digits (dups removed) /:~ NB. sorted ,. NB. ravel items: take the result of all that NB. and turn it into a big column 
\$\endgroup\$
3
\$\begingroup\$

Common Lisp, 74 72 bytes

(dotimes(i 7e3)(format(apply'char<(coerce(format()"~d"i)'list))"~d~%"i)) 

Try it online!

-2 bytes thank to @Shaggy!

\$\endgroup\$
0
3
\$\begingroup\$

05AB1E (legacy), 8 bytes

4°ÝD€êû 

Try it online!

Works in the new version of 05AB1E as well but is painfully slow for some reason.

How?

 4°ÝD€êû – Full program. 4°Ý – Push [0 ... 10000]. D€ê – Push each integer in [0 ... 10000] sorted and deduplicated at the same time. û – And join the interection of the two lists by newlines. 
\$\endgroup\$
1
  • \$\begingroup\$ Nice answer. Better than the 9 byter I had (which only works in the legacy). \$\endgroup\$ Commented Nov 19, 2018 at 13:54
3
\$\begingroup\$

Perl 5, 47 bytes

map{$_&&s/.(?=(.))/$1-$&/gre=~/0|-/||say}0..1E4 

Try it online!

Older:

52 bytes

\$\endgroup\$
2
\$\begingroup\$

Python 2, 61 bytes

for i in range(9999): if list(`i`)==sorted(set(`i`)):print i 

Try it online!

\$\endgroup\$
2
\$\begingroup\$

Python 2, 64 61 bytes

lambda:[x for x in range(9999)if sorted(set(`x`))==list(`x`)] 

Try it online!

Gets the unique characters of the integer's string representation, sorts them, and compares the result to the original number.

\$\endgroup\$
2
  • \$\begingroup\$ You can save a byte by using range(9999) or any other number between 6790 and 9999. Our solutions are almost identical BTW :) \$\endgroup\$ Commented Nov 16, 2018 at 19:47
  • \$\begingroup\$ @DJMcMayhem But then it wouldn't check ALL numbers under 10,000....:P Thanks! Sometimes I get too literal with these challenges. \$\endgroup\$ Commented Nov 16, 2018 at 19:50
2
\$\begingroup\$

Jelly, 13 9 8 bytes

Saved 5 bytes thanks to @Dennis

9œcⱮ4ẎŻY 

Try it online!

Explanation

Generates all lexicographically increasing numbers below 10000 by taking the digits [1...9] and finding all combinations of length ≤ 4.

9œcⱮ4ẎŻY Main link. Arguments: none 9 Yield 9. Ɱ4 For each n in [1...4]: œc Yield the combinations of the range [1...9] of length n. Ẏ Tighten; dump each of the 4 lists generated into the main list. Ż Prepend a 0 to the list. Y Join on newlines. 

Jelly, 11 10 9 bytes

Saved a byte thanks to @EriktheOutgolfer

ȷ4Ḷ<ƝẠ$ƇY 

Try it online!

Explanation

Filters through the range, keeping the numbers that are lexicographically increasing.

ȷ4Ḷ<ƝẠ$ƇY Main link. Arguments: none ȷ4 Yield 10^4 (10000). Ḷ Generate the range [0...10000). Ƈ Filter; yield only the numbers where this link return a truthy value. $ Run these two links and yield the result. Ɲ For each pair of items (digits) in the number: < Check whether the left digit is less than the right digit. Ạ All; check that every comparison yielded true. This yields whether the digits are strictly increasing. Y Join the filtered list on newlines. 
\$\endgroup\$
0
2
\$\begingroup\$

Wolfram Language (Mathematica), 36 bytes

After I wrote this, it was clarified that each number must be on a new line, so +7 bytes for the Print/@.

This method takes advantage of the fact that the Subsets function 1) doesn't replicate any digits and 2) sorts the output by set size and set contents. FromDigits assembles each list of digits.

-1 byte thanks to @Mr.Xcoder

Print/@FromDigits/@Range@9~Subsets~4 

Try it online!

\$\endgroup\$
2
  • 1
    \$\begingroup\$ Print/@FromDigits/@Range@9~Subsets~4 for 36 bytes. \$\endgroup\$ Commented Nov 17, 2018 at 14:32
  • \$\begingroup\$ Funny, I thought of that and just didn't do it because I thought ~ had higher precedence than @ \$\endgroup\$ Commented Nov 19, 2018 at 2:55
2
\$\begingroup\$

K (ngn/k) / K (oK), 32 30 26 bytes

Solution:

`0:$&&/'1_'>':'" ",'$!9999 

Try it online!

Explanation:

`0:$&&/'1_'>':'" ",'$!9999 / the solution !9999 / range 0..9998 (could use !6890) $ / string " ",' / prepend " " to each (lower than "0" in ascii) >:' / greater-than each-previous? 1_' / drop first result from each &/' / max (&) over (/) & / indices where true $ / convert to string `0: / print to stdout 
\$\endgroup\$
2
\$\begingroup\$

JavaScript REPL, 64 bytes

A bit of pub golf so probably far from optimal.

(f=n=>n&&f(n-1)+([...n+``].every(x=>y<(y=x),y=0)?` `+n:``))(7e3) 

Try it online

Yes, doing it without an IIFE would be a few bytes shorter but that throws an overflow error when called, which would normally be fine as we can assume infinite memory for the purposes of code golf but, to me, doesn't seem to be in the spirit of KC challenges.

\$\endgroup\$
2
  • \$\begingroup\$ I don't get an overflow error without an IIFE. \$\endgroup\$ Commented Nov 17, 2018 at 4:32
  • \$\begingroup\$ Is this a function submission or a full program? If not, you should either count the console.log or relabel your submission as JavaScript REPL. \$\endgroup\$ Commented Nov 21, 2018 at 2:58
2
\$\begingroup\$

C (gcc), 97 89 81 bytes

Thanks to ceilingcat for -8 bytes.

Another -8 thanks to Dennis

g(n){n=!n||n/10%10<n%10&&g(n/10);}f(i){for(i=-1;++i<7e3;g(i)&&printf("%u\n",i));} 

Try it online!

\$\endgroup\$
4
  • \$\begingroup\$ 81 bytes \$\endgroup\$ Commented Nov 27, 2018 at 13:22
  • \$\begingroup\$ not gonna update this? \$\endgroup\$ Commented Mar 11, 2019 at 1:53
  • \$\begingroup\$ @ASCII-only Done. Sorry if this oversight upset you. \$\endgroup\$ Commented Mar 11, 2019 at 2:51
  • \$\begingroup\$ 80 bytes \$\endgroup\$ Commented Jul 3, 2022 at 2:24
2
\$\begingroup\$

Brachylog, 12 bytes

7jj⟦{ẹ<₁cẉ}ˢ 

Try it online!

 ẉ Write on its own line { }ˢ every c concatenated <₁ strictly increasing ẹ list of digits of ⟦ numbers from the range from 0 to 7jj 7777. 

7jj⟦{ṫ⊆Ị&ẉ}ˢ also works.

\$\endgroup\$
2
\$\begingroup\$

C# (Visual C# Interactive Compiler), 102 101 73 ... 72 bytes

-12 and -4 thanks @Dennis!

for(var i=0;i<7e3;i++)if((i+"").Aggregate((a,b)=>a<b?b:':')<58)Print(i); 

Try it online!

Each integer from 0 to 7k tested by first converting it into a string. Leveraging the fact that C# treats strings as character enumerables and LINQ, an aggregate is calculated for each character enumerable as follows:

  • compare the accumulated value with the current character
  • if the current character is greater than the accumulation, return the current character
  • otherwise return : which is greater than 9

If the result of this is less than : (ASCII 58), then the number has lexicographically increasing digits.

\$\endgroup\$
4
  • \$\begingroup\$ Doesn't the challenge state that all numbers from 0-10000 must be printed? I'm pretty sure this prints numbers 0-7000 \$\endgroup\$ Commented Feb 4, 2019 at 4:34
  • \$\begingroup\$ I believe the largest valid number is 6789? This is less than 7000, so you don't have to go any higher. \$\endgroup\$ Commented Feb 4, 2019 at 4:47
  • \$\begingroup\$ Oh, I see. Foolish me \$\endgroup\$ Commented Feb 4, 2019 at 4:51
  • \$\begingroup\$ Not foolish at all :) I'm pretty sure I borrowed it from someone else's answer and I was scratching my head as to why they did it. \$\endgroup\$ Commented Feb 4, 2019 at 5:02
2
\$\begingroup\$

Julia, 44 bytes

0:6^5 .|>x->issorted("$x",lt=<=)&&println(x)

\$(6^5 = 7776)\$

Attempt This Online!

\$\endgroup\$
2
\$\begingroup\$

Vyxal jM, 5 bytes

k2'Þ⇧ 

Try it Online!

Flagless:

Vyxal, 7 bytes

k2ʀ~Þ⇧⁋ 

Try it Online!

\$\endgroup\$
2
\$\begingroup\$

Husk, 10 bytes

¶mdΣMṖŀ5ḣ9 

Try it online!

Also: 10 bytes ¶mdṁ`Ṗḣ9ŀ5 and 11 bytes ¶fo<5LmdṖḣ9

 MṖ -- make all subsequences, ŀ5 -- having 0 to 4 elements ḣ9 -- of all digits 1 to 9 -- (the result is grouped into sublists) Σ -- unlist md -- join digits together ¶ -- join by newlines 
\$\endgroup\$

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.