回答編集履歴

4

修正

2023/04/20 06:36

投稿

8524ba23
8524ba23

スコア38352

test CHANGED
@@ -57,26 +57,23 @@
57
57
  声がでかい,注目,手先が器用
58
58
  手先が器用,熱中,ひょうきん"""
59
59
 
60
- # 状態遷移データを作成
60
+ # 元データの文字列から状態遷移データを作成
61
61
  questions = dict()
62
62
  first = None
63
63
  for line in StringIO(lines):
64
- nodes = line.strip().split(',')
64
+ q,y,n = line.strip().split(',')
65
65
  if first is None:
66
- first = nodes[0]
66
+ first = q
67
- questions[nodes[0]] = nodes[1:]
67
+ questions[q] = (y,n)
68
68
 
69
69
  # 質問による状態遷移
70
- print(questions)
71
70
 
72
71
  mes = first # 最初の質問
73
- while True:
74
- if mes in questions: # 質問なので尋ねる
72
+ while mes in questions:
75
- inp = input(f'あなたは{mes}?')
73
+ inp = input(f'あなたは{mes}?')
76
- mes = questions[mes][inp!='yes']
74
+ mes = questions[mes][inp!='yes']
77
- else: # 答えなので終了
75
+
78
- print(f'あなたは{mes}!')
76
+ print(f'あなたは{mes}!')
79
- break
80
77
  ```
81
78
 
82
79
  ##

3

追記

2023/04/20 06:28

投稿

8524ba23
8524ba23

スコア38352

test CHANGED
@@ -47,6 +47,37 @@
47
47
  print(f'あなたは{mes}!')
48
48
  break
49
49
  ```
50
+ #
51
+ よく考えたら各要素(メッセージ)に番号を振る必要もないか。
52
+ ```Python
53
+ from io import StringIO
54
+
55
+ # 元データ:質問, yes, no の行先
56
+ lines = """年上にみられる,声がでかい,手先が器用
57
+ 声がでかい,注目,手先が器用
58
+ 手先が器用,熱中,ひょうきん"""
59
+
60
+ # 状態遷移データを作成
61
+ questions = dict()
62
+ first = None
63
+ for line in StringIO(lines):
64
+ nodes = line.strip().split(',')
65
+ if first is None:
66
+ first = nodes[0]
67
+ questions[nodes[0]] = nodes[1:]
68
+
69
+ # 質問による状態遷移
70
+ print(questions)
71
+
72
+ mes = first # 最初の質問
73
+ while True:
74
+ if mes in questions: # 質問なので尋ねる
75
+ inp = input(f'あなたは{mes}?')
76
+ mes = questions[mes][inp!='yes']
77
+ else: # 答えなので終了
78
+ print(f'あなたは{mes}!')
79
+ break
80
+ ```
50
81
 
51
82
  ##
52
83
  この課題は、状態遷移([有限オートマトン](https://ja.wikipedia.org/wiki/%E6%9C%89%E9%99%90%E3%82%AA%E3%83%BC%E3%83%88%E3%83%9E%E3%83%88%E3%83%B3))でシンプルに表現できて解けると思います。

2

修正

2023/04/20 06:13

投稿

8524ba23
8524ba23

スコア38352

test CHANGED
@@ -9,8 +9,33 @@
9
9
  というデータを作ります。
10
10
  あとは 最初の質問から答えに到達するまでループすればよいです。
11
11
  ```Python
12
+ from io import StringIO
13
+
14
+ # 元データ:質問, yes, no の行先
12
- nodes = {1:'年上にみられる',2:'声がでかい',3:'手先が器用',4:'注目',5:'熱中',6:'ひょうきん'}
15
+ lines = """年上にみられる,声がでかい,手先が器用
16
+ 声がでかい,注目,手先が器用
17
+ 手先が器用,熱中,ひょうきん"""
18
+
19
+ nodes = dict()
20
+ questions = dict()
21
+
22
+ # 元データ文字列から状態遷移データを作成
23
+ items = {}
24
+ no = 1
25
+ for line in StringIO(lines):
26
+ items = line.strip().split(',')
27
+ for i,item in enumerate(items):
28
+ if item not in messages:
29
+ messages[items[i]] = no
30
+ nodes[no] = item
31
+ no += 1
32
+ items[i] = messages[item]
13
- questions = {1:(2,3), 2:(4,3), 3:(5,6)} # (yesの移動先, noの移動先)
33
+ questions[items[0]] = (items[1],items[2])
34
+
35
+ print(nodes)
36
+ print(questions)
37
+
38
+ # 質問による状態遷移
14
39
 
15
40
  no = 1 # 最初の質問
16
41
  while True:

1

追記

2023/04/20 05:12

投稿

8524ba23
8524ba23

スコア38352

test CHANGED
@@ -22,3 +22,20 @@
22
22
  print(f'あなたは{mes}!')
23
23
  break
24
24
  ```
25
+
26
+ ##
27
+ この課題は、状態遷移([有限オートマトン](https://ja.wikipedia.org/wiki/%E6%9C%89%E9%99%90%E3%82%AA%E3%83%BC%E3%83%88%E3%83%9E%E3%83%88%E3%83%B3))でシンプルに表現できて解けると思います。
28
+ ```Python
29
+ from graphviz import Digraph
30
+
31
+ G = Digraph(format="png")
32
+ G.attr("node", fontname='MS Gothic')
33
+ G.edge('年上にみられる', '声がでかい',label='yes')
34
+ G.edge('年上にみられる', '手先が器用',label='no')
35
+ G.edge('声がでかい', '注目',label='yes')
36
+ G.edge('声がでかい', '手先が器用',label='no')
37
+ G.edge('手先が器用', '熱中',label='yes')
38
+ G.edge('手先が器用', 'ひょうきん',label='no')
39
+ G.render("ret")
40
+ ```
41
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2023-04-20/66e6d12c-5389-4e5d-93a8-7a906457cd26.png)