robloxでassistant その28

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
インタープリタを書け。
１から１００まで、fizzbuzzを表示せよ。

# 方針
- 俺cpuアセンブラで書く。
- stack machine
- １から１０まで、fizzbuzz表示
```
0
set_a
:loop
1
get_a
+
dup
set_a
101
>
if :skip3
get_a
15
%
if :skip0
;FizzBuzz
out
jp :loop
:skip0
get_a
5
%
if :skip1
;Buzz
out
jp :loop
:skip1
get_a
3
%
if :skip2
;Fizz
out
jp :loop
:skip2
get_a
out
jp :loop
:skip3
end
```
;fizzbuzzは、stackに積む。
%は、剰余
jp :loopは、:loopに飛ぶ。
set_aは、レジスタaに、セットする。
get_aは、レジスタaから読み込む。
:loopは、ラベル
if :loopは、真なら、ラベル:loopに飛ぶ。
dupは、コピー、複製を作る。
outは、数値表示。
数値は、stackに積む。
+-/*は、加減乗除。
endは、終了。

# サンプルコード

```

local player = game.Players.LocalPlayer
local PlayerGui = player:WaitForChild("PlayerGui")
local gui = PlayerGui:WaitForChild("ScreenGui")


gui.TextButton.MouseButton1Click:Connect(function()
	local src = gui.TextBox.Text
	local stack = {}
	function stack.push(item)
		table.insert(stack, item) 
	end
	function stack.pop()
		return table.remove(stack)
	end
	local l
	local t1
	local t2
	local v
	local a = 0
	local s = 0
	local h = {}
	for l in string.gmatch(src, "[^\n]+") do 
		s += 1
		table.insert(h, l)
	end
	local pc = 1
	local j
	repeat
		l = h[pc]
		--print(l)
		if string.sub(l, 1, 1) == ";" then
			stack.push(string.sub(l, 2, 9))
			pc += 1
		elseif string.sub(l, 1, 1) == ":" then
			pc += 1
		elseif l == "dup" then
			t1 = stack.pop()
			stack.push(t1)
			stack.push(t1)
			pc += 1
		elseif l == "drop" then
			t1 = stack.pop()
			pc += 1
		elseif l == "set_a" then
			t1 = stack.pop()
			a = t1
			pc += 1
		elseif l == "get_a" then
			stack.push(a)
			pc += 1
		elseif l == "out" then
			t1 = stack.pop()
			print(t1)
			pc += 1
		elseif l == "%" then
			t1 = stack.pop()
			t2 = stack.pop()
			v = t2 % t1
			--print(v)
			stack.push(v)
			pc += 1
		elseif l == "+" then
			t1 = stack.pop()
			t2 = stack.pop()
			v = t2 + t1
			stack.push(v)
			pc += 1
		elseif l == "-" then
			t1 = stack.pop()
			t2 = stack.pop()
			v = t2 - t1
			stack.push(v)
			pc += 1
		elseif l == "/" then
			t1 = stack.pop()
			t2 = stack.pop()
			v = t2 / t1
			stack.push(v)
			pc += 1
		elseif l == "*" then
			t1 = stack.pop()
			t2 = stack.pop()
			v = t2 * t1
			stack.push(v)
			pc += 1
		elseif l == ">" then
			t1 = tonumber(stack.pop())
			t2 = tonumber(stack.pop())
			if t2 > t1 then
				stack.push(1)
			else
				stack.push(0)
			end
			pc += 1
		elseif l == "<" then
			t1 = tonumber(stack.pop())
			t2 = tonumber(stack.pop())
			if t2 < t1 then
				stack.push(1)
			else
				stack.push(0)
			end
			pc += 1
		elseif l == "end" then
			pc = 300
		elseif string.sub(l, 1, 2) == "if" then
			local p = string.sub(l, 4, 9)
			t1 = stack.pop()
			--print(p)
			--print(t1)
			t1 = tonumber(t1)
			if t1 > 0 then
				for j = 1, s do
					if h[j] == p then
						pc = j
						--print(pc)
					end
				end
			else
				pc += 1
			end			
		elseif string.sub(l, 1, 2) == "jp" then
			local p = string.sub(l, 4, 9)
			--t1 = tonumber(stack.pop())
			for j = 1, s do
				if h[j] == p then
					pc = j
				end
			end
		else
			stack.push(l)
			pc += 1
		end
	until pc > 200
	print("ok")
end)





```

# 実行結果

```
10:30:40.595  1  -  クライアント - LocalScript:54
  10:30:40.596  2  -  クライアント - LocalScript:54
  10:30:40.596  Fizz  -  クライアント - LocalScript:54
  10:30:40.596  4  -  クライアント - LocalScript:54
  10:30:40.597  Buzz  -  クライアント - LocalScript:54
  10:30:40.597  Fizz  -  クライアント - LocalScript:54
  10:30:40.598  7  -  クライアント - LocalScript:54
  10:30:40.598  8  -  クライアント - LocalScript:54
  10:30:40.598  Fizz  -  クライアント - LocalScript:54
  10:30:40.599  Buzz  -  クライアント - LocalScript:54
  10:30:40.599  11  -  クライアント - LocalScript:54
  10:30:40.599  Fizz  -  クライアント - LocalScript:54
  10:30:40.600  13  -  クライアント - LocalScript:54
  10:30:40.600  14  -  クライアント - LocalScript:54
  10:30:40.600  FizzBuzz  -  クライアント - LocalScript:54
  10:30:40.601  16  -  クライアント - LocalScript:54
  10:30:40.601  17  -  クライアント - LocalScript:54
  10:30:40.602  Fizz  -  クライアント - LocalScript:54
  10:30:40.602  19  -  クライアント - LocalScript:54
  10:30:40.602  Buzz  -  クライアント - LocalScript:54
  10:30:40.603  Fizz  -  クライアント - LocalScript:54
  10:30:40.603  22  -  クライアント - LocalScript:54
  10:30:40.604  23  -  クライアント - LocalScript:54
  10:30:40.604  Fizz  -  クライアント - LocalScript:54
  10:30:40.605  Buzz  -  クライアント - LocalScript:54
  10:30:40.605  26  -  クライアント - LocalScript:54
  10:30:40.605  Fizz  -  クライアント - LocalScript:54
  10:30:40.606  28  -  クライアント - LocalScript:54
  10:30:40.606  29  -  クライアント - LocalScript:54
  10:30:40.606  FizzBuzz  -  クライアント - LocalScript:54
  10:30:40.607  31  -  クライアント - LocalScript:54
  10:30:40.607  32  -  クライアント - LocalScript:54
  10:30:40.608  Fizz  -  クライアント - LocalScript:54
  10:30:40.608  34  -  クライアント - LocalScript:54
  10:30:40.608  Buzz  -  クライアント - LocalScript:54
  10:30:40.609  Fizz  -  クライアント - LocalScript:54
  10:30:40.609  37  -  クライアント - LocalScript:54
  10:30:40.609  38  -  クライアント - LocalScript:54
  10:30:40.610  Fizz  -  クライアント - LocalScript:54
  10:30:40.610  Buzz  -  クライアント - LocalScript:54
  10:30:40.610  41  -  クライアント - LocalScript:54
  10:30:40.611  Fizz  -  クライアント - LocalScript:54
  10:30:40.611  43  -  クライアント - LocalScript:54
  10:30:40.611  44  -  クライアント - LocalScript:54
  10:30:40.612  FizzBuzz  -  クライアント - LocalScript:54
  10:30:40.612  46  -  クライアント - LocalScript:54
  10:30:40.613  47  -  クライアント - LocalScript:54
  10:30:40.613  Fizz  -  クライアント - LocalScript:54
  10:30:40.613  49  -  クライアント - LocalScript:54
  10:30:40.614  Buzz  -  クライアント - LocalScript:54
  10:30:40.614  Fizz  -  クライアント - LocalScript:54
  10:30:40.614  52  -  クライアント - LocalScript:54
  10:30:40.615  53  -  クライアント - LocalScript:54
  10:30:40.615  Fizz  -  クライアント - LocalScript:54
  10:30:40.615  Buzz  -  クライアント - LocalScript:54
  10:30:40.616  56  -  クライアント - LocalScript:54
  10:30:40.616  Fizz  -  クライアント - LocalScript:54
  10:30:40.617  58  -  クライアント - LocalScript:54
  10:30:40.617  59  -  クライアント - LocalScript:54
  10:30:40.617  FizzBuzz  -  クライアント - LocalScript:54
  10:30:40.618  61  -  クライアント - LocalScript:54
  10:30:40.618  62  -  クライアント - LocalScript:54
  10:30:40.618  Fizz  -  クライアント - LocalScript:54
  10:30:40.619  64  -  クライアント - LocalScript:54
  10:30:40.619  Buzz  -  クライアント - LocalScript:54
  10:30:40.619  Fizz  -  クライアント - LocalScript:54
  10:30:40.620  67  -  クライアント - LocalScript:54
  10:30:40.620  68  -  クライアント - LocalScript:54
  10:30:40.620  Fizz  -  クライアント - LocalScript:54
  10:30:40.621  Buzz  -  クライアント - LocalScript:54
  10:30:40.621  71  -  クライアント - LocalScript:54
  10:30:40.621  Fizz  -  クライアント - LocalScript:54
  10:30:40.622  73  -  クライアント - LocalScript:54
  10:30:40.622  74  -  クライアント - LocalScript:54
  10:30:40.622  FizzBuzz  -  クライアント - LocalScript:54
  10:30:40.623  76  -  クライアント - LocalScript:54
  10:30:40.623  77  -  クライアント - LocalScript:54
  10:30:40.623  Fizz  -  クライアント - LocalScript:54
  10:30:40.624  79  -  クライアント - LocalScript:54
  10:30:40.624  Buzz  -  クライアント - LocalScript:54
  10:30:40.624  Fizz  -  クライアント - LocalScript:54
  10:30:40.625  82  -  クライアント - LocalScript:54
  10:30:40.625  83  -  クライアント - LocalScript:54
  10:30:40.626  Fizz  -  クライアント - LocalScript:54
  10:30:40.626  Buzz  -  クライアント - LocalScript:54
  10:30:40.626  86  -  クライアント - LocalScript:54
  10:30:40.627  Fizz  -  クライアント - LocalScript:54
  10:30:40.628  88  -  クライアント - LocalScript:54
  10:30:40.628  89  -  クライアント - LocalScript:54
  10:30:40.628  FizzBuzz  -  クライアント - LocalScript:54
  10:30:40.629  91  -  クライアント - LocalScript:54
  10:30:40.629  92  -  クライアント - LocalScript:54
  10:30:40.629  Fizz  -  クライアント - LocalScript:54
  10:30:40.630  94  -  クライアント - LocalScript:54
  10:30:40.630  Buzz  -  クライアント - LocalScript:54
  10:30:40.630  Fizz  -  クライアント - LocalScript:54
  10:30:40.631  97  -  クライアント - LocalScript:54
  10:30:40.631  98  -  クライアント - LocalScript:54
  10:30:40.632  Fizz  -  クライアント - LocalScript:54
  10:30:40.632  Buzz  -  クライアント - LocalScript:54
  10:30:40.633  101  -  クライアント - LocalScript:54
  10:30:40.633  ok  -  クライアント - LocalScript:136
```

以上。