ETOOBUSY 🚀 minimal blogging for the impatient
PWC217 - Max Number
TL;DR
On with TASK #2 from The Weekly Challenge #217. Enjoy!
The challenge
You are given a list of positive integers.
Write a script to concatenate the integers to form the highest possible value.
Example 1:
Input: @list = (1, 23) Output: 231
Example 2:
Input: @list = (10, 3, 2) Output: 3210
Example 3:
Input: @list = (31, 2, 4, 10) Output: 431210
Example 4:
Input: @list = (5, 11, 4, 1, 2) Output: 542111
Example 5:
Input: @list = (1, 10) Output: 110
The questions
I read “concatenate” as “first consider the integers as strings, concatenate them, then turn them back to integers and consider their value”. Pretty nitpicking.
The solution
We have to put elements in the right order, so it’s a sorting problem. Luckily for us, there are local conditions that allow us establish what’s globally better or worse; I mean, considering any pair of elements in the sequence of concatenation, taking their order that maximizes value is going to improve. Put it into another way, the elements of this game have an ordering, and we can leverage it.
When we have elements X and Y, we can tell whether it’s better to put X or Y before the other by concatenating them and comparing the results. If XY wins, then X goes first; otherwise, Y goes first.
Having this way of comparing elements means that we can offload the actual sorting to whatever the language makes available. Which is what we do here in Perl:
#!/usr/bin/env perl
print join('', sort { ($b . $a) <=> ($a . $b) } @ARGV), "\n";
This is easily translated into Raku:
#!/usr/bin/env raku
@*ARGS.sort({"$^b$^a".Int <=> "$^a$^b".Int}).join('').put;
I guess this is it, stay safe!