CSP考试由于是Linux评测系统,故使用windows参赛的选手避免不了出现系统之间的锅。

windows用户真得劲!

怎么办?还好官方给出NOI_Linux系统参赛。然而这篇Blog,会以Ubuntu系统进行演示(不用担心,Ubuntu和Linux除了界面不一样,实质和命令都是相同的)

Ubuntu上场了

Ubuntu编译指南

进入Ubuntu系统,在你想存的地址中新建一个空白文档,名称是可以随需要写,但是 名称一定要记得加.cpp后缀!

举个栗子: "A+B_Problem.cpp"

即刻,右键点击文件,打开方式——选择 "GNU Emacs 25(GUI)" 。点进去后,直接开始写代码就好了。我们之所以要用GNU Emacs 25(GUI)打开,是因为下文的配置适用于GNU Emacs 25(GUI),且个人感觉GNU Emacs 25(GUI)更好用。

比如:

#include<bits/stdc++.h>
using namespace std;
int a,b;
int main(){
    scanf("%d %d",&a,&b);
    printf("%lld",(long long)(a + b));
    puts("");
    return 0;
}

一定记得,每次打完代码,都要按Ctrl+x+s保存文件(不然一旦关机了......系统通常在你关闭未保存的文件时会提示你保存,点击yes即可)

为什么?

Ans:我们之后会讲到,当你需要运行文件时,要在终端先编译源代码,然后运行类似于windows中的.exe文件的a.out。然而,当你不保存源文件,之后的编译操作都只会编译未修改前的代码,故不管怎么改,输出都不会改变。

· 首先,将代码保存(请先确保能编译),并确保是否需要开文件(freopen)

· 然后,打开终端,输入文件所在路径,如当文件在桌面中的新建文件夹里面,则输入 "cd 桌面/新建文件夹"

· 这时,输入"g++ 代码名称.cpp",如"g++ check.cpp",此乃编译文件。若终端提示错误时,请回到程序修改Bug,并将步骤从“首先”二字重新开始。

· 然后,你会发现文件夹中多了一个"a.out",这时,在终端输入"./a.out",并输入样例,按回车,就可以得到输出了。当你的代码有文件时,请确保有输入文件,输出也会在输出文件中。

是不是很激动?

GNU Emacs 25(GUI)编译器配置优化

在windows中用Dev-C++用顺手了,用这个四不像的编译器真TM想骂人。

那么我们不妨来修改修改配置,让编译器更加清爽。

怎么修改配置呢

首先,点击文件,进入主文件夹(Home),按Ctrl+h显示所有文件,然后新建空白文档,文档名".emacs",在里面输入下面的东西,复制粘贴即可。

超级豪华顶级配置 (当你在家食用Ubuntu的时候,肯定希望配置越NB越好。)

