Показать сообщение отдельно
  #27 (permalink)  
Старый 26.07.2017, 19:13
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Сообщение от рони Посмотреть сообщение
если у вас есть решение для любых прямоугольных вариантов, подскажите пожалуйста.
да в общем-то всё очевидно. Максимальный квадрат слева-сверху просто поворачиваем, для остального делаем перенос ячеек.

вот сие художество:

<!DOCTYPE HTML>
<html>
<head>
<title>title</title>
</head>
<body>
<table>
	<tr><td>1<td>2<td>3
	<tr><td>4<td>5<td>6
	<tr><td>7<td>8<td>9
	<tr><td>A<td>B<td>C
	<tr><td>D<td>E<td>F
</table>

<button>Клик</button>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script>
function swapContent(elem1, elem2) {
    var t = elem1.innerHTML;
    elem1.innerHTML = elem2.innerHTML;
    elem2.innerHTML = t;
}

function moveCells(table, b1, e1, b2, e2) {
    for (var i = b1; i >= e1; --i) {
        for (var j = b2; j < e2; ++j) {
            table.rows[i].appendChild(table.rows[j].lastChild);
        }
    }
}

function transp(table) {
    var h = table.rows.length;
    var w = h && table.rows[0].cells.length;
    if (!w) { return; }
    var min = Math.min(w, h), max = Math.max(w, h);

    // 1) поворачиваем квадратную часть таблицы
    for (var i = 0; i < min; ++i) {
        for (var j = i + 1; j < min; ++j) {
             swapContent(table.rows[i].cells[j], table.rows[j].cells[i]);
        }
    }
    if (w === h) { return; }

    if (w > h) {
        for (var i = min; i < max; ++i) {
            table.insertRow(i);
        }
        moveCells(table, max - 1, min, 0, min);
    } else {
        moveCells(table, min - 1, 0, min, max);
        for (var i = max - 1; i >= min; --i) {
            table.deleteRow(i);
        }
    }
}

$('button').click(function(){
	$("table").each(function() { transp(this); });
});
</script>
</body>
</html>
Ответить с цитированием