質問の座席の問題をPythonで解いてみた。 (original) (raw)

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

● seating.py

def main(): import itertools

P = 'abcdEFGHI'
count = 0
for p in itertools.permutations(P):
    
    
    s = '|%s%s%s||%s%s%s||%s%s%s|'%p
    if p.index('F')>=3: continue                        
    if abs(s.index('a')-s.index('b'))!=1: continue      
    b = s.index('b')                                    
    if s[b-1].isupper() or s[b+1].isupper(): continue
    c = s.index('c')                                    
    if s[c-1].islower() or s[c+1].islower(): continue
    if abs(s.index('d')-s.index('H'))!=1: continue      
    if 'd|' in s: continue                              
    e = s.index('E')                                    
    if s[e-1].islower() or s[e+1].islower(): continue
    if abs(s.index('E')-s.index('G'))==1: continue      
    if not p[p.index('F')+3].islower(): continue        
    if abs(s.index('a')-s.index('G'))==1: continue      
    if p.index('G')!=p.index('d')+3: continue           
    if p.index('H')>=6: continue                        
    if p.index('I')!=6 and p.index('I')!=8: continue    
    
    count+=1
    print('- %d -'%count)
    print(s[ 0: 5])
    print(s[ 5:10])
    print(s[10:15])

if name == 'main': main()

●実行結果

パーフェクトPython

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