Хехе, все не так просто!
Изначальный (мой) вариант делает C + ceiling(N/C) * C итераций. Где C - количество колонок, а N - количество элементов в массиве который нужно распечатать. Кроме того, space-state complexity (тета) равна 3 * C, а в предложенных вариантах - это C + N, что практически всегда будет больше.
Я привел ниже код Тигры который распечатывает результат в том же формате, что и мой, чтобы было видно где именно набиратются те самые итерации:

Код AS3:
package
{
import flash.display.Sprite;
public class PrintColumns extends Sprite
{
/**
* http://stackoverflow.com/questions/1...-into-x-colums
*/
public function PrintColumns()
{
super();
trace(printColumns([1, 2, 3, 4, 5, 6, 7, 8, 9], 4));
trace(printColumns2([1, 2, 3, 4, 5, 6, 7, 8, 9], 4));
}
private function printArray(source:Array):String
{
return source.join(" ") + "\n";
}
private function mapconcat(arrays:Array, delimiter:String):String
{
var result:String = "";
var args:Array = new Array(arrays.length);
var printed:Array;
for (var i:int = 0; i < arrays[0].length; i++)
{
for (var j:int = 0; j < arrays.length; j++)
{
printed = arrays[j];
if (printed.length > i) args[j] = printed[i];
else args[j] = "";
}
result += delimiter + args.join(" ");
}
return result.substr(delimiter.length);
}
private function printColumns2(input:Array, lines:int):String
{
var length:int = input.length;
var itemsInLine:int = length / lines;
var outfit:int = length - itemsInLine * lines;
var result:Array = [];
var c:int;
var m:int;
var output:String = "";
while (c < length)
{
result[m] = [];
for (var i:int = 0; i < itemsInLine; i++) result[m].push(input[c++]);
if (outfit-- > 0) result[m].push(input[c++]);
m++;
}
return mapconcat(result, "\n");
}
private function printColumns(source:Array, numColumns:int):String
{
var output:String = "";
var columns:Array = new Array(numColumns);
var printPositions:Array = new Array(numColumns);
var printed:Array;
var i:int;
var columnLength:int = Math.ceil(source.length / numColumns);
var printedAlready:int;
var nextBunch:int;
printPositions[0] = 0;
while (i < numColumns)
{
if (source.length - (printedAlready + columnLength) < numColumns - i)
nextBunch = columnLength - 1;
else nextBunch = columnLength;
printPositions[i + 1] = printedAlready + nextBunch;
columns[i] = printPositions[i + 1] - printPositions[i];
printedAlready += nextBunch;
i++;
}
i = 0;
printed = new Array(numColumns);
while (i < columnLength)
{
for (var j:int = 0; j < numColumns; j++)
{
if (columns[j])
{
printed[j] = source[printPositions[j]];
printPositions[j]++;
columns[j]--;
}
else printed[j] = " ";
}
output += printArray(printed);
i++;
}
return output;
}
}
}