验证程序

验证程序的作用是检查用户的程序输出的答案是否正确。目前系统支持的验证程序有以下几种：

- 字符串比较：直接用标准答案与用户输出的答案进行字符串比较，只有当用户输出的答案中的全部内容（包括回车和空格等字符）与标准答案完全一致时，才认为用户的程序正确。

- 字符串比较，支持 PE 错误：用标准答案与用户输出的答案进行字符串比较，如果完全一致则输出 AC，如果答案中数字的部分是一致的则输出 PE，否则输出 WA。

- 比较文件尺寸和校验码：这种验证方法用于那些要求用户写文件的情况。使用这种校验方法时，每一个测试用例的“期待的输出”应当是每一个要输出的文件的文件名、尺寸和 MD5 校验码，如：

      one.bmp 150 74deae71e8ca1378dafe56ebe83c2d29
      two.bmp 150 4877675b19d2e1b339f3b46472d765d2

  验证程序会查看用户是否输出了要求的文件，并检查文件的尺寸和 MD5 校验码是否与要求的相同。如果完全一致，则判为 AC，否则为 WA，并将错误记录在“测试输出”中。

- 自定义的验证脚本：除了上述的判分方法，教师还可以用自己习惯的语言编写验证程序，检查用户提交的程序是否正确。对于那些标准答案不唯一的情况，这种验证脚本是必须的。

  在执行验证程序时，评测系统会在命令行上传递三个参数给验证程序。这三个参数是三个文件名，分别指向存储着测试用例的输入、期待的输出和用户程序实际输出的文件。验证程序可以读取这些文件，并计算出用户程序的实际输出是否正确。

  如果程序的实际输出正确，则验证程序应当在标准输出流上输出“AC”，如果仅仅是格式错误可以输出“PE”，否则输出“WA”。

  下面是一个简单的验证程序，它比较测试用例的输入和用户的实际输出是否相同：

      import sys

      fin = file(sys.argv[1], 'r')
      frst = file(sys.argv[3], 'r')
      in = fin.readlines()
      rst = frst.readlines()
      fin.close()
      frst.close()

      print 'AC' if in == rst else 'WA'