回答編集履歴
6
余談
answer
CHANGED
@@ -101,4 +101,16 @@
|
|
101
101
|
|
102
102
|
ぱっと思いつく、他にやらないといけないであろうこと。
|
103
103
|
- 構文が間違っていたらわかりやすいエラーを出す
|
104
|
-
- MRKで同じラベルを複数作ると困るので、エラーを出すようにする
|
104
|
+
- MRKで同じラベルを複数作ると困るので、エラーを出すようにする
|
105
|
+
|
106
|
+
|
107
|
+
#### 余談
|
108
|
+
大学の推薦入試くらいならけっこうウケるかもしれませんが、この「プログラミング言語」にはいろいろ問題があります。
|
109
|
+
- 変数がない
|
110
|
+
- 状態を持てない
|
111
|
+
- よってかなり表現能力は低い
|
112
|
+
- あと、初等教育の子たちってパソコンのキーボードを使えるんですか
|
113
|
+
|
114
|
+
さらにこの分野ではLEGOのマインドストームという強力な競合があります(他にもあるけど)。私は小学生の頃触っていましたが、けっこう高機能でした。
|
115
|
+
|
116
|
+
今から練り直すもよし、あるいはその辺は割り切ってプレゼン力で乗り切るのも一つの戦略です。
|
5
追記
answer
CHANGED
@@ -97,4 +97,8 @@
|
|
97
97
|
break
|
98
98
|
exec_instruction(*instructions[pc])
|
99
99
|
pc += 1
|
100
|
-
```
|
100
|
+
```
|
101
|
+
|
102
|
+
ぱっと思いつく、他にやらないといけないであろうこと。
|
103
|
+
- 構文が間違っていたらわかりやすいエラーを出す
|
104
|
+
- MRKで同じラベルを複数作ると困るので、エラーを出すようにする
|
4
動いちゃった
answer
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
フロー制御だけできれば良いなら、読み込んだ命令をリストに入れて先頭から逐次実行、JMP系はプログラムカウンタ的な変数を用意しておいてそれを書き換える……みたいな方針で書けるとは思いますが。
|
6
6
|
|
7
7
|
#### 追記
|
8
|
-
一応具体例を書いておきます。
|
8
|
+
一応具体例を書いておきます。
|
9
9
|
|
10
10
|
```
|
11
11
|
MRK(1)
|
@@ -15,7 +15,7 @@
|
|
15
15
|
```
|
16
16
|
を動かすとしたら、
|
17
17
|
|
18
|
-
まず読み込んで次のようなフォーマットに変換する。
|
18
|
+
まず読み込んで次のようなフォーマットに変換する。ここは面倒くさいので今回パスします。
|
19
19
|
```python
|
20
20
|
instructions = [("MRK", 1), ("FWD", 1.0), ("LFT", 1.0), ("JMP", 1)]
|
21
21
|
```
|
3
追記
answer
CHANGED
@@ -57,4 +57,44 @@
|
|
57
57
|
break
|
58
58
|
exec_instruction(*instructions[pc])
|
59
59
|
pc += 1
|
60
|
+
```
|
61
|
+
|
62
|
+
以上をまとめてみました。実行可能です。あまりきれいじゃないんですが、何かの参考にはなると思います。
|
63
|
+
|
64
|
+
```python
|
65
|
+
import time
|
66
|
+
|
67
|
+
def fwd(arg):
|
68
|
+
# fwdとlftは自分の名前をprintしてarg秒sleepする関数にしてみました
|
69
|
+
print("fwd")
|
70
|
+
time.sleep(arg)
|
71
|
+
|
72
|
+
def lft(arg):
|
73
|
+
print("lft")
|
74
|
+
time.sleep(arg)
|
75
|
+
|
76
|
+
def exec_instruction(ins, arg):
|
77
|
+
global pc
|
78
|
+
if ins == "FWD":
|
79
|
+
fwd(arg)
|
80
|
+
elif ins == "LFT":
|
81
|
+
lft(arg)
|
82
|
+
elif ins == "JMP":
|
83
|
+
pc = label_table[arg]
|
84
|
+
else:
|
85
|
+
pass
|
86
|
+
|
87
|
+
instructions = [("MRK", 1), ("FWD", 1.0), ("LFT", 1.0), ("JMP", 1)]
|
88
|
+
|
89
|
+
label_table = dict()
|
90
|
+
for i, (ins, arg) in enumerate(instructions):
|
91
|
+
if ins == "MRK":
|
92
|
+
label_table[arg] = i
|
93
|
+
|
94
|
+
pc = 0
|
95
|
+
while True:
|
96
|
+
if pc >= len(instructions):
|
97
|
+
break
|
98
|
+
exec_instruction(*instructions[pc])
|
99
|
+
pc += 1
|
60
100
|
```
|
2
抜けてなかった
answer
CHANGED
@@ -53,6 +53,8 @@
|
|
53
53
|
```
|
54
54
|
pc = 0
|
55
55
|
while True:
|
56
|
+
if pc >= len(instructions):
|
57
|
+
break
|
56
58
|
exec_instruction(*instructions[pc])
|
57
59
|
pc += 1
|
58
60
|
```
|
1
追記
answer
CHANGED
@@ -2,4 +2,57 @@
|
|
2
2
|
|
3
3
|
簡単とはいえpythonとは別の言語処理系を作ることになるので、相応の気合と知識が要ります。
|
4
4
|
|
5
|
-
フロー制御だけできれば良いなら、読み込んだ命令をリストに入れて先頭から逐次実行、JMP系はプログラムカウンタ的な変数を用意しておいてそれを書き換える……みたいな方針で書けるとは思いますが。
|
5
|
+
フロー制御だけできれば良いなら、読み込んだ命令をリストに入れて先頭から逐次実行、JMP系はプログラムカウンタ的な変数を用意しておいてそれを書き換える……みたいな方針で書けるとは思いますが。
|
6
|
+
|
7
|
+
#### 追記
|
8
|
+
一応具体例を書いておきます。あくまでも概念コードなので、そのまま実行はできませんが。
|
9
|
+
|
10
|
+
```
|
11
|
+
MRK(1)
|
12
|
+
FWD(1.0)
|
13
|
+
LFT(1.0)
|
14
|
+
JMP(x)
|
15
|
+
```
|
16
|
+
を動かすとしたら、
|
17
|
+
|
18
|
+
まず読み込んで次のようなフォーマットに変換する。
|
19
|
+
```python
|
20
|
+
instructions = [("MRK", 1), ("FWD", 1.0), ("LFT", 1.0), ("JMP", 1)]
|
21
|
+
```
|
22
|
+
|
23
|
+
ラベルと命令のindexの対応テーブルを作っておきます。
|
24
|
+
|
25
|
+
```python
|
26
|
+
label_table = dict()
|
27
|
+
for i, (ins, arg) in enumerate(instructions):
|
28
|
+
if ins == "MRK":
|
29
|
+
label_table[arg] = i
|
30
|
+
```
|
31
|
+
|
32
|
+
命令を実際に実行するための関数を書く。なお、各命令の関数は別途用意しておきます。
|
33
|
+
|
34
|
+
```python
|
35
|
+
def exec_instruction(ins, arg):
|
36
|
+
global pc
|
37
|
+
if ins == "FWD":
|
38
|
+
fwd(arg)
|
39
|
+
elif ins == "LFT":
|
40
|
+
lft(arg)
|
41
|
+
# 中略...
|
42
|
+
# JMP系はまた扱いが別
|
43
|
+
elif ins == "JMP":
|
44
|
+
pc = label_table[arg]
|
45
|
+
elif ins == "SW":
|
46
|
+
if スイッチがHなら:
|
47
|
+
pc = label_table[arg]
|
48
|
+
|
49
|
+
|
50
|
+
```
|
51
|
+
|
52
|
+
あとはメインループを回せば良いです。
|
53
|
+
```
|
54
|
+
pc = 0
|
55
|
+
while True:
|
56
|
+
exec_instruction(*instructions[pc])
|
57
|
+
pc += 1
|
58
|
+
```
|