Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flasher.ru > Флейм

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 27.06.2012, 20:00
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 1  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
По умолчанию Задачка

Предлагаю, на мой взгляд, интересную задачку. Не обязательно решать на AS, хоть на чем. Поэтому и в общем.

Задача заключается в следующем:
- нужно разбить содержание массива / списка / стека и т.п. на колонки. При чем, в исходной коллекции элементы упорядочены по какому угодно принципу. Для наглядности я буду использовать цифры, но это может быть что угодно.
Разбить нужно таким образом, чтобы максимально заполнить все колонки. Колонки нужно заполнять вертикально последовательно элементами из коллекции. Например:

[1, 2, 3, 4, 5, 6, 7]

разбив на 5 колонок получим:

|1| |3| |5| |6| |7|
|2| |4|

Естественно, количество элементов и колонок могут быть произвольными.

Да, еще, конечно, важное условие: колонки должны быть максимально уравновешены, т.е. вариант когда все элементы - (количество колонок - 1) складываются в первую колонку, а оставшиеся - во все остальные не проходит.
__________________
Hell is the possibility of sanity


Последний раз редактировалось wvxvw; 27.06.2012 в 20:07.
Старый 27.06.2012, 20:35
Aquahawk вне форума Посмотреть профиль Отправить личное сообщение для Aquahawk Посетить домашнюю страницу Aquahawk Найти все сообщения от Aquahawk
  № 2  
Ответить с цитированием
Aquahawk
 
Аватар для Aquahawk

Регистрация: Nov 2010
Адрес: Москва
Сообщений: 915
Записей в блоге: 4
Отправить сообщение для Aquahawk с помощью ICQ Отправить сообщение для Aquahawk с помощью Skype™
что-то мне тут Беллман мерещится, но сходу так не соображу. На буратину с яблоками чем-то похоже.
__________________
:)

Старый 27.06.2012, 22:56
Astraport вне форума Посмотреть профиль Отправить личное сообщение для Astraport Найти все сообщения от Astraport
  № 3  
Ответить с цитированием
Astraport
 
Аватар для Astraport

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
Интересно. А мне что-то из расчетов поверхностного натяжения
__________________
In Code We Trust

Старый 27.06.2012, 23:15
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 4  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
а вот взять по-простому и рассовать, не ?
Код AS3:
var i:int, j:int, k:int;
var data:Array = [1, 2, 3, 4, 5, 6, 7];
var res:Array = [];
 
var w:int = 5;
var len:int = data.length;
var h:int = Math.ceil(len / w);
 
for (i = 0; i < h; i++) res[i] = [];
 
k = 0;
for (j = 0; j < w; j++) 
{
 
	for (i = 0; i < h ; i++) 
	{
 
		res[i][j] = data[k++];
		if (--len < w - j) break;
	}
}
 
for (i = 0; i < h; i++) trace(res[i]);

Старый 28.06.2012, 02:21
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 5  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Есть один неприятный момент, который разрушает чувство прекрасного в этом коде когда количество элементов делится нацело на количество колонок - 1, получается что в предпоследней колонке на один элемент меньше чем у остальных, а в последней всего один элемент. Например, когда data = [1, 2, 3, 4, 5, 6, 7, 8, 9], w = 4. В таком случае хотелось бы одну колонку делать выше остальных, а не вразнобой
__________________
Hell is the possibility of sanity

Старый 28.06.2012, 02:26
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 6  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
Цитата:
В таком случае хотелось бы одну колонку делать выше остальных, а не вразнобой
Пример?
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 28.06.2012, 12:35
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 7  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
Что-то сложность не понятна: вот как silin сделал, в чем подвох?

Старый 28.06.2012, 12:41
Hauts вне форума Посмотреть профиль Отправить личное сообщение для Hauts Посетить домашнюю страницу Hauts Найти все сообщения от Hauts
  № 8  
Ответить с цитированием
Hauts
 
Аватар для Hauts

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,112
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
Артём, там подвох в том, что колонки набираются последовательно и при некоторых случаях последняя колонка будет с одним элементом, в то время, как все остальные с 4-мя, например. Нужно, чтобы все колонки набирались равномерно ровно до тех пор, пока не останутся последние элементы.

Проще проиллюстрировать:
Код:
1,4,7,9
2,5,8
3,6
Код:
1,4,6,8
2,5,7,9
3
Больше часа пробую такое запрогать, сложновато и заманчиво

Добавлено через 1 час 23 минуты
У меня пока что так получилось (наверняка с ошибками):
Код AS3:
var data:Array = [1,2,3,4,5,6,7,8,9];
var w:int = 4;
var res:Array = [];
var rows:int = Math.ceil(data.length / w);
var endCount:int = data.length % w;
var i:int = 0;
var j:int = 0;
var k:int = 0;
var pos:int = 0;
 
for (i = 0; i < rows + 10; i++) {
	res[i] = [];
}
for (k = 0; k < data.length; k ++) {
	pos = k % rows;
	if (pos == rows - 1) {
		j++;
	}
	if (j > endCount && endCount != 0) {
		pos = k % (rows - 1); // Вот тут косяк :(
	}
	res[pos].push(data[k]);
}
for (i = 0; i < rows; i++) {
	trace(res[i]);
}
__________________
hauts.ru


Последний раз редактировалось Hauts; 28.06.2012 в 14:24.
Старый 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

Старый 28.06.2012, 15:37
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 10  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
Код AS3:
		private function init(e:Event = null):void {
			removeEventListener(Event.ADDED_TO_STAGE, init);
			var txt:TextField=new TextField();
			txt.autoSize = TextFieldAutoSize.LEFT;
			txt.multiline=true;
 
			var input:Array = [1,2,3,4,5,6,7,8,9];
			const lines:int = 4;
 
			var length:int = input.length;
			var itemsInLine:int = length / lines;
			var outfit:int = length - itemsInLine * lines;
			var result:Array = [];
			var c:int = 0;
			var m:int = 0;
			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++;
			}
 
			for (var k:int = 0; k<result.length; k++){
				txt.appendText(result[k]+"\n")
			}
			addChild(txt);
		}

Создать новую тему Ответ Часовой пояс GMT +4, время: 19:00.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 19:00.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.