0

在进行竞争性编程时,我将每个问题都放在一个包含测试和解决方案的独立目录中,类似于以下内容:

problem_a/
  tests/
    default.in default.out
  main.c

我还喜欢能够编译解决方案(始终是单个文件)并通过向其提供输入文件并通过简单的命令行命令将结果与输出文件进行比较来运行它。我通常使用类似于以下内容的东西:

make main && (./main < tests/default.in | diff tests/default.out - ; rm main)

现在我希望能够在同一个目录中有多个解决方案(不同的编程语言)。例如,添加一个main.cpp. 但是,这与上述命令相冲突,因为make始终首选默认 C 规则而不是 CPP 规则。

最现实的解决方案是用额外的描述符对文件名进行后缀_c_cpp?我内心的纯粹主义者认为这是多余的,并希望有更好的方法,也许能够重新排序默认规则make

4

1 回答 1

0

我最终为解决方案创建了一个目录,以便在运行时make没有名称冲突:

problem_A/
  solutions/
    cpp/
      main.cpp
    ansi-c/
      main.c
  tests/
    default.in
    default.out

然后我编写了一个简单的脚本,以便能够一起构建和测试:

  3 BINFILE=./solutions/$1/main
  4 INFILE=./tests/$2.in
  5 OUTFILE=./tests/$2.out
  6 
  7 make $BINFILE && ($BINFILE < $INFILE | diff $OUTFILE - ; rm $BINFILE)

该脚本可以按如下方式运行:

cp-test ansi-c default

不是有史以来最优雅的解决方案,但它现在可以工作。任何其他建议都会很棒。

于 2013-09-07T23:49:41.103 回答