(global-set-key [f9] 'compile-file)
(global-set-key [f10] 'gud-gdb)
(global-set-key (kbd "C-s") 'save-buffer)
(global-set-key (kbd "C-z") 'undo)
(global-set-key (kbd "RET") 'newline-and-indent)
(global-linum-mode t)
(show-paren-mode t)
(define-key key-translation-map (kbd "C-d") (kbd "M-p M-y"))    
(global-set-key (kbd "M-p M-y") 'kill-whole-line)
(define-key key-translation-map (kbd "C-a") (kbd "C-x h"))
(setq c-default-style "awk")
;;;上面是考场必备
(ido-mode t)

(setq default-frame-alist
             '((vertical-scroll-bars)
               (top . 25)
               (left . 45)
               (width . 120)
               (height . 40)
               (background-color . "grey15")
               (foreground-color . "grey")
               (cursor-color . "gold1")
               (mouse-color . "gold1")
               (tool-bar-lines . 0)
               (menu-bar-lines . 1)
               (scroll-bar-lines . 0)
               (right-fringe)
               (left-fringe)))

(global-hl-line-mode 1)

(set-face-background 'highlight "gray5")
(set-face-foreground 'region "cyan")
(set-face-background 'region "blue")
(set-face-foreground 'secondary-selection "skyblue")
(set-face-background 'secondary-selection "darkblue")

;;;;;设置org模式
(setq org-startup-indented t)
;(setq org-log-done 'time)
;(s.etq org-log-done 'note)
;

;;;无关紧要
(set-cursor-color "wheat")
(set-mouse-color "wheat")
(global-font-lock-mode t);;高亮
;;;;;设置编译信息
(defun compile-file ()
  (interactive)
  (compile (format "g++ -o %s %s -g -lm -Wall"  (file-name-sans-extension (buffer-name))(buffer-name))))
;;(global-set-key (kbd "<f9>") 'compile-file)
;;;;;设置F9一键调试
;;;;;改变emacs标题栏的标题
(setq frame-title-format "CJY-Dragon")
;;;;;允许emacs和外部其他程序的粘贴
(setq x-select-enable-clipboard t)
;; 显示列号
(setq column-number-mode t)
;;设置tab的宽度
(setq default-tab-width 4)
(setq c-basic-offset 4)
;;;;;启用时间显示设置(可能时间需要调整)
(display-time-mode 1)
;;;;;时间使用24小时制
(setq display-time-24hr-format t)
;;;;;时间显示包括日期和具体时间
(setq display-time-day-and-date t)
;;;;;时间的变化频率
(setq display-time-interval 10)
;;;;;是用滚轴鼠标
(mouse-wheel-mode t)
;;;;;备份设置
;;;;;emacs还有一个自动保存功能,默认在~/.emacs.d/auto-save-list里,这个非常有用,我这里没有改动,具体可以参见Sams teach yourself emacs in 24hours(我简称为sams24)
;;;;;备份设置方法,直接拷贝
(setq backup-by-copying t)
;; 自动存盘
(setq auto-save-mode t)
;;去警告铃声
(setq visible-bell nil)
(setq ring-bell-function 'ignore)
;;;;;指针取消闪动,不然眼睛会花了
(blink-cursor-mode -1)
;;;;;滚动页面时比较舒服,不要整页的滚动
(setq scroll-step 1
        scroll-margin 3
        scroll-conservatively 10000)
;;;;;设定删除保存记录为200,可以方便以后无限恢复
(setq kill-ring-max 200)
;;;;;修改透明度
(set-frame-parameter (selected-frame) 'alpha (list 85 50))
(add-to-list 'default-frame-alist (cons 'alpha (list 85 50)))
(setq-default cursor-type 'bar)

(show-paren-mode 1);;括号匹配
(fset 'yes-or-no-p 'y-or-n-p);;酱油的
(setq make-backup-files nil)
(global-auto-revert-mode t);自动reload文件

(global-set-key (kbd "<f8>") 'gdb-many-windows)

(custom-set-variables
 ;; custom-set-variables was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 '(blink-cursor-mode nil)
 '(column-number-mode t)
 '(cua-mode t nil (cua-base))
 '(display-time-mode t)
 '(inhibit-startup-screen t)
 '(show-paren-mode t))
(custom-set-faces
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 '(default ((t (:family "Ubuntu Mono" :foundry "unknown" :slant normal :weight normal :height 143 :width normal)))))
(auto-insert-mode)  ;;; Adds hook to find-files-hook
(setq auto-insert-directory "~/.emacs.d/mytemplates/") ;;; Or use custom, *NOTE* Trailing slash important
(setq auto-insert-query nil) ;;; If you don't want to be prompted before insertion
(define-auto-insert "\." "moban.cpp")

但是这个配置在考场上又不能复制粘贴,这么一大段,也被不下来吧

考场易记高级配置

(set-background-color "gray15")
(set-foreground-color "gray")

(global-set-key [f9] 'compile)
(global-set-key [f10] 'gud-gdb)
(global-set-key (kbd "C-s") 'save-buffer)
(global-set-key (kbd "C-a") 'mark-whole-buffer)
(global-set-key (kbd "RET") 'newline-and-indent)

(setq default-cursor-type 'bar)
(setq default-tab-width 4)
(setq c-default-style "awk")

(set-frame-parameter (selected-frame) 'alpha (list 85 50))

粘贴完之后呢

保存,关闭即可。这时候再用GNU Emacs 25(GUI)打开你任意一个程序

哇,爽爆了

修改配置的好处都有啥?

~谁说对了就给他~

御·Dragon的感受如下

  1. F9一键编译,可以避免在终端g++时编译错误又返回而浪费时间。
  2. F10一键运行,不用到终端去了
  3. 编译器透明,(需要超级豪华顶级配置),要看题面、数据时不用总是切屏
  4. 页面及其清爽

@Karry5307 大神给出了一些别的界面优化

Ubuntu对拍帮手

对拍是什么?

这里我不细说。

就是两个源程序,一个对拍程序,随机一组数据比较两个源程序的输出一不一样

Ubuntu的对拍怎么弄?

注意:对拍一定要开文件!

我们这里一共需要 4 个程序,分别是"data.cpp"、"my.cpp"、 "text.cpp"、"check.sh"

(重点) 在每次修改完后、对拍前,请先进入"my.cpp"、"text.cpp"与"data.cpp"进行编译,否则新的对拍只会测试修改前的代码,使得答案不改变!

"data.cpp"为数据生成程序,随题目需要求改

我们还是拿A+B举例子,A+B的随机数据代码如下

#include<bits/stdc++.h>
using namespace std;

const long long MOD=1e18;

int main()
{
    freopen("input.in","w",stdout);//input.in是对拍当前输入数据的文件
    srand(time(NULL));//这个地方很重要,保证了你每次随机出来的数不一样
    int a,b;
    a = rand()%100000000;//随机数
    b = rand()%100000000;//随机数
    printf("%d %d",a,b);
    return 0;
}

"my.cpp"为 自己写的 程序(即正确性需要对拍验证的程序)

#include<bits/stdc++.h>
using namespace std;
int a,b;
int main(){
    freopen("input.in","r",stdin);
    freopen("my.out","w",stdout);
    scanf("%d %d",&a,&b);
    printf("%lld",(long long)(a + b - 1));
    puts("");
    return 0;
}

"text.cpp"为与你自己程序 对拍的程序 (如题解、暴力等)

#include<bits/stdc++.h>
using namespace std;
int a,b;
int main(){
    freopen("input.in","r",stdin);
    freopen("text.out","w",stdout);
    scanf("%d %d",&a,&b);
    printf("%lld",(long long)(a + b - 1));
    puts("");
    return 0;
}

"check.sh"为对拍程序

在check.sh中输入(推荐使用emacsGUI编译)

#!bin/bash
while true; do
./data
./my
./text
if diff my.out text.out; then
echo AC
else
echo WA
exit 0
fi
done

以上全部保存到文件里面即可。

然后在终端输入在终端输入

bash ./check.sh

即可运行进行对拍

百度网盘对拍压缩包(A+B-Problem为例)链接: https://pan.baidu.com/s/12uajVLSgfZt7DbkUAVrgDg 提取码: dhe5

今天就到这吧,还有什么没有提及的,欢迎来de!

0 条评论

目前还没有评论...