Description

Nowadays, there are smartphone applications that instantly translate text and even solve math problems if you just point your phone’s camera at them. Your job is to implement a much simpler functionality reminiscent of the past — add two integers written down as ASCII art.

An ASCII art is a matrix of characters, exactly 7 rows high, with each individual character either a dot (.) or the lowercase letter ‘x’.

An expression of the form a + b is given, where both a and b are positive integers. The expression is converted into ASCII art by writing all the expression characters (the digits of a and b as well as the ‘+’ sign) as 7 × 5 matrices, and concatenating the matrices together with a single column of dot characters between consecutive individual matrices. The exact matrices corresponding to the digits and the ‘+’ sign are as folows:

xxxxx   ....x   xxxxx   xxxxx   x...x   xxxxx   xxxxx   xxxxx   xxxxx   xxxxx   .....
x...x ....x ....x ....x x...x x.... x.... ....x x...x x...x ..x..
x...x ....x ....x ....x x...x x.... x.... ....x x...x x...x ..x..
x...x ....x xxxxx xxxxx xxxxx xxxxx xxxxx ....x xxxxx xxxxx xxxxx
x...x ....x x.... ....x ....x ....x x...x ....x x...x ....x ..x..
x...x ....x x.... ....x ....x ....x x...x ....x x...x ....x ..x..
xxxxx ....x xxxxx xxxxx ....x xxxxx xxxxx ....x xxxxx xxxxx .....

Given an ASCII art for an expression of the form a + b, find the result of the addition and write it out in the ASCII art form.

Input

The input file contains several test cases, each of them as described below.

Input consists of exactly 7 lines and contains the ASCII art for an expression of the form a + b,

where both a and b are positive integers consisting of at most 9 decimal digits and written without leading zeros.

Output

For each test case, output 7 lines containing ASCII art corresponding to the result of the addition, without leading zeros.

Sample Input

....x.xxxxx.xxxxx.x...x.xxxxx.xxxxx.xxxxx.......xxxxx.xxxxx.xxxxx
....x.....x.....x.x...x.x.....x.........x...x...x...x.x...x.x...x
....x.....x.....x.x...x.x.....x.........x...x...x...x.x...x.x...x
....x.xxxxx.xxxxx.xxxxx.xxxxx.xxxxx.....x.xxxxx.xxxxx.xxxxx.x...x
....x.x.........x.....x.....x.x...x.....x...x...x...x.....x.x...x
....x.x.........x.....x.....x.x...x.....x...x...x...x.....x.x...x
....x.xxxxx.xxxxx.....x.xxxxx.xxxxx.....x.......xxxxx.xxxxx.xxxxx

Sample Output

....x.xxxxx.xxxxx.xxxxx.x...x.xxxxx.xxxxx
....x.....x.....x.x.....x...x.x.........x
....x.....x.....x.x.....x...x.x.........x
....x.xxxxx.xxxxx.xxxxx.xxxxx.xxxxx.....x
....x.x.........x.....x.....x.....x.....x
....x.x.........x.....x.....x.....x.....x
....x.xxxxx.xxxxx.xxxxx.....x.xxxxx.....x

Analyze:

  目前遇到过最恶心的模拟题之一。训练赛听说只有我是用char肝的我瞬间冒冷汗。各自边界计算弄得我头都大了。一个恶心点是此题给出的样例只有一个,但是特么自己写样例麻烦的一批。这里我提供一个自己写的样例:

....x.xxxxx.......xxxxx
....x.....x...x...x...x
....x.....x...x...x...x
....x.xxxxx.xxxxx.xxxxx
....x.x.......x...x...x
....x.x.......x...x...x
....x.xxxxx.......xxxxx

加上题目的样例都能过的话那就基本没问题了。

里面digits的算法是通过方程得到的。字符(数字或加号)的宽度是5,假设有n个字符,那么宽度就是5n;n个字符间有n-1个'.',所以行的总长度就是5n+n-1 = 6*n-1 = len,推出n=(len+1)/6

Code

