LoginSignup
2
1

More than 5 years have passed since last update.

[Groovy]席替えスクリプトを実装

Last updated at Posted at 2016-06-07

概要

% 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メソッドのお世話になりました。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1