paiza.ioでnadesiko その18

# 概要
paiza.ioでnadesikoやってみた。
練習問題、やってみた。

# 練習問題
俺cpuのアセンブラが動く、インタープリターを書け。
九九を実行せよ。

# サンプルコード

```

sp = 0
stack = [0]
lines = []
a = 0
b = 0
c = 0
pc = 1

●add
    stack[sp - 1] = stack[sp - 1] + stack[sp]
    sp = sp - 1
    pc = pc + 1
ここまで

●sub
    stack[sp - 1] = stack[sp - 1] - stack[sp]
    sp = sp - 1
    pc = pc + 1
ここまで

●mul
    stack[sp - 1] = stack[sp - 1] * stack[sp]
    sp = sp - 1
    pc = pc + 1
ここまで

●div
    stack[sp - 1] = stack[sp - 1] / stack[sp]
    sp = sp - 1
    pc = pc + 1
ここまで

●gt
    stack[sp - 1] = stack[sp - 1] > stack[sp]
    sp = sp - 1
    pc = pc + 1
ここまで

●eq
    stack[sp - 1] = stack[sp - 1] != stack[sp]
    sp = sp - 1
    pc = pc + 1
ここまで

●rem
    stack[sp - 1] = stack[sp - 1] % stack[sp]
    sp = sp - 1
    pc = pc + 1
ここまで

●dup
    sp = sp + 1
    stack[sp] = stack[sp - 1]
    pc = pc + 1
ここまで

●drop
    sp = sp - 1
    pc = pc + 1
ここまで

●out3
    FLOOR(stack[sp] / 100)を継続表示 
    pc = pc + 1
ここまで

●out2
    (FLOOR(stack[sp] / 10) % 10)を継続表示
    pc = pc + 1
ここまで

●out1
    stack[sp] % 10を継続表示
    pc = pc + 1
ここまで

●out
    CHR(stack[sp])を継続表示
    pc = pc + 1
    sp = sp - 1
ここまで

●(aを)if_
    もし、stack[sp]ならば
        pc = aで番地取得
    違えば
        pc = pc + 1
    ここまで
    sp = sp - 1
ここまで

●(aを)jmp
    pc = aで番地取得
ここまで

●rnd
    sp = sp + 1
    stack[sp] = ２５５の乱数
    pc = pc + 1
ここまで

●(vを)set   
    もし、vが「a」ならば
        a = stack[sp]
    違えばもし、vが「b」ならば
        b = stack[sp]
    違えば
        c = stack[sp]
    ここまで
    sp = sp - 1
    pc = pc + 1
ここまで

●(vを)get
    sp = sp + 1
    もし、vが「a」ならば
        stack[sp] = a
    違えばもし、vが「b」ならば
        stack[sp] = b
    違えば
        stack[sp] = c
    ここまで
    pc = pc + 1
ここまで

●(vを)push
    sp = sp + 1
    stack[sp] = TOINT(v)
    pc = pc + 1
ここまで

●（vで）番地取得
    d = 0
    iを0から linesの配列要素数-1まで繰り返す
        もし、(lines[i]で0からvを文字検索)=1ならば
            d = i + 1
        ここまで
    ここまで
    dを戻す。
ここまで

●（vを）行実行
    vを行取得
    //それを表示
    それは、それを「  」で区切る
    もし、それ[1]が「+」ならば
        add
    違えばもし、それ[1]が「-」ならば
        sub
    違えばもし、それ[1]が「*」ならば
        mul
    違えばもし、それ[1]が「/」ならば
        div
    違えばもし、それ[1]が「dup」ならば
        dup
    違えばもし、それ[1]が「drop」ならば
        drop
    違えばもし、それ[1]が「set」ならば
        それ[2]をset
    違えばもし、それ[1]が「get」ならば
        それ[2]をget
    違えばもし、それ[1]が「rnd」ならば
        rnd
    違えばもし、それ[1]が「>」ならば
        gt
    違えばもし、それ[1]が「=」ならば
        eq
    違えばもし、それ[1]が「if」ならば
        それ[2]をif_
    違えばもし、それ[1]が「out3」ならば
        out3
    違えばもし、それ[1]が「out2」ならば
        out2
    違えばもし、それ[1]が「out1」ならば
        out1
    違えばもし、それ[1]が「out」ならば
        out
    違えばもし、それ[1]が「%」ならば
        rem
    違えばもし、それ[1]が「jmp」ならば
        それ[2]をjmp
    違えば
        それ[1]をpush
    ここまで
    //pcを表示
    もし、pc < 34 ならば
        pcを行実行
    ここまで
ここまで

●（Sを）実行
    lines = Sを「{改行}」で区切る
    1を行実行
    「end」を表示
ここまで

●（vを）行取得
    lines[v - 1]を戻す。
ここまで

「  1
  set  a
  1
  set  b
loop  get  a
  get  b
  *
  out3
  out2
  out1
  drop
  32
  out
  get  a
  1
  +
  set  a
  10
  get  a
  >
  if  loop
  10
  out
  get  b
  1
  +
  set  b
  1
  set  a
  10
  get  b
  >
  if  loop
lup  jmp  lup
」を実行



```

# 実行結果

```
001 002 003 004 005 006 007 008 009 
002 004 006 008 010 012 014 016 018 
003 006 009 012 015 018 021 024 027 
004 008 012 016 020 024 028 032 036 
005 010 015 020 025 030 035 040 045 
006 012 018 024 030 036 042 048 054 
007 014 021 028 035 042 049 056 063 
008 016 024 032 040 048 056 064 072 
009 018 027 036 045 054 063 072 081 
end
```

# 成果物

https://paiza.io/projects/Aa0fI9Uz09jLlERm25HXGA

以上。