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!

Comments? Octodon, , GitHub, Reddit, or drop me a line!