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

1
2
1
\$\begingroup\$

Python 2, 63 bytes

for i in range(6790): if`i`=="".join(sorted(set(`i`))):print i 

Try it online!

\$\endgroup\$
1
\$\begingroup\$

Stax, 8 bytes

¬ ▬A♥¶N∙ 

Run and debug it

\$\endgroup\$
1
\$\begingroup\$

Clean, 90 bytes

import StdEnv Start=(0,[(' ',n)\\n<-[1..6^5]|(\l=removeDup l==sort l)[c\\c<-:toString n]]) 

Try it online!

\$\endgroup\$
1
\$\begingroup\$

Red, 59 bytes

repeat n 9999[if(d: n - 1)= do sort unique form d[print d]] 

Try it online!

\$\endgroup\$
1
\$\begingroup\$

Jelly, 7 bytes

<ƝẠ$⁹#Y 

Try it online!

How?

<ƝẠ$⁹#Y - Main Link: no arguments (implicit z=0) ⁹ - literal 256 # - count up from n=z (0) finding the first 256 for which this is truthy: $ - last two links as a monad: Ɲ - neighbours (implicitly gets digits of n): < - less than? Ạ - all truthy? (N.B. yields 1 for an empty list) Y - join with newlines 
\$\endgroup\$
1
\$\begingroup\$

MATLAB, 52 bytes

arrayfun(@(n)disp(n(all(diff(num2str(n))>0))),0:1e4) 
\$\endgroup\$
0
1
\$\begingroup\$

Ruby, 39 bytes

puts (?0..?9*4).grep /^#{[*0..9]*??}?$/ 

Try it online!

\$\endgroup\$
1
\$\begingroup\$

JavaScript, 83 bytes

Borrowed some ideas from @Shaggy, but without recursion.

[...Array(1e4)].reduce((s,_,n)=>s+=([...n+''].every(x=>y<(y=x),y=0))?'\n'+n:'','0') 

Try it online!

\$\endgroup\$
0
1
\$\begingroup\$

T-SQL, 188 185 bytes

WITH a AS(SELECT 0n UNION ALL SELECT n+1FROM a WHERE n<9) SELECT CONCAT(a.n,b.n,c.n,d.n)+0 FROM a,a b,a c,a d WHERE(a.n<b.n OR a.n+b.n=0) AND(b.n<c.n OR b.n+c.n=0) AND(c.n<d.n OR c.n+d.n=0) 

Line breaks are for readability only.

I'm certain there must be more efficient ways to do this in SQL, but this was the first thing I thought of. Explanation:

  1. Declare an in-memory table with values 0 to 9
  2. Cross-join 4 copies of this table for all possible values from 0000 to 9999
  3. Messy WHERE clause to ensure the digits are strictly increasing (or both 0)
  4. Smash the digits together (CONCAT) and convert to integer (+0)
  5. The resulting rows may or may not be sorted, but the challenge doesn't appear to require that.
\$\endgroup\$
2
  • 1
    \$\begingroup\$ You can convert to number by adding zero x+0 instead of abs(x). \$\endgroup\$ Commented Nov 26, 2018 at 17:55
  • \$\begingroup\$ Thanks, @DrYWit, saved 3 bytes. Looks like x*1 works as well. \$\endgroup\$ Commented Nov 26, 2018 at 18:27
1
\$\begingroup\$

MathGolf, 10 bytes

♫rgÆ▒_s▀=n 

Try it online!

Explanation

♫ push 10000 r range(0, n) g pop a, (b), pop operator from code, filter Æ start block of length 5 ▒ split to list of chars/digits _ duplicate TOS s sort(array) ▀ unique elements of string/list = pop(a, b), push(a==b) n newline char, or map array with newlines 
\$\endgroup\$
1
\$\begingroup\$

Tcl, 71 72 bytes

Requires Tcl >= 8.7 to allow use of lseq
lmap i [lseq 9999] {if {[set L [split $i ""]]==[lsort -u $L]} puts\ $i} 

Attempt This Online!


Tcl, 76 bytes

puts 0 time {if {[set L [split [incr i] ""]]==[lsort -u $L]} {puts $i}} 9999 

Try it online!

\$\endgroup\$
1
0
\$\begingroup\$

Retina 0.8.2, 38 bytes

 9999$* . $.`¶ . $*_$& A`(_*)\d\1\d _ 

Try it online! Explanation:

 9999$* 

Insert 9999 characters.

. $.`¶ 

Convert into a list of numbers 0..9998

. $*_$& 

Prefix each digit with its value in _s.

A`(_*)\d\1\d 

Delete lines containing nonincreasing digits.

_ 

Remove the now unnecessary _s.

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

Pyth, 15 bytes

jf.A<V`Tt`TU^T4 

Try it here!

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

Bash + GNU Core Utilities, 57 bytes

seq 1e4|grep -vP `seq 0 9|sed 's/./(&[0-&])/'|tr ' ' \|`p 

Uses some meta-regex-generation shit

\$\endgroup\$
2
  • \$\begingroup\$ Your output is missing the 0. \$\endgroup\$ Commented Nov 18, 2018 at 3:07
  • \$\begingroup\$ 47 bytes \$\endgroup\$ Commented Nov 18, 2018 at 3:21
0
\$\begingroup\$

K4, 19 bytes

Solution:

-1@$&&/'>':'$!9999; 

Explanation:

-1@$&&/'>':'$!9999; / the solution !9999 / range 0..9998 $ / string >':' / greater-than (>) each-previous (':) each (') &/' / max (&) over (/) & / indices where true $ / string @ / apply -1 ; / print to stdout and swallow return value (-1) 
\$\endgroup\$
0
\$\begingroup\$

Oracle SQL, 163 bytes

Various ways to generate combinations

with a(n)as(select level-1 from dual connect by level<11),r(i,x,s)as(select 1,n,n||''from a union all select i+1,n,s||n from r,a where(x<n or n+x=0)and i<4)select s+0 from r where i=4; with a(n)as(select level-1 from dual connect by level<11)select a.n||b.n||c.n||d.n+0 from a,a b,a c,a d where(a.n<b.n or a.n+b.n=0)and(b.n<c.n or b.n+c.n=0)and(c.n<d.n or c.n+d.n=0); with a(n)as(select level from dual connect by level<11)select unique replace(sys_connect_by_path(n-1,'#'),'#')+0 from(a)connect by level<5and prior n<n order by 1; 
  1. Rec with (CTE), 184 bytes
  2. Self joins, 182 bytes
  3. Connect by, 163 bytes

Just for fun

with t(c)as(select ku$_vcnt(1,2,3,4,5,6,7,8,9) from dual) select listagg(value(z)) within group (order by 0) + 0 n from (select rownum r, value(r) v from t, table(powermultiset(c)) r), table(v) z where cardinality(v) < 5 group by r union select 0 from dual 

.

with a(n)as(select decode(level,10,null,level) from dual connect by level<11) select nvl(a.n || b.n || c.n || d.n + 0, 0) n from a, a b, a c, a d where nvl2(b.n, sign(b.n - a.n), 1) = 1 and nvl2(c.n, sign(c.n - b.n), 1) = 1 and nvl2(d.n, sign(d.n - c.n), 1) = 1 order by 1 
\$\endgroup\$
0
\$\begingroup\$

PHP, 51 bytes

while($n<1e4)count_chars($n,3)-$n++||print~-$n." "; 

Run with -nr or try it online.


count_chars($string,$mode=3) returns a string of all used characters in ascending order.
This equals the input if, and only if, its characters (in this case: digits) are strictly increasing.

$n is NULL in the first iteration; count_chars returns an empty string; NULL-"" is evaluated as 0-0.

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

Kotlin, 132 131 bytes

Edit: -1 Byte thanks to @Giuseppe

fun main(){(0..9999).forEach{it.toString().let{var b=1;it.forEachIndexed{i,c->if(i>0&&it[i-1]<c)b++};if(b==it.length)println(it)}}} 

Try it online!

\$\endgroup\$
4
  • 1
    \$\begingroup\$ I don't know Kotlin, but a trivial golf is replacing 10000 with 9999 \$\endgroup\$ Commented Nov 26, 2018 at 17:35
  • \$\begingroup\$ alternative 131 \$\endgroup\$ Commented Mar 11, 2019 at 1:44
  • \$\begingroup\$ 96 \$\endgroup\$ Commented Mar 11, 2019 at 1:49
  • \$\begingroup\$ 95 \$\endgroup\$ Commented Mar 11, 2019 at 2:59
0
\$\begingroup\$

APL (Dyalog Extended), 28 bytes

{(⍵≡∪⍵)∧⍵≡∧⍵:⎕←⍵⋄⍬}∘⍕¨⍳10000 

Try it online!

Explanation:

{(⍵≡∪⍵)∧⍵≡∧⍵:⎕←⍵⋄⍬}∘⍕¨⍳10000 ⍝ Full program ⍳10000 ⍝ Generate integers from 1 to 10000 ∘⍕¨ ⍝ For each number, convert to string and apply left function ⍵≡∧⍵ ⍝ If the string equals itself sorted... (⍵≡∪⍵)∧ ⍝ ...and the string contains only unique elements... ⎕←⍵ ⍝ ...print the string to output with trailing newline ⋄⍬ ⍝ Otherwise, do nothing 
\$\endgroup\$
1
0
\$\begingroup\$

C++ (gcc), 113 bytes

bool y(int a){return(a==0||a%10>(a/=10)%10&&y(a))?true:false;}void z(int i){while(++i<7e3)if(y(i))cout<<i<<endl;} 

Try it online!

Pretty Layout:

#include<iostream> using namespace std; bool y(int a){ return(a==0||a%10>(a/=10)%10&&y(a))?true:false; } void z(int i){ while(++i<7e3){ !y(i)?:cout<<i<<endl; } } int main(){ z(-1); } 
\$\endgroup\$
1
  • \$\begingroup\$ 97 bytes \$\endgroup\$ Commented Apr 18, 2019 at 1:10
0
\$\begingroup\$

Java 8

Full program: 186 bytes

interface M{static void main(String[]a){for(int i=-1;i++<9999;System.out.print((i+"").chars().distinct().sorted().mapToObj(c->(c-48)+"").reduce("",(x,y)->x+y).equals(i+"")?i+"\n":""));}} 

Function: 149 bytes

v->{for(int i=-1;i++<9999;System.out.print((i+"").chars().distinct().sorted().mapToObj(c->(c-48)+"").reduce("",(x,y)->x+y).equals(i+"")?i+"\n":""));} 
\$\endgroup\$
0
\$\begingroup\$

Burlesque, 11 bytes

1e4qsoFO:U_ 

Equivalently

1e4ro:so:U_ 

Try it online!

1e4 # 10000 qso # Boxed is sorted? FO # Filter from 1..10000 if sorted :U_ # Filter for unique digits 
\$\endgroup\$
0
\$\begingroup\$

AWK, 72 bytes

END{for(;i++<1e4;printf j?i RS:X)for(j=k=split(i,a,X);k;)j*=a[k--]>a[k]} 

Attempt This Online!

END{for(;i++<1e4; # iterate printf j?i RS:X) # print if j non-zero for(j=k=split(i,a,X); # split i into array k;)j*=a[k--]>a[k]} # if not > then j==0 
\$\endgroup\$
1
2

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.