30人31脚に挑戦!

awkネタ

「30人31脚」を有利に戦うための並べ方を考えます。
女の子が続いて並ぶと体力的に不利なので、女の子は隣り合わないようにします。
(男の子は何人並んでもよいものとします)
30人を1列に並べる時、その並べ方が何通りあるかを求めてください。
男女の並び方だけを考えるものとし、誰がどの位置かは考えないものとします。
例えば、4人(4人5脚)の場合は次の8通りがあります
  • 男男男男
  • 男男男女
  • 男男女男
  • 男女男男
  • 女男男男
  • 男女男女
  • 女男男女
  • 女男女男

考え方としては、必ず男子を追加出来るので、右端が男子の場合のみ女子を追加するという考えです。

#!/usr/bin/awk -f

BEGIN{
    # 男子と女子を文字で設定
    boy = "B";girl = "G";
    N = 30;

    print add(boy) + add(girl);
}

function add(seq,   cnt){
    # 並べる人数に達したら終了
    if(length(seq) == N){
        return 1;
    }
    # 30人未満の場合、男子を追加するか、右端が男子の場合女子を追加
    cnt = add(seq  boy);
    if(substr(seq,length(seq)) == boy){
        cnt += add(seq girl);
    }
    return cnt;
}

実行してみます

awk -f q17.awk 
2178309

膨大な数ですね。