概要
% assign.sh sheets namelist # 席替えスクリプトが面白かったので、Groovyでも席替えスクリプトを実装してみました。
ただ、このスクリプトはそこまで楽しいものではなく、自分が学生の頃に実際に有った教室の席順を模しています。
席順はよくある(今も?)タイプで、男性女性の組み合わせを1列として、その列がnumberOfDeskColumns
分教室にある。
以下のような感じ。(あぶれた生徒は単純に最後に追加)
男 女 男 女 男 女
男 女 男 女 男 女
男 女 男 女 男 女
男 女 男 女 男 女
男 女 女
コレをGroovyで実装!
class Person {
def id
def sex // 0==Man, 1 == Woman
String toString() {
"${sprintf('%2d', id)}(${sex?'女':'男'})"
}
}
Integer numberOfStudents = 51
Integer numberOfDeskColumns = 3
Integer numberOf1Column = 2
// テストデータ生成
List<Person> persons = (1..numberOfStudents).collect {new Person(id:it, sex:it % 2)}
List<Person>men = persons.findAll{it.sex==0}
List<Person>women = persons.findAll{it.sex==1}
// それぞれの生徒の並び順をランダムに入れ換えて再結合
Collections.shuffle(men)
Collections.shuffle(women)
List<Person>shuffled = [men, women].transpose().flatten()
// あぶれた生徒の救出。。。
shuffled += men.findAll{ !(it in shuffled) } + women.findAll{ !(it in shuffled) }
shuffled.collate(numberOfDeskColumns*numberOf1Column).each {
println it
}
実行結果は以下のような感じに。
なお、当然ランダムで席順を入れ換えているので実行結果は毎回異なります。
[50(男), 19(女), 42(男), 37(女), 12(男), 39(女)]
[24(男), 15(女), 4(男), 27(女), 36(男), 3(女)]
[ 6(男), 17(女), 46(男), 13(女), 30(男), 5(女)]
[22(男), 7(女), 44(男), 41(女), 32(男), 49(女)]
[34(男), 23(女), 8(男), 9(女), 20(男), 47(女)]
[18(男), 29(女), 10(男), 1(女), 26(男), 31(女)]
[38(男), 51(女), 16(男), 33(女), 28(男), 35(女)]
[48(男), 21(女), 14(男), 45(女), 40(男), 25(女)]
[ 2(男), 43(女), 11(女)]
特に目新しい部分はありませんが、始めてtranspose
メソッドのお世話になりました。