![]() |
|
||||||||||
|
|
|
|||||
|
Modus ponens
|
Предлагаю, на мой взгляд, интересную задачку. Не обязательно решать на 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. |
|
|||||
|
а вот взять по-простому и рассовать, не ?
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]); |
|
|||||
|
Modus ponens
|
Есть один неприятный момент, который разрушает чувство прекрасного в этом коде
когда количество элементов делится нацело на количество колонок - 1, получается что в предпоследней колонке на один элемент меньше чем у остальных, а в последней всего один элемент. Например, когда data = [1, 2, 3, 4, 5, 6, 7, 8, 9], w = 4. В таком случае хотелось бы одну колонку делать выше остальных, а не вразнобой ![]()
__________________
Hell is the possibility of sanity |
|
|||||
|
Цитата:
а распихать все равно можно по простому (вроде бы )var i:int, j:int, k:int; var data:Array = [1, 2, 3, 4, 5, 6, 7, 8, 9]; var res:Array = []; var w:int = 4; 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 - 1) * (h - 1) + 1) break; // уместится ли в строку //if (--len < w - j) break; } } for (i = 0; i < h; i++) trace(res[i]); |
|
|||||
|
Что-то сложность не понятна: вот как silin сделал, в чем подвох?
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 1
|
Артём, там подвох в том, что колонки набираются последовательно и при некоторых случаях последняя колонка будет с одним элементом, в то время, как все остальные с 4-мя, например. Нужно, чтобы все колонки набирались равномерно ровно до тех пор, пока не останутся последние элементы.
Проще проиллюстрировать: Больше часа пробую такое запрогать, сложновато и заманчиво ![]() Добавлено через 1 час 23 минуты У меня пока что так получилось (наверняка с ошибками): 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. |
|
|||||
|
Modus ponens
|
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; } } } а хотелось бы: т.е. чтобы только одна колонка максимум, отличалась по высоте от других. ПС. Алгоритм такой потому что это адаптация со списков, и не хотелось во время распечаток много памяти ис пользовать. Но разница не существенная.
__________________
Hell is the possibility of sanity |
![]() |
![]() |
Часовой пояс GMT +4, время: 19:12. |
|
|
« Предыдущая тема | Следующая тема » |
|
|