打印

[悬赏]打印九九乘法表,使用最少的特殊符号

[复制链接]
3157|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lxyppc|  楼主 | 2010-4-14 11:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 lxyppc 于 2010-4-14 11:40 编辑

使用C/C++语言打印出九九乘法表
举一个九九乘法表的例子,不要求完全一样
1*1=01 1*2=02 1*3=03 1*4=04 1*5=05 1*6=06 1*7=07 1*8=08 1*9=09
2*1=02 2*2=04 2*3=06 2*4=08 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18
3*1=03 3*2=06 3*3=09 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27
4*1=04 4*2=08 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36
5*1=05 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45
6*1=06 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54
7*1=07 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63
8*1=08 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72
9*1=09 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
要求源代码中使用最少的特殊符号
除了字母,空格,回车与Tab之外,其它的都算特殊符号
比如下面这段代码使用了14个特殊符号
#include <stdio.h>
void main(void)
{
    printf("Hello World!");
}
统计方式
UltraEditor中用Unix正则表达式[^a-zA-Z \t\r\n]来进行统计
代码对格式不做要求,源代码中使用的特殊符号最少的人为胜者,可以得到这个贴子所有的分
时间限制为5天
这个题目我也是在别的地方看见的,做的时候中间也优化过很多次,最后出来的结果自己都不大相信

这里我做的结果,已经加密了,五天后宣布胜者的同时公布这个结果的密码
9x9.rar (1.63 KB)

相关帖子

沙发
mohanwei| | 2010-4-14 12:26 | 只看该作者
用Brainfuck风格吧,不清楚可以搜一下

使用特权

评论回复
板凳
mohanwei| | 2010-4-14 12:28 | 只看该作者
给你看一段Hello,World!示例:
01            main(){int i,n[]={(((1<<1)<<(1<<1)<<(1<<
02            1)<<(1<<(1>>1)))+((1<<1)<<(1<<1))), (((1
03            <<1)<<(1<<1)<<(1<<1)<<(1<<1))-((1<<1)<<(
04            1<<1)<<(1<<1))+((1<<1)<<(1<<(1>>1)))+ (1
05            <<(1>>1))),(((1<<1)<<(1<<1)<<(1<<1)<< (1
06            <<1))-((1<<1)<<(1<<1)<<(1<<(1>>1)))- ((1
07            <<1)<<(1<<(1>>1)))),(((1<<1)<<(1<<1)<<(1
08            <<1)<<(1<<1))-((1<<1)<<(1<<1)<<(1<<(1>>1
09            )))-((1<<1)<<(1<<(1>>1)))),(((1<<1)<< (1
10            <<1)<<(1<<1)<<(1<<1))-((1<<1)<<(1<<1)<<(
11            1<<(1>>1)))-(1<<(1>>1))),(((1<<1)<<(1<<1
12            )<<(1<<1))+((1<<1)<<(1<<1)<<(1<<(1>>1)))
13            -((1<<1)<<(1<<(1>>1)))),((1<<1)<< (1<<1)
14            <<(1<<1)),(((1<<1)<<(1<<1)<<(1<<1)<<(1<<
15            1))-((1<<1)<<(1<<1))-(1<<(1>>1))),(((1<<
16            1)<<(1<<1)<<(1<<1)<<(1<<1))-((1<<1)<< (1
17            <<1)<<(1<<(1>>1)))-(1<<(1>>1))), (((1<<1
18            )<<(1<<1)<<(1<<1)<<(1<<1))- ((1<<1)<< (1
19            <<1)<<(1<<(1>>1)))+(1<<1)), (((1<<1)<< (
20            1<<1)<<(1<<1)<< (1<<1))-((1<<1)<< (1<<1)
21            <<(1<<(1>>1)))-((1<<1) <<(1<< (1>>1)))),
22            (((1<<1)<< (1<<1)<<(1<<1)<< (1<<1))- ((1
23            <<1)<<(1<<1)<<(1<<1))+((1<<1)<< (1<<(1>>
24            1)))), (((1<<1)<<(1<<1) <<(1<<1))+(1<<(1
25            >>1))),(((1<<1)<<(1<<1))+((1<<1)<< (1<<(
26            1>>1))) + (1<< (1>>1)))}; for(i=(1>>1);i
27            <(((1<<1) <<(1<<1))+((1 <<1)<< (1<<(1>>1
28            ))) + (1<<1)); i++) printf("%c",n[i]); }

使用特权

评论回复
地板
lxyppc|  楼主 | 2010-4-14 12:30 | 只看该作者
呵呵,原理差不多,只不过我作的答案比Brainfuck还要BT一点:lol

使用特权

评论回复
5
john_light| | 2010-4-14 13:11 | 只看该作者
大姑娘上花轿,头一回听说Brainfuck

惨无人道地围观楼主……

使用特权

评论回复
6
lxyppc|  楼主 | 2010-4-19 13:35 | 只看该作者
晕,没人回应啊,那我自愚自乐一把

结果的密码是:
bbs.21ic.comlxyppc
即:http://lxyppc-codepaint.googleco ... k/CodePaint/Only8.c

简单说明一下
1. C语言中的宏定义本质就是简单的替换,先用宏把"();"这三个最常的特殊符号替换掉
在使用这三个符号的地方都用它们的宏名代替。
#define L (
#define R )
#define SEMI ;

2. C语言中的头文件。其实C中没有什么头文件不头文件的,只是大家都这么叫而已。包含库的头文件目的就是为了能声明一些库函数,这和我们自己声明本质一样,所以这里不用去包含什么头文件,自己声明出来就行了。这样可以省掉一个#include "stdio.h",共计四个特殊字符。
int putchar (int);
double sin (double);
double exp (double);
double sqrt (double);
int getchar ();
用宏名替换后即:
int putchar L int R SEMI
double sin L double R SEMI
double exp L double R SEMI
double sqrt L double R SEMI
int getchar L R SEMI

3. main函数,Windows下main函数原型是int main(int,const char**),在C中默认使用__cdecl调用规则,由调用者负责维护参数栈,因此更改被调用函数原型不会影响使用。这里用int main()代替int main(int,const char**)省掉一个逗号两个*号。
int main()即 int main L R

4. 任何算法都会增加特殊符号的使用,这里简单就是“美”,不加任何算法,直接使用putchar输出。因为如果用printf需要使用双引号,会增加特殊符号。
代码看来就是一串的putchar
putchar L xx R SEMI 输出0
putchar L xx R SEMI 输出1
...               ...
putchar L xx R SEMI 输出8
putchar L xx R SEMI 输出1

5. putchar接受一个整形的变量,这个整形值就是输出的字符的ASCII值。直接写数字会使用大量的特殊字符。这里通过sin exp sqrt这些数学函数的组合来得到。这些函数只有一个参数,可以直接嵌套使用,不用其它的符号了。即:
putchar (xx) = putchar ( exp(exp(sin(sin(yy)))) );
最内层的初始化值可以yy由 sizeof(char),sizeof(short)来获得。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:代码发BBS不好看?你需要它 代码着色https://bbs.21ic.com/icview-135254-1-1.html

27

主题

2249

帖子

19

粉丝