Тема: Задачка
Показать сообщение отдельно
Старый 28.06.2012, 16:37
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 12  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Хехе, все не так просто!
Изначальный (мой) вариант делает 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;
		}
	}
}
__________________
Hell is the possibility of sanity