#include <cstdio>
#include <cstring>
#include <cmath>
struct Num{
const char* n[7]; //每个结构体内部是一个储存7行字符串指针的数组
}nums[11]={
{
"xxxxx",
"x...x",
"x...x",
"x...x",
"x...x",
"x...x",
"xxxxx"
},
{
"....x",
"....x",
"....x",
"....x",
"....x",
"....x",
"....x"
},
{
"xxxxx",
"....x",
"....x",
"xxxxx",
"x....",
"x....",
"xxxxx"
},
{
"xxxxx",
"....x",
"....x",
"xxxxx",
"....x",
"....x",
"xxxxx"
},
{
"x...x",
"x...x",
"x...x",
"xxxxx",
"....x",
"....x",
"....x"
},
{
"xxxxx",
"x....",
"x....",
"xxxxx",
"....x",
"....x",
"xxxxx"
},
{
"xxxxx",
"x....",
"x....",
"xxxxx",
"x...x",
"x...x",
"xxxxx"
},
{
"xxxxx",
"....x",
"....x",
"....x",
"....x",
"....x",
"....x"
},
{
"xxxxx",
"x...x",
"x...x",
"xxxxx",
"x...x",
"x...x",
"xxxxx"
},
{
"xxxxx",
"x...x",
"x...x",
"xxxxx",
"....x",
"....x",
"xxxxx"
},
{
".....",
"..x..",
"..x..",
"xxxxx",
"..x..",
"..x..",
"....."
}
};
char ccin[7][120]; // 保存输入的式子
char ccout[7][120]; // 保存最后输出的式子
int cmp(int index){ // 判断对应方块的数字是否在预设数字里
for(int m = 0;m < 10;m ++){
bool ok = true;
for(int i = 0;i < 7;i ++)
for(int j = 0;j < 5;j ++)
if(nums[m].n[i][j]!=ccin[i][j+index]){ ok=false; break;}
if(ok) return m;
}
return -1; // 如果没找到说明此方块内是加号,返回-1
}
int ccount(int sum){ //计算和的位数
int c = 0;
while(sum){
sum /= 10; ++c;
}
return c;
}
int main()
{
while(~scanf("%s",ccin[0])){
for(int i = 1;i < 7;i ++) scanf("%s",ccin[i]);
int len = strlen(ccin[0]);
int digits = (len+1)/6; // 计算有多少个数
int sum = 0,mul = 1,i;
for(i = 0;i < digits;i ++){
int bit = cmp(len-1-(4+i*6));
if(bit<0){ len = len-1-(4+i*6)-1; break; }
sum += bit*mul; // 累加
mul *= 10;
}
digits -= i + 1; mul = 1;
for(i = 0;i < digits;i ++){
int bit = cmp(len-1-(4+i*6));
sum += bit*mul;
mul *= 10;
}
int final = ccount(sum);
for(i = 0;i < final;i ++){
int e = 1;
for(int l = 0;l < final - 1 - i;l ++)
e*=10;
int bit = sum / e;
sum-=e*bit;
for(int j = 0;j < 7;j ++){
for(int k = 0;k < 5;k ++)
ccout[j][k+i*6] = nums[bit].n[j][k];
if(i!=final-1) ccout[j][(i+1)*6-1]='.';
}
}
for(i = 0;i < 7;i ++)
printf("%s\n",ccout[i]);
memset(ccin,0,sizeof(ccin)); memset(ccout,0,sizeof(ccout));
}
return 0;
}

