2019独角兽企业重金招聘Python工程师标准>>>

一个很有意思的问题: 揭示了计算机程序问题的一般处理思路

===

问题标题: 如何统计汉字的字数? 问题内容: 我想统计: "什么样的问题在 oschina 算是一个好问题?" 这个句子里面以oschina为分割总共有三部分: 什么样的问题在+ oschina +算是一个好问题? 现在想知道oschina前面有几个汉字?oschina有几个英文?oschina后面有几个汉字?不要直接去查找oschina字符串去计算啊,可以当作oschina是某个未知的英文单词,如何统计出来呢? ps.楼下的说我的表达能力有问题,看来我确实没有表达清楚:)再补充一下问题。 问题来源: http://www.oschina.net/question/583303_122530

===

这个问题的关键是如何让计算机区分汉字和英文, 具体分析就要涉及到中文和英文在计算机内部的表示方式, 那么一切以数字为准, 先把这段数据转换为数字格式, 如下代码:

(defparameter *字符串*  "什么样的问题在 oschina 算是一个好问题?")(defun 字符串-数字(字符串)(dotimes (序数 (length 字符串))(print (char-code (elt 字符串 序数)))))

执行一下, 结果如下:

CL-USER> (字符串-数字 *字符串*)20160
20040
26679
30340
38382
39064
22312
32
111
115
99
104
105
110
97
32
31639
26159
19968
20010
22909
38382
39064
65311
NIL
CL-USER>

我们看到, 每一个文字字符都被转化为一个数字值, 这个数字值就是计算机内部对这个字符的表示, 也就是说数字值和文字字符之间存在着一种对应关系. 其实到这里问题基本就解决一多半了, 剩下的就是对这些数字值的操作了.

更简单的语句是:

(defun 字符串-数字向量 (字符串)    (map 'vector #'char-code 字符串))

与前面第一个函数的区别是, 本函数返回的结果是一个向量, 试试看:

CL-USER> (字符串-数字向量 *字符串*)
#(20160 20040 26679 30340 38382 39064 22312 32 111 115 99 104 105 110 97 32 31639 26159 19968 20010 22909 38382 39064 65311)
CL-USER>

再试试日文:

CL-USER> (字符串-数字向量 "日本语:平假名にほんご")
#(26085 26412 35821 65306 24179 20551 21517 12395 12411 12435 12372)
CL-USER>

现在就一目了然了, 这个句子也由适合人类阅读的形式转化为适合计算机阅读的数字形式了, 代码写到这一步, 程序员需要了解的知识就是人类和计算机之间的契约了, 如什么样的数字代表什么样的文字符号等等诸如此类的约定. 我们一般都知道:

0~127 之间的数字表示制表打印控制字符,英文大小写字符以及英文标点符号, 也就是 ASCII
超过127 的数字表示中文字符和全角标点符号等(如果使用其他字符集, 那么就是其他字符, 如日文)

剩下的操作就是对数字的比较,分类等操作了.

这个问题给我们的启示就是, 首先要把问题的表述形式变化为计算机能理解的数字形式, 然后再去翻找人类和计算机之间已经签订好的契约, 然后按照契约的规定来分析处理.

目前写了两个函数, 简单区分了一下英文(0~127 的数字)和非英文(大于 127 的数字), 如下:

(defun 字数统计函数 (字符串)(let ((汉字个数 0) (空格个数 0) (英文字母个数 0) (全角问号个数 0) (代码点 0)) (dotimes (序数 (length 字符串)) (setq 代码点 (char-code (elt 字符串 序数)))(cond((= 代码点 32)(setf 空格个数 (1+ 空格个数)))((= 代码点 65311)(setf 全角问号个数 (1+ 全角问号个数)))((> 代码点 127)(setf 汉字个数 (1+ 汉字个数)))((and (> 代码点 0) (<= 代码点 127))(setf 英文字母个数 (1+ 英文字母个数)))))(values "空格个数:" 空格个数 "全角问号个数:"全角问号个数 "汉字个数:" 汉字个数 "英文字母个数" 英文字母个数)))(defun 字数统计函数-映射版 (字符串)(let ((汉字个数 0) (空格个数 0) (英文字母个数 0) (全角问号个数 0)) (map 'vector  #'(lambda (代码点) (cond((= 代码点 32)(setf 空格个数 (1+ 空格个数)))((= 代码点 65311)(setf 全角问号个数 (1+ 全角问号个数)))((> 代码点 127)(setf 汉字个数 (1+ 汉字个数)))((and (> 代码点 0) (<= 代码点 127))(setf 英文字母个数 (1+ 英文字母个数)))))(map 'vector #'char-code 字符串))(values "空格个数:" 空格个数 "全角问号个数:"全角问号个数 "汉字个数:" 汉字个数 "英文字母个数" 英文字母个数)))

执行结果如下:

CL-USER> (字数统计函数 *字符串*)
"空格个数:"
2
"全角问号个数:"
1
"汉字个数:"
14
"英文字母个数"
7
CL-USER> (字数统计函数-映射版 *字符串*)
"空格个数:"
2
"全角问号个数:"
1
"汉字个数:"
14
"英文字母个数"
7
CL-USER>

