Problem I: 源代码的格式
Time Limit: 1 Sec Memory Limit: 64 MB
Submit: 1471 Solved: 634
[Submit][Status][Web
Board]
Description
众所周知,每当讨论合理的代码格式时,程序员们都会发动一场关乎信仰的战争。当一个新的程序团队在一个工程上开工时,他们经常会带来有些不同的代码风格并且希望把老的源代码按照他们自己的代码风格排版。除此之外,没有经验的程序员还经常会无视好的、始终不变的代码风格的重要性,这会大大增加他所在团队和他自己的负担。这种情况使得代码排版工具的市场越来越大。
你加入了一个叫做“Salvation”的新的代码排版工具的概念验证工程。这个工程只是个并未瞄准实际用途,而是用来证明你分析语法、格式化高级语言能力的的试验性工程。你的任务是编写将一种叫做TRIVIAL (The Rival Implementation-Agnostic Language)的语言的代码排版程序。这种语言的词汇很少并且语法结构简单。这种语言没有任何关键字和控制结构,因为这种语言的所有构造都表示为函数调用和封装。
词汇包括标识符,圆、花括号,逗号和分号。标识符仅由数字0~9和拉丁字母a~z,A~Z组成。单词之间可能由空白符分开,文件开头和最后的空白符也是可以存在的。空白符包括空格,制表符(ASCII码为9)和换行符(由一对ASCII码组成,分别为13,10)。
合法的TRIVIAL程序由下面的结构产生:
- 程序 ::= 代码块
- 代码块 ::= '{' 声明集 '}'
- 声明集 ::= 声明 | 声明 声明集
- 声明 ::= 语句 ';'
- 语句 ::= 标识符 ['(' 参数 ')'] [代码块]
- 参数 ::= 声明 | 声明 ',' 参数
合理的TRIVIAL程序的格式还应当包括下面几点:
- 没有空行。
- 不得使用制表符。
- 文件开头的第一个字符应当是左花括号“{”(之前没有花括号),文件的最后一个字符应当是右花括号“}”(后面没有花括号)。
- 每行前面都有4N个空格,N为缩进量。
- 第一行和最后一行的缩进量为0.
- 组成的代码块的行和被附上花括号“{”……“}”缩进量加一个级别。
- 一行中,除在左花括号“{”和逗号“,”之后可以出现一个空格外,不得出现其他的空格。
- 除最后一行外,每一行以分号“;”和左括号“{”结尾。这些字符不能在一行的中间或开头(包括最后一行)出现。
- 右花括号“}”只能在一行开头的缩进空格之后出现。
参见样例输出中一个格式合理的TRIVIAL程序代码。
Input
输入包含合法的TRIVAL程序代码。每组数据不会超过2000字节。
Output
输出输入中给出的TRIVAL代码的合理格式。
Sample Input
{class(Point) { member ( int ( x ) ) ; member ( int ( y ) ) ; member ( fun ( Length ) { return ( sqrt ( sum ( sqr ( x ),sqr ( y ) ) ) ); } )
;};Main { repeat { set ( n,input ( int ) ) ; for ( int ( i,0 ) , lt ( i,n ) , inc ( i ) ) { print ( mult ( n,n ) ) ; }; };}; }
;};Main { repeat { set ( n,input ( int ) ) ; for ( int ( i,0 ) , lt ( i,n ) , inc ( i ) ) { print ( mult ( n,n ) ) ; }; };}; }
Sample Output
{ class(Point) { member(int(x)); member(int(y)); member(fun(Length) { return(sqrt(sum(sqr(x), sqr(y)))); }); }; Main { repeat { set(n, input(int));
for(int(i, 0), lt(i, n), inc(i)) { print(mult(n, n)); }; }; };}
for(int(i, 0), lt(i, n), inc(i)) { print(mult(n, n)); }; }; };}
一看可能有点不好做,其实,,,
主要思路,用一个长字符串保存下来剔掉空白符的代码,然后对格式进行转换就是了,注意是空白符不是空格,我开始用空格死活不对,下面是我的代码,简单暴力
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main()
{
char a, s2[2005];
int i,j,num = 0, st = 0;
while((a = getchar()) != EOF)
if(!isspace(a))
s2[st++] = a;
for(i = 0; i < st; i++)
{
if(s2[i] == '{')
{
if(num == 0)
printf("{\n");
else
printf(" {\n");
num++;
for(j = 0; j < num; j++)
printf(" ");
}
else if(s2[i] == ',')
printf(", ");
else if(s2[i] == ';')
{
printf(";\n");
for(j = 0; j < num - 1; j++)
printf(" ");
if(s2[i + 1] != '}')
printf(" ");
}
else if(s2[i] == '}')
{
num--;
printf("}");
if(num == 0 && i != st - 1)
printf("\n");
}
else
printf("%c", s2[i]);
}
return 0;
}