pi picoでmicropython その36

# 概要
picoでmicropythonやってみた。
練習問題やってみた。

# 練習問題
俺言語インタープリタを拡張し、じゃんけんを実行せよ。

# 方針
```
a=?で、右項に?がきたら、数値入力。
b=$で、右項に$がきたら、乱数。
```

# じゃんけんのソースコード

```
10 ?="0:gu 1:choki 2:pa 3:end "
20 a=?
30 b=$
40 ?=b
50 #=a=3*300
60 #=a=b*100
70 #=a<b*120
80 ?="-> you no kati "
90 #=10
100 ?="-> aiko "
110 #=10
120 ?="-> you no make "
130 #=10
```

# サンプルコード

```
import random
import time
import sys
Ram = []
Lbf = 237
Bnd = 234
PC = 235
Ptr = 0
Cur = 0
Adr = 0
Adr2 = 0
Val = 0
C = 0
led = machine.Pin(25, machine.Pin.OUT)
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():# hidari
   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():# migi
   global Ptr, Val, Adr2
   if READB(Ptr) == ord('\0'):
      Val = 0
      return
   if getnm():
      return
   cc = READB(Ptr)
   if cc == ord('$'):# rnd
      r = random.random()
      Val = int(r * 10)
      Ptr = Ptr + 1
   elif cc == ord('?'):# input
      Val = int(input("?"))
      Ptr = Ptr + 1
   else:
      getvr2()
      Val = READB(Adr2)
      Ptr = Ptr + 1
def expr():# migi
   global Ptr
   factr()# getval
   cc = READB(Ptr)
   while cc != ord('\0'):
      term()# enzan
      cc = READB(Ptr)
   Ptr = Ptr + 1
def ordr():# siki hyouka
   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
      elif C == ord('l'):# led
         led.value(Val)
      elif C == ord('"'):# sleep
         time.sleep(Val)
      else:
         WRITEB(Adr, Val)# dainyuu
def run():
   global Bnd, Ptr, Lbf, Cur, PC, Ram
   for i in range(276):
      Ram.append(0)
   WRITEB(Bnd, 0)
   print("oregengo v1.2")
   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:
                  sys.exit()
               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()
```

# 実行結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/2223f919-a9f5-f535-68b2-8783df81437d.png)


以上。