質問の座席の問題をPythonで解いてみた。

 質問の座席の問題Pythonで解いてみました。(^_^;
 教師の条件を「条件T」、A子の条件を「条件A」。以下同様としました。女子を小文字abcd、男子を大文字EFGHIで表し、順列を生成して条件のチェックを潜り抜けたものだけを表示しました。
 ちなみに、隣接条件のチェックのために、行の切れ目に'|'を入れて文字列にしてから調べています。
 もしかして教師目線なら、左右が逆かも知れません。(^_^;
 また、先生「G馬場は背が高いので一番後ろ」という問題にアレンジしても結果は同じになるようです。

● seating.py

# coding: UTF-8
# seating.py

#  前前前
# 出012窓
# 入345窓
# 口678窓
#  後後後

def main():
    import itertools

    P = 'abcdEFGHI'
    count = 0
    for p in itertools.permutations(P):
        #                    11 1 1 1
        #    01 2 3 456 7 8 901 2 3 4
        s = '|%s%s%s||%s%s%s||%s%s%s|'%p
        if p.index('F')>=3: continue                        # 条件T
        if abs(s.index('a')-s.index('b'))!=1: continue      # 条件A
        b = s.index('b')                                    # 条件B
        if s[b-1].isupper() or s[b+1].isupper(): continue
        c = s.index('c')                                    # 条件C
        if s[c-1].islower() or s[c+1].islower(): continue
        if abs(s.index('d')-s.index('H'))!=1: continue      # 条件D-1
        if 'd|' in s: continue                              # 条件D-2
        e = s.index('E')                                    # 条件E-1
        if s[e-1].islower() or s[e+1].islower(): continue
        if abs(s.index('E')-s.index('G'))==1: continue      # 条件E-2
        if not p[p.index('F')+3].islower(): continue        # 条件F
        if abs(s.index('a')-s.index('G'))==1: continue      # 条件G-1
        if p.index('G')!=p.index('d')+3: continue           # 条件G-2
        if p.index('H')>=6: continue                        # 条件H
        if p.index('I')!=6 and p.index('I')!=8: continue    # 条件I
        # チェックを潜り抜けたものだけを表示
        count+=1
        print('- %d -'%count)
        print(s[ 0: 5])
        print(s[ 5:10])
        print(s[10:15])

if __name__ == '__main__':
    main()

●実行結果

- 1 -
|Fab|
|dHE|
|GcI|

パーフェクトPython

パーフェクトPython

論理パズル101―推理の楽しさ、ひらめきの快感 (ブルーバックス)

論理パズル101―推理の楽しさ、ひらめきの快感 (ブルーバックス)