質問の座席の問題を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サポーターズ
- 出版社/メーカー: 技術評論社
- 発売日: 2014/10/31
- メディア: Kindle版
- この商品を含むブログ (1件) を見る
論理パズル101―推理の楽しさ、ひらめきの快感 (ブルーバックス)
- 作者: デル・マガジンズ社,小野田博一
- 出版社/メーカー: 講談社
- 発売日: 1993/10/20
- メディア: 新書
- 購入: 4人 クリック: 30回
- この商品を含むブログ (16件) を見る