席替えツール(工事中)

出席者数、テーブルが何人掛けか、何回席変えをするかを入れると、ランダム計算で席替えしている。

向かい合わせテーブルの席替えツール

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;
        }

コメント