灰灰的Mython

灰灰的Mython

本题细节较多,请格外注意粗体字!!!

劝退

题目描述

灰灰受了CEC-IDE的启发,打算开发自己的自主研发,守正创新的Mython语言。
为方便广大Python玩家,Mython遵守Python语法(这不代表我们是抄袭,你说鸿蒙兼容apk...呃算了)
但是灰灰的能力有限,不能完全复刻一个CPython或者Jython(其实他就是不会fork仓库)
现在请你来实现,以下功能:

  1. # xxxxx 注释语句,#后面的内容忽视掉(保证注释独占一行,即无这样的语句:a += b # 将a加上b
  2. print() 打印函数,接受一个任意类型的参数(可以是数字、字符串或前文已定义的变量),无返回值。 打印完毕后,会自动换行
  3. input() 获取输入,无参数,返回输入的内容(一整行)
  4. a = xx 赋值语句,将xx赋值给axx可能是数字、字符串或前文已定义的变量,a可以是新的变量也可以是前文定义过的变量
  5. a += ba -= ba *= ba /= b 其中ab可能是数字、字符串或前文已定义的变量(字符串只能做+运算,表示拼接两个字符串),a可以与b相同
  6. a = b+ca = b-ca = b*ca = b/c
  7. if a == b:if a != b: 判断语句,其中ab只能是数字、字符串或前文已定义的变量,不可能是算式或其他表达式(即不存在这样的语句:if a\b != c:)。if语句块中的代码都使用缩进区分
  8. def FunctionName(a, b, c): 定义函数语句,FunctionName为函数名,参数使用,隔开,若无参数则括号里面为空。函数里面的内容使用缩进区分,例如

    def foo(a):
        print(a)
        a += input()
        print(a)
    

    调用时:

    foo(1919810)
    

    注意函数中会存在return语句,格式如下

    def foo(a):
        print(a)
        a += input()
        b = foo2(a)
        return b
    

    注意

    • return后面的语句不会被执行
    • return 后面跟一个变量或数字或字符串,不可以返回多个对象组成tuple(因为Mython里不存在tuple这个东西)
    • return 也可以返回一个类或者函数 比如:
    def foo1(a):
        print("foo1")
        print(a)
    def foo2():
        return foo1
    foo2()("foo2")
    

    执行结果为

    foo1
    foo2
    
  9. class ClassName(BaseClass): 定义一个类,名字为ClassName,基于BaseClass(如果没有基类就为class ClassName:,基类只能是上文定义过的类)。类里面的内容使用一个缩进区分,类中可以直接使用赋值语句,例如

    class Foo1:
        a = "aaa"
        b = 123
    

    也可以使用函数定义语句,例如

    class Foo2(Foo1):
        def __init__(self, b):
            # 注意类中的方法必须接受至少一个参数,接受的第一个参数为self,指类本身
            # 保证self.x调用的属性和方法都已经在上文或基类中定义过
            self.b = b
        def printf(self):
            print(self.a)
            print(self.b)
    

    调用时:

    b = 114514
    
    # 先实例化一个类
    foo = Foo2(b)
    # 如果该类的`__init__`方法有参数(除self之外),那么在Foo2后面的括号中也应该传入对应参数
    
    # 调用类中的方法
    foo.printf()
    # 传参方式与函数传参一样
    
    # 调用类中的属性
    qwq = foo.a
    print(qwq)
    

    内置类:

    • str(a) 强制类型转换为str,接受一个参数,将其转换为str类型
    • int(a) 强制类型转换为int,接受一个参数,将其转换为int类型

注意

  • 类中不会出现嵌套类,也不会出现空的类
  • 函数中不会出现嵌套函数,也不会出现空的函数
  • if代码块中不会出现类和函数的定义,也不会出现无任何语句的if代码块
  • 给出的Mython代码无空行
  • 上文所有提到的数字、字符串或前文已定义的变量,也不会出现f(input(), foo2.exec())这样的情况,但f(foo3.val)是合法的
  • input()读入的数据默认是字符串类型,需要手动强制类型转换,比如

    a = input()
    print(a)
    a = int(a)
    print(a)
    # 此时输入1,第一次打印的a是str类型,第二次是int类型
    # 但是虽然类型不同,输出的结果是两行1,不带引号
    
  • 保证给出的代码不会产生错误

输入输出格式

输入格式

第一行两个整数\(N, M\),分别表示Mython代码行数和标准输入的行数
接下来的\(N\)行,是Mython格式的代码。 注意,变量名区分大小写,代码格式为上述的格式,该有的空格都会有,比如f(a, b),后面有空格
再接下来的\(M\)行,表示标准输入,input()函数一次会获取一整行标准输入

输出格式

执行结果

样例

输入

20 1
a = input()
a = int(a)
b = 1919810
if a == 1:
    b = 114514
class HOMOData():
    a = 0
    b = 0
class HOMO(HOMOData):
    def __init__(self, _a, _b):
        self.a = _a
        self.b = _b
    def add(self):
        self.a += b
    def printf(self):
        print(self.a)
        print(self.b)
homo = HOMO(a, b)
homo.add()
homo.printf()
1

输出

114515
114514

数据约束

对于\(100\%\)的数据,保证\(1 \leqslant N \leqslant 50\)
有\(20\%\)的数据保证只有题面里的1, 2, 3, 4, 5这五种语句
只有一个测试点中出现了return function(返回函数)的情况
有\(20\%\)的数据保证其中定义的类无基类(即class ClassName():

保证所有数字类型的变量的大小都在int范围以内,且运算过程中不会出现溢出
给出的Mython代码和标准输入中,不会出现中文等除英文外的其他语言
考虑到Mython的执行效率比CPython还低,本题所有测试点的时间限制都为3s

提示:Python可以直接使用exec切,但请不要使用exec水AC率

信息

ID
1034
难度
9
分类
模拟 点击显示
标签
递交数
7
已通过
2
通过率
29%
上传者

相关

在下列训练计划中:

灰灰的通天塔 | Huihui‘s Babel