# Largest and smallest values from concatenated integers

This problem is from Five programming problems every Software Engineer should be able to solve in less than 1 hour which itself is an interesting read. The first few problems are trivial, but the fourth one can be a bit more interesting.

Given a list of integers separated by a single space on standard input, print out the largest and smallest values that can be obtained by concatenating the integers together on their own line.

For example:

Input:

5 56 50


Output:

50556
56550


Various points of order:

• The order of the results are smallest then largest.
• Only the smallest and largest values may be printed out (iterating over all the variations and printing them out isn't valid).
• There will always be two or more integers in the list.
• It is possible for the largest and smallest results to be the same. In the case of input 5 55, the number 555 should be printed twice.
• The integers are not necessarily distinct. 5 5 is valid input.
• Leading 0s on integers are not valid input. You will not need to account for 05 55.

As this is code golf, shortest entry wins.

• If one of the input numbers contain a leading 0 (like 05), do we consider it as 05 or simply 5 ? May 8, 2015 at 22:23
• @Optimizer leading zeros are not valid input.
– user12166
May 8, 2015 at 22:25
• Are leading 0s allowed in output?
– Tim
May 9, 2015 at 8:58
• @Tim Where would those come from if there are no leading zeroes in the input? May 9, 2015 at 9:40
• @MartinBüttner oh yes, being silly!
– Tim
May 9, 2015 at 9:40

# CJam, 14 13 bytes

qS/e!:s$(N@W=  Pretty straight forward. This is how it works: qS/ e# Split the input on spaces e! e# Get all permutations of the input numbers :s e# Join each permutation order into a single string$             e# Sort them. This sorts the strings based on each digit's value
(N@W=        e# Choose the first and the last out of the array separated by '\n'


Try it online here

• OK, I give up. I didn't now e! existed (doesn't even appear in the wiki yet). May 8, 2015 at 22:18
• @Dennis there you go May 8, 2015 at 22:18
• Sweet read. Lots of useful new stuff. May 8, 2015 at 22:22
• It might be useful to update Tips for golfing in CJam with these additional tricks.
– user12166
May 9, 2015 at 16:24
• @MichaelT tips generally are not supposed to contain answer which explain the in built features of a language. A couple of answer might need updating as they might benefit from these new features though. May 9, 2015 at 17:18

# Pyth, 14 13 bytes

hJSmsd.pcz)eJ


Generates all permutations and sorts them, printing the first and last element.

• Assign J inline: hJSmsd.pcz)eJ May 9, 2015 at 6:47
• @isaacg Good one! I just knew we wouldn't be inferior to that filthy filthy CJam!
– orlp
May 9, 2015 at 7:59

# Python 2, 104 99 bytes

Yep.

from itertools import*;z=[''.join(x)for x in permutations(raw_input().split())];print min(z),max(z)


Edit: thanks to xnor for -5 bytes!

• The comprehension inside sorted works without brackets, but you also can avoid sorting and just take min and max.
– xnor
May 9, 2015 at 0:32
• hah, yes. thank you! May 9, 2015 at 1:04

# Mathematica, 64 58 bytes

