概要
vbsの作法、調べてみた。
練習問題やってみた。
練習問題
俺言語インタープリタを書け。
fizzbuzzを解け。
投入したソースの説明
俺言語は、行番号があるBASIC系言語です。
VBSのevalを利用するため、改変してます。
10 a=0 ; a <= 0
20 a=a+1 ; a <= a + 1
30 #=iif(a>100,400) ; if (a > 199) goto 400
40 b=mo(a,15) ; b <= a % 15
50 #=iif(b=0,120) ; if (b == 0) goto 120
60 b=mo(a,5) ; b <= a % 5
70 #=iif(b=0,140) ; if (b == 0) goto 140
80 b=mo(a,3) ; b <= a % 3
90 #=iif(b=0,160) ; if (b == 0) goto 160
100 ?=a ; print a
110 #=20 ; goto 20
120 ?=fizzbuzz ; print "fizzbuzz"
130 #=20 ; goto 20
140 ?=buzz ; print "buzz"
150 #=20 ; goto 20
160 ?=fizz ; print "fizz"
170 #=20 ; goto 20
サンプルコード
Function mo(s, v)
mo = s mod v
End Function
Function iif(s, v)
Dim rtn
If s Then
rtn = Cint(v)
Else
rtn = 0
End If
iif = rtn
End Function
function jmp(c)
Dim d
d = eval(c)
if d > 0 then
pc = d
else
pc = pc + 10
end if
end function
function V_a(c)
a = eval(c)
pc = pc + 10
end function
function V_b(c)
b = eval(c)
pc = pc + 10
end function
function print(c)
if c = "a" then
WScript.StdOut.WriteLine a
else
WScript.StdOut.WriteLine c
end if
pc = pc + 10
end function
function gyou(n)
Dim line
For i = 0 to UBound(lines) - 1
line = SPLIT(lines(i), " ")
if CInt(line(0)) = n Then
gyou = lines(i)
end if
Next
end function
function run(n)
Dim line
Dim s
Dim m
Dim c
line = gyou(n)
s = SPLIT(line, " ")
m = left(s(1), 1)
c = mid(s(1), 3, 35)
if m = "#" then
jmp(c)
elseif m = "a" then
V_a(c)
elseif m = "b" then
V_b(c)
elseif m = "?" then
print(c)
else
msgbox c
pc = 400
end if
if pc < 300 then
run(pc)
end if
end function
Dim pc
Dim a
Dim b
pc = 0
a = 0
b = 0
Dim ore
ore = ""
ore = ore & "10 a=0" & vbCrLf
ore = ore & "20 a=a+1" & vbCrLf
ore = ore & "30 #=iif(a>100,400)" & vbCrLf
ore = ore & "40 b=mo(a,15)" & vbCrLf
ore = ore & "50 #=iif(b=0,120)" & vbCrLf
ore = ore & "60 b=mo(a,5)" & vbCrLf
ore = ore & "70 #=iif(b=0,140)" & vbCrLf
ore = ore & "80 b=mo(a,3)" & vbCrLf
ore = ore & "90 #=iif(b=0,160)" & vbCrLf
ore = ore & "100 ?=a" & vbCrLf
ore = ore & "110 #=20" & vbCrLf
ore = ore & "120 ?=fizzbuzz" & vbCrLf
ore = ore & "130 #=20" & vbCrLf
ore = ore & "140 ?=buzz" & vbCrLf
ore = ore & "150 #=20" & vbCrLf
ore = ore & "160 ?=fizz" & vbCrLf
ore = ore & "170 #=20" & vbCrLf
Dim SEP
SEP = vbCrLf
Dim lines
lines = SPLIT(ore, SEP)
pc = 10
run(pc)
WScript.StdOut.WriteLine 5 mod 5
実行結果
エラーで落ちます。再帰が、ダメなようです。
>cscript ore.vbs
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.
1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizzbuzz
16
17
fizz
19
buzz
fizz
22
23
fizz
buzz
26
fizz
28
29
fizzbuzz
31
32
fizz
34
buzz
fizz
37
38
fizz
buzz
41
fizz
43
44
fizzbuzz
46
47
fizz
49
buzz
fizz
52
53
fizz
buzz
56
fizz
58
59
fizzbuzz
C:\Users\ohisa\vbs\ore.vbs(27, 2) Microsoft VBScript 実行時エラー: スタック領域が不足しています。: 'eval'
以上。