转载于:https://my.oschina.net/freeblues/blog/155911

一个很有意思的问题: 揭示了计算机程序问题的一般处理思路相关推荐

  1. 工作214:结构 vue操作一个很有意思的报错 [Vue warn]: You may have an infinite update loop in a component

    结构 vue操作一个很有意思的报错 [Vue warn]: You may have an infinite update loop in a component render function. 代 ...

  2. 现如今有一个很有意思的现象,不管是工厂还是经销商

    现如今有一个很有意思的现象,不管是工厂还是经销商,生意不好的时候,很多人都是想着通过降价来解决问题,但结果却是没什么用. 这其实算是个坏毛病,第一次便宜的时候,也许还能够出点量.因为在我们传统的思维里 ...

  3. 一个很有意思的flash游戏,蚂蚁蛋糕保卫战(antbuster)

    游戏地址 http://www.antbuster.cn 超级好玩的游戏,每个人都可以打出自己的风格,你所要作的就是造各种各样的炮塔挡住蚂蚁,直到最后一块蛋榚被蚂蚁抢走. 只剩一角蛋糕的时候,游戏才刚 ...

  4. 一个很有意思的并查集详解

    并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了.以前我无法解决的一类问题竟然可以用如此简单高效的方法搞定.不分享出来真是对不起party了.(party:我靠,关我嘛事啊?我跟你很熟么?) ...

  5. 发现一个很有意思的博主,好像是个妈妈,呵呵!

    http://hi.baidu.com/haitongz/home 里面的女儿成长经历狠是有借鉴意义.

  6. 【求解】一个很有意思的意外:font-awesome出现奇怪符号

    今天做个登录页,本来一切都好好的. 引入的CDN: <link rel="stylesheet" href="https://cdn.bootcss.com/fon ...

  7. 腾讯出了一个「片多多」,光听名字就感觉很有意思

    loonggg 读完需要 4 分钟 速读仅需 2 分钟 大家好,我是校长. 昨天我发现一个很有意思的 App ,名字叫:「片多多」.没错,光看名字,真的是容易想歪了,我以为和 xxxx hub 是一样 ...

  8. python集合类型中的元素是有序的_python基础篇:很有意思的数据类型,集合(set) 常用去去重...

    Python集合(set),是一个很有意思的数据结构.从形式上看,它像字典有key但没有value,它的写法是这样的s = {'a', 'b', 'c'},是不是像一个没有value的字典?另一方面, ...

  9. codewars 一个很神奇的网站

    今天闲着无聊,逛推酷,无意间发现了一篇很有意思的帖子,帖子里写了国外的一个很有意思的网站,叫codewars ,这个网站的宗旨是把写代码 当成像打怪升级一样.上面有很多的题目,你可以用你熟悉的语言答题 ...

最新文章

  1. 2021-2027年中国一体化预制泵站行业研究及前瞻分析报告
  2. 查看正在执行的事务_看懂sql_trace--分析执行计划及CBO行为
  3. 轻量级web api_10个很棒的JavaScript库,提升Web开发效率
  4. intel服务器主板芯片,英特尔® 服务器主板 S2600CW2SR
  5. WinAPI: GetLogicalDrives - 判断系统中存在的逻辑驱动器
  6. Active Directory的复制拓扑,Active Directory系列之八
  7. 最新设备可利用积雪发电?UCLA研究出积雪式摩擦奈米发电机
  8. 【转】测试架构师团队的管理
  9. hbase 修改表名_hbase修改表名 - 张欢19933的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. python logisticregression_python – 关于scikit-learn中LogisticRegression的GridSearchCV
  11. c语言高效编程pdf,C语言高效编程的四大绝招
  12. 以眼睛的名义:一些光度学概念的解析
  13. android 仓库管理 毕业论文,基于Android的仓库管理系统的设计与实现.zip
  14. 踩坑录·CacheCloud无法启动
  15. html5音频剪辑,访谈类音频剪辑的5个小贴士
  16. 艾默生首席执行官范大为退休;液化空气将新建生产装置为京东方供应气体 | 美通企业日报...
  17. .NET Core之EF Core
  18. 各大浏览器兼容性问题
  19. Renesas CS+ for ca cx入门(一)
  20. SwiftUI基础之Text格式化显示小数specifier

热门文章

  1. 从命令行及java程序运行MyBatis Generator 1.3.x生成MyBatis3.x代码
  2. [Leetcode] Merge Sorted Array 合并数组
  3. Google App Engine(GAE)入门教程翻译
  4. 5G NGC — AF 与 NEF 网络能力开放
  5. Docker 容器技术 — 容器存储
  6. USB 2.0 全速 FULL SPEED 和高速 HIGH SPEED 的区别
  7. jenkins执行shell脚本,找不到环境变量
  8. 阿里云服务器常见用语
  9. 成功企业的核心思维逻辑
  10. Unity Application Block-配置文件的使用-示例(附×××)