出席者数、テーブルが何人掛けか、何回席変えをするかを入れると、ランダム計算で席替えしている。
向かい合わせテーブルの席替えツール
ChatGPTに手伝ってもらって作ったけど、人数が少ないテーブルができてしまうので、デバッグして修正させたところで時間切れ。 できるだけ満遍なく座れるのかの検証まで行き着かなかった。 どうもramdom計算だけしているので時々同じ人になってしまうみたい。 先程と一緒だったら計算やり直しするようにつしてみよう。 まあ明日だな。

/
function generateSeating() {
let numParticipants = parseInt(document.getElementById("numParticipants").value);
let numRounds = parseInt(document.getElementById("numRounds").value);
let tableSize = parseInt(document.getElementById("tableSize").value);
if (tableSize < 4) {
alert("机の定員は4人以上にしてください。");
return;
}
let participants = Array.from({ length: numParticipants }, (_, i) => i + 1);
let output = "";
for (let round = 1; round <= numRounds; round++) {
if (round === 1) {
participants = arrangeFirstSeating(numParticipants);
} else {
shuffle(participants);
}
output += `<div class="round-header">【第 ${round} 回席替え】</div>`;
let tableArrangement = distributeSeats(numParticipants, tableSize);
let assigned = 0;
tableArrangement.forEach((size, tableNum) => {
output += `<table><tr><th colspan="2">テーブル ${tableNum + 1}</th></tr>`;
let rows = Math.ceil(size / 2);
for (let i = 0; i < rows; i++) {
output += "<tr>";
for (let j = 0; j < 2; j++) {
if (assigned < numParticipants && i * 2 + j < size) {
output += `<td>${participants[assigned]}</td>`;
assigned++;
} else {
output += `<td>空席</td>`;
}
}
output += "</tr>";
}
output += "</table>";
});
}
document.getElementById("result").innerHTML = output;
}
function arrangeFirstSeating(numParticipants) {
let participants = Array.from({ length: numParticipants }, (_, i) => i + 1);
participants = participants.filter(p => p !== 1);
shuffle(participants);
let midIndex = Math.floor(numParticipants / 2);
participants.splice(midIndex, 0, 1);
return participants;
}
function shuffle(array) {
for (let i = array.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
}
function distributeSeats(numParticipants, tableSize) {
let numTables = Math.ceil(numParticipants / tableSize); // 必要なテーブル数を算出
let baseSize = Math.floor(numParticipants / numTables); // 各テーブルの基本人数
let extraSeats = numParticipants % numTables; // 余った人数
let tableArrangement = new Array(numTables).fill(baseSize);
for (let i = 0; i < extraSeats; i++) {
tableArrangement[i]++; // 余りを均等に割り振る
}
return tableArrangement;
}
コメント