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

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Код 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));
		}
 
		private function printArray(source:Array):String
		{
			return source.join(" ") + "\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;
		}
	}
}
По поводу примера, ну вот, собственно, смысл тот же, что и у silin'a и работает так же. В распечатке получаем:
Код:
1 4 7 9
2 5 8 
3 6
а хотелось бы:
Код:
1 4 6 8
2 5 7 9
3
т.е. чтобы только одна колонка максимум, отличалась по высоте от других.

ПС. Алгоритм такой потому что это адаптация со списков, и не хотелось во время распечаток много памяти ис пользовать. Но разница не существенная.
__________________
Hell is the possibility of sanity