paiza.ioでpython その7

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

# 練習問題
俺言語仕様のインタープリタを実装せよ。
九九を実行せよ。


# 俺言語の仕様

　行番号、スペース、ステートメントの順
　代入文しか無い。
　数値は、０から２５５。
　行番号なしで、ダイレクト実行できる。
　行番号は、１から２５５。
　メモリは２５６バイト。
　ラインエディタあり。アペンド、インサート、ディル
　演算子は、+, -, /, *, %の5個。
　変数は、a,b,cの三個。

|コマンド|　意味|
|:--|:--|
|0|ソース表示|
|30|行３０が消える|
|a=9|変数aに９を代入|
|?=$|乱数表示|
|#=1|行番号１から実行|
|?="ok"|OK表示|
|#=120|１２０行へジャンプ|
|#=a<10*120|条件分岐、もし a<10 ならば 120行へジャンプ|
|a=2+3*5|(2+3)*5で２５が変数aへ代入。|
|?=!|改行|

# 九九のソースコード


```

10 a=1
20 b=1
30 ?=a*b
40 ?=" "
50 a=a+1
60 #=a<10*30
70 b=b+1
80 ?="   "
90  a=1
100  #=b<10*30
110  #=300

```

# サンプルコード

```
import random
Ram = []
Lbf = 237
Bnd = 234
PC = 235
Ptr = 0
Cur = 0
Adr = 0
Adr2 = 0
Val = 0
C = 0

def crlf():
   print()

def put(b):
   print(b, end = " ")

def putchar(b):
   c = chr(b)
   print(c, end = "")

def putl(pt, d):
   while READB(pt) != d:
      putchar(READB(pt))
      pt = pt + 1
   return pt

def putlp(d):
   global Ptr
   while READB(Ptr) != d:
      putchar(READB(Ptr))
      Ptr = Ptr + 1

def nxtln(pt):
   while READB(pt) != ord('\0'):
      pt = pt + 1
   pt = pt + 1
   return pt

def fndln():
   global Bnd, PC, Cur
   Cur = 0
   while Cur != READB(Bnd):
      if READB(Cur) == READB(PC):
         return True
      Cur = nxtln(Cur)
   return False

def fndln2():
   global Bnd, PC, Cur
   Cur = 0
   while Cur != READB(Bnd):
      if READB(Cur) > READB(PC):
         return True
      Cur = nxtln(Cur)
   return False

def WRITEB(adr, data):
   global Ram
   Ram[adr] = data

def READB(adr):
   global Ram
   v = Ram[adr]
   return v

def num():
   global Ptr
   if (48 <= READB(Ptr)) and (READB(Ptr) <= 57):
      return True
   else:
      return False

def getnm():
   global Ptr, Val
   if not(num()):
      return False
   n = 0
   while (num()):
      n *= 10
      ch = READB(Ptr)
      Ptr = Ptr + 1
      n += (ch - 48)
   Val = n
   return True

def getvr():
   global Ptr, Adr, PC, C
   C = READB(Ptr)
   if C == ord('a'):
      Adr = 230
   elif C == ord('#'):
      Adr = PC
   elif C == ord('b'):
      Adr = 231
   elif C == ord('c'):
      Adr = 232
   else:
      Adr = 230

def getvr2():
   global Ptr, Adr2, PC
   cc = READB(Ptr)
   if cc == ord('a'):
      Adr2 = 230
   elif cc == ord('#'):
      Adr2 = PC
   elif cc == ord('b'):
      Adr2 = 231
   elif cc == ord('c'):
      Adr2 = 232
   else:
      Adr2 = 230

def term():
   global Ptr, Val
   cc = READB(Ptr)
   val2 = Val
   Ptr = Ptr + 1
   factr()
   if cc == ord('*'):
      Val = val2 * Val
   elif cc == ord('+'):
      Val = val2 + Val
   elif cc == ord('-'):
      Val = val2 - Val
   elif cc == ord('/'):
      Val = val2 / Val
   elif cc == ord('%'):
      Val = val2 % Val
   elif cc == ord('='):
      if (val2 == Val):
         Val = 1
      else:
         Val = 0
   elif cc == ord('>'):
      if (val2 >= Val):
         Val = 1
      else:
         Val = 0
   else:
      if (val2 < Val):
         Val = 1
      else:
         Val = 0

def factr():
   global Ptr, Val, Adr2
   if READB(Ptr) == ord('\0'):
      Val = 0
      return
   if getnm():
      return
   cc = READB(Ptr)
   if cc == ord('$'):
      r = random.random()
      Val = int(r * 10)
      Ptr = Ptr + 1
   else:
      getvr2()
      Val = READB(Adr2)
      Ptr = Ptr + 1

def expr():
   global Ptr
   factr()# getval
   cc = READB(Ptr)
   while cc != ord('\0'):
      term()# enzan
      cc = READB(Ptr)
   Ptr = Ptr + 1

def ordr():
   global Ptr, Val, C, Adr
   getvr()# hidari
   Ptr = Ptr + 2
   if READB(Ptr) == ord('"'):
      Ptr = Ptr + 1
      putlp(ord('"'))
   elif READB(Ptr) == ord('!'):
      print()
   else:
      expr()# migi
      if C == ord('?'):
         put(Val)# print
      else:
         WRITEB(Adr, Val)# dainyuu

def run():
   global Bnd, Ptr, Lbf, Cur, PC, Ram
   for i in range(256):
      Ram.append(0)
   WRITEB(Bnd, 0)
   print("oregengo v1.0")
   while True:
      str = input("\n>")
      Ptr = Lbf
      for j in str:
         WRITEB(Ptr, ord(j))
         Ptr = Ptr + 1
      WRITEB(Ptr, ord('\0'))
      ima = 0
      Ptr = Lbf
      if not(getnm()):# dairect
         while True: 
            ima = READB(PC)
            #print(ima)
            ordr()# siki hyouka
            if READB(PC) == 0 and ima == 0:
                break
            else:
                if READB(PC) == 0:
                    WRITEB(PC, ima)
                if READB(PC) == 1:
                    ima = 1
                if READB(PC) == 300:
                    quit()
                if READB(PC) == ima:
                    if fndln2():
                        WRITEB(PC, READB(Cur))
                        Ptr = Cur + 2
                    else:
                        break
                else:
                    if fndln():
                        WRITEB(PC, READB(Cur))
                        Ptr = Cur + 2
                    else:
                        break
                        
      else:
         if Val == 0:
            print("#list")
            pt = 0
            while pt < READB(Bnd):
               put(READB(pt))
               pt = pt + 1
               pt = putl(pt, ord('\0'))
               crlf()
               pt = pt + 1
         else:# del insert append
            f = 0
            WRITEB(PC, Val)
            if fndln(): 
               print("#del")
               src = nxtln(Cur)
               dst = Cur
               while src != READB(Bnd):
                  WRITEB(dst, READB(src))
                  dst = dst + 1
                  src = src + 1
               WRITEB(Bnd, dst)
            if fndln2():
               f = 1
            src = READB(Bnd)
            m = 2
            h = Ptr
            while READB(h) != ord('\0'):
               m = m + 1
               h = h + 1
            if m > 2:
               WRITEB(Bnd, (src + m))
               if f == 1: 
                  print("#insert")
                  dst = READB(Bnd)
                  while src != Cur:
                     WRITEB(dst, READB(src))
                     dst = dst - 1
                     src = src - 1
                  WRITEB(dst, READB(src))
                  src = Cur
               WRITEB(src, Val) 
               print("#append")
               src = src + 1
               for k in range(m - 1):
                  WRITEB(src, READB(Ptr))
                  Ptr = Ptr + 1
                  src = src + 1

run()





```

# 実行結果

```
oregengo v1.0

>#append

>#append

>#append

>#append

>#del
#insert
#append

>#del
#insert
#append

>#del
#append

>#append

>#append

>#append

>#append

>#append

>#append

>#append

>#append

>#list
10  a=1
20  b=1
30  c=a*b
40  ?=c
50  ?=" "
60  a=a+1
70  #=a<10*30
80  ?="   "
90  b=b+1
100  a=1
110  #=b<10*30
120  #=300

>1  2  3  4  5  6  7  8  9     2  4  6  8  10  12  14  16  18     3  6  9  12  15  18  21  24  27     4  8  12  16  20  24  28  32  36     5  10  15  20  25  30  35  40  45     6  12  18  24  30  36  42  48  54     7  14  21  28  35  42  49  56  63     8  16  24  32  40  48  56  64  72     9  18  27  36  45  54  63  72  81     
```

# 成果物

https://paiza.io/projects/qRqfGrMJpv6hHo8yvlX53w


以上。