[C++]UVaLive7324 ASCII Addtion的更多相关文章

  1. SQL Server 中怎么查看一个字母的ascii编码或者Unicode编码

    参考文章:微信公众号文章 在sql中怎么查看一个字符的ascii编码,so easy !! select ASCII('a') SELECT CHAR(97) charNum SELECT UNICO ...

  2. perl 如何匹配ASCII码以及ASCII码转换

    匹配ASCII码:   /[:ascii:]/ ASCII码转换为数字: ord() 数字转换为ASCII码: chr()

  3. 常用ASCII CHR碼對照

    因為開發需求,把對照表留下來一下. Chr(0) Null Chr(29) 分组符 Chr(38) & Chr(48) 0 Chr(8) 退格 Chr(30) 記錄分離符號 Chr(39) ‘ ...

  4. ascii、unicode、utf、gb等编码详解

    很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为"字节".再后来,他们又做了一些可以处理这 ...

  5. ASCII码而已

    题目: \u5927\u5bb6\u597d\uff0c\u6211\u662f\u0040\u65e0\u6240\u4e0d\u80fd\u7684\u9b42\u5927\u4eba\uff01 ...

  6. python2.7 报错(UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128))

    报错: 原来用的python3.5版本后来改为2.7出现了这个错误里面的中文无法显示 UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 ...

  7. ASCII码、Unicode码 转中文

    ASCII码.Unicode码 转中文 在最近工作中遇到了一些汉字编码转换的处理,可以通过正则表达式及转换字符来实现转成中文 Unicode转换示例 通常为10位编码, 通过digit参数传入 pri ...

  8. ASCII字符集中的功能/控制字符

       ASCII字符集中的功能/控制字符     Function/Control Code/Character in ASCII Version: 2011-02-15 Author: gree ...

  9. ASCII和16进制对照表

    十六进制代码 MCS 字符或缩写 DEC 多国字符名 ASCII 控制字符 1 00 NUL 空字符 01 SOH 标题起始 (Ctrl/A) 02 STX 文本起始 (Ctrl/B) 03 ETX ...

随机推荐

  1. maven中央仓库、远程仓库地址

    1.http://repo1.maven.org/maven2 (官方,速度一般) 2.http://maven.aliyun.com/nexus/content/repositories/centr ...

  2. PowerShell或命令行运行javac xx.java提示“编码GBK的不可映射字符”

    由于JDK是国际版的,我们在用javac编译时,编译程序首先会获得我们操作系统默认采用的编码格式(GBK),然后JDK就把Java源文件从GBK编码格式转换为Java内部默认的Unicode格式放入内 ...

  3. Golang mysql 上线的一个坑 Db.close重要性

    急冲冲完成的mysql的一个监控自动处理程序上线了,线下处理是正常的,没想到线上才半小时就奔溃了. 现在时间是晚上11点,心慌焦虑涌上心头,需要熬夜?肾上腺素激增. 程序主要是一个定时任务的处理程序, ...

  4. excel身份证验证(附带防止粘贴导致校验失效的函数)

    一.检验函数 =IF(LEN(A1)=18,MID("10X98765432",MOD(SUMPRODUCT(MID(A1,ROW(INDIRECT("1:17" ...

  5. nginx正向代理和反正代理区别

    1)正向代理:客户端 <一> 代理 一>服务端 客户端访问不到服务端,所以找了代理,由代理帮忙访问到了服务端 2)反向代理:客户端 一>代理 <一> 服务端 客户端 ...

  6. BAT面试题:使用数组实现一个简单的阻塞队列

    这道题是我亲身经历的一道大厂面试题,非常值得分享! 这道题可以分为两个步骤进行编码解答,第一步是基于数组实现一个队列,第二步是实现线程阻塞. 如果是基于数组实现栈的数据结构,那么我们只需要一个指针进行 ...

  7. 技术的极限(6): 密码朋克精神(Cypherpunk Spirit)

    上一篇:技术的极限(5): 识别计算与技术背后的心智 下一篇:技术的极限(7): 处理复杂与分层 目录: ** 0x01 数据和App分离 ** 0x02 蒸汽朋克/赛博朋克/密码朋克 ** 0x03 ...

  8. Virtual DOM 系列一:认识虚拟DOM

    1. 什么是Virtual DOM? Virtual DOM(虚拟DOM)是指用JS模拟DOM结构.本质上来讲VD是一个JS对象,并且至少包含三个属性:tag(html标签),props(标签的属性, ...

  9. 4月18日 MySQL学习

    正式开始了数据库的学习 昨天下好的MySQL 今天正式开始学习的,介绍了多种数据库软件,当然 学习的这个是开源的 免费的. DBMS(数据库管理系统)这就是我们学习的数据库的软件 数据库分为关系型数据 ...

  10. ECMA262,JavaScript引擎,浏览器

    相关阅读:https://www.cnblogs.com/970119449blog/p/8080133.html 相关阅读:https://www.jb51.net/article/75888.ht ...