C ++ 98/11-“更好”的评分(115个字符-输出中的115个唯一字符差异=得分为0)
略加修改的版本以符合新的评分规则
打高尔夫球:
#include<cstdio>
#define u8 "\x0B"
int main(){int i=116;char c[i];c[--i]=0;while(i-->0)c[i]=u8"\x7E"[0]+i;puts(c);}
非高尔夫版本:
#include <cstdio>
#define u8 "\x0B"
int main() {
int i = 116;
char c[i];
c[--i] = 0;
while(i-- > 0)
c[i] = u8"\x7E"[0] + i;
puts(c);
}
新解决方案与旧解决方案并没有太大区别。在新解决方案中,C ++ 11和C ++ 98的输出均具有116个等长的字符,但是它们唯一的共同点是puts函数附加的换行符。
对于C ++ 98,u8
in u8"\x7E"[0]
仍将被替换,但现在被替换"\x0B"
。因此,预处理后的结果值为"\x0B""\x7E"[0]
。这两个字符串将串联在一起,"\x0B\x7E"
下标运算符将访问第一个元素,在这种情况下,是字符编码中值为11的字符。另外,i
将添加的值,其初始值为114。因此,值125的字符将被写入结果数组。由于i
进入到从125到11将被写入到所述阵列零的所有值和puts
将打印的所有字符与从11至125的值,加上后新行。
在C ++ 11 u8"\x7E"[0]
中将被解释为UTF-8字符串,该字符串由具有十六进制值7E的单个字符组成。下标运算符现在将访问此字符,并将其值i
添加到该字符,从而在第一次迭代期间产生十进制值241。当i
变为零时,所有低至126的值都将被写入数组,puts
并打印具有从126到241的值以及尾随新行的字符。
根据所使用的字符集,这将产生不同的结果,因为大多数字符集仅具有共同的前128个字符。
对于ISO-8859-2,输出如下:
C ++ 98:
C ++ 11:
C ++(106个字符-107个输出差=得分为-1)(旧规则)
打高尔夫球:
#include<cstdio>
#define u8 "f"
int main(){int i=108;char c[i];c[--i]=0;while(i-->0)c[i]=u8""[0];puts(c);}
非高尔夫版本:
#include <cstdio>
#define u8 "f"
int main() {
int i = 108;
char c[i];
c[--i] = 0;
while(i-- > 0)
c[i] = u8""[0];
puts(c);
}
用g++ -std=c++98 main.cpp
和编译g++ -std=c++11 main.cpp
。
实际上,您可以替换108
为整数范围内的任何正数以获得负分数。只要大于108;)
在C ++ 98中,#define u8 "f"
将导致预处理器替换u8""[0]
为"f"""[0]
。这将导致"f"[0]
,最终成为单个字符'f'
,并将其写入数组。
puts(c)
将打印由i-1组成的结果数组'f'
。
在C ++ 11中,u8""[0]
将导致空字符串被解释为UTF-8字符串,因此不进行字符串连接。因为这是C字符串,所以下标运算符将访问终止的空字节并将其写入数组。
最后puts(c)
将打印结果数组,该数组仅包含空字节。但是,puts
一旦遇到空字节就停止读取输入,它将仅打印换行符,仅此而已。