Print/@Sort[""<>#&/@Permutations@StringSplit@#][[{1,-1}]]&


This defines an unnamed function taking a string and printing the two lines. It's pretty straightforward as the others: get all permutations, join them together, sort them and print the first and last result.

Six bytes saved thanks to alephalpha.

• {#&@@#,Last@#}=>#[[{1,-1}]] May 9, 2015 at 7:30
• @alephalpha Sometimes simpler is better. Thanks! :D May 9, 2015 at 9:37

# JavaScript (ES6) 54 72 85

That's easier than it seems. Just sort them lexicographically. The good news is: that's exactly how plain javascript sort works.Well ... no, that's wrong ... still a (more convoluted) lexicograph compare can do the job.

Note: having a and b numeric, a+[b] is a shortcut for a+''+b, as we need a string concatenation and not a sum.
Note 2: the newline inside  is significant and must be counted

Edit Don't argue with a moderator (...just kidding)

Edit2 Fixed I/O format using popups (see Default for Code Golf: Input/Output methods)

// Complete program with I/O
// The sorting function is shorter as input are strings

alert((l=prompt().split(' ')).sort((a,b)=>a+b>b+a).join('')+
+l.reverse().join(''))

// Testable function (67 chars)
// With an integer array parameter, the sorting function must convert to string

F=l=>(l.sort((a,b)=>a+[b]>b+[a]).join('')+
+l.reverse().join(''))


Test In Firefox / FireBug console

F([50, 2, 1, 9])
F([5,56,50])
F([52,36,526])
F([52,36,525])
F([52,36,524]


12509
95021

50556
56550

3652526
5265236

3652525
5255236

3652452
5252436

• I think your input format is wrong. Should be "integers separated by a single space on standard input".
– nimi
May 9, 2015 at 12:19
• @nimi you're right.Fixed May 9, 2015 at 12:59

## J, 34 36, 42 bytes

simple brute force:

h=:3 :'0 _1{/:~;"1":&.>y A.~i.!#y'

h 5 50 56
50556
56550

h 50 2 1 9
12509
95021


import Data.List
g=sort.map concat.permutations.words
h i=unlines[g i!!0,last$g i] main=interact h  Split input string at spaces, concatenate every permutation and sort. Print first and last element. # Julia, 77 bytes v->(Q=extrema([int(join(x)) for x in permutations(v)]);print(Q,"\n",Q))  This creates an unnamed function that accepts a vector as input and prints the minimum and maximum of the permutations of the joined elements. To call it, give it a name, e.g. f=v->.... Ungolfed + explanation: function f(v) # Create an integer vector of the joined permutations using comprehension, # then get the minimum and maximum as a tuple using extrema(). Q = extrema([int(join(x)) for x in permutations(v)]) # Print the minimum and the maximum, separated by a newline. print(Q, "\n", Q) end  Suggestions are welcome! # Javascript (ES6) 134 Sadly, there's no built-in permutation function in JS :( f=(o,y,i,a)=>y?o.concat(a?a.filter((k,j)=>j^i).reduce(f,[]).map(z=>y+z):y):(q=o.split(' ').reduce(f,[])).sort().shift()+ +q.pop() <!-- Snippet Demo (Firefox only) --> <input id="input" value="5 56 50" /> <input type="button" onclick="output.innerHTML=f(input.value)" value="Run" /> <pre id="output"></pre> ## R, 59 bytes write(range(combinat:::permn(scan(),paste,collapse="")),"")  • Nice work. You can save a byte by using just two colons though, i.e. combinat::permn. May 11, 2015 at 15:59 • I thought :: required the package to be loaded (via library or require) but not :::. I could be wrong; need to read a little more about it. Thanks. May 11, 2015 at 23:03 • If the library is loaded, you don't need the colons at all; you can just call the function directly since the package is attached to the namespace. If the package is installed but not loaded, you can reference functions in a particular package with two colons. May 11, 2015 at 23:08 • So 58 it can be. I would not allow myself using permn directly without a library(combinat). May 11, 2015 at 23:10 • Yeah, because you have to load the library with library(combinat) before you could use permn anyway. ;) May 11, 2015 at 23:18 # Ruby 75 Not my 'native' language, but one I thought I'd give a try at... thus this could (possibly) use some golfing tips. Still, not a bad entrant. puts STDIN.read.split(" ").permutation.map{|x|x.join}.sort.values_at(0,-1)  I wouldn't say it is elegant other that everything is built in to the language. It should be fairly obvious exactly how this works. # Perl, 79 70B (68+2) use Math::Combinatorics;say for(sort map{join'',@$_}permute@F)[0,-1]

Call with echo 13 42 532 3 6|perl -M5.10.0 -an scratch.pl. There's a +2 byte penalty for -an. Shame about the length of the module name...

# 05AB1E, 8 bytes

#œJ{¬sθ»


Try it online.

Explanation:

#         # Split the (implicit) input by spaces
œ        # Get all permutations of this list
J       # Join each permutation together to a single string
{      # Sort this list
¬     # Push the first item (without popping the list)
s    # Swap to get the list again
θ   # Pop and push its last item
»  # And join all (both) values on the stack by newlines
# (after which the result is output implicitly)


# Scala, 90 bytes

val x=Console.in.readLine.split(" ").permutations.map(_.mkString).toSeq
print(x.min,x.max)


Try it online!

# JavaScript (ES6), 85 bytes

F=a=>(c=a.split(" ").sort((b,a)=>b+a-(a+b)),${c.join("")}${c.reverse().join("")})


usage:

F("50 2 1 9")
/*
12509
95021
*/

• Don't fall in love with template strings. a+ +b is shorter than ${a}${b} May 10, 2015 at 0:06

# Stax, 11 bytes

ú∙n90≤╣*.vâ


Run and debug it

Link is to unpacked version of code.

## Explanation

L|T{$mc|MP|mp implicit input L put all inputs in a list |T get the unique orders of the list of inputs {$m        convert each list to string
c       duplicate the array of strings
|mP    print the minimum element
|mp print the maximum element


# Jelly, 6 bytes

Œ!VṢ.ị


Try it online!

Input and output as lists of integers. +3 bytes to input with spaces and output with newlines

## How it works

Œ!VṢ.ị - Main link. Takes a list L on the left e.g. [5, 56, 50]
Œ!     - All permutations of L                      [[5, 56, 50], [5, 50, 56], [56, 5, 50], [56, 50, 5], [50, 5, 56], [50, 56, 5]]
V    - Concatenate each into numbers              [55650, 55056, 56550, 56505, 50556, 50565]
Ṣ   - Sort                                       [50556, 50565, 55056, 55650, 56505, 56550]
.ị - Take the first and last elements           [56550, 50556]