Board logo

标题: 批处理检查《千字文》是否有重复字 [打印本页]

作者: CrLf    时间: 2011-5-31 18:34     标题: 批处理检查《千字文》是否有重复字

千字文是中华民族的文化瑰宝,与三字经、百家姓合称“三百千”,历来是启蒙教材。白话盛行的今天,一群幼童摇头晃脑背书的场面几乎绝迹,而“天地玄黄,宇宙洪荒。日月盈仄,辰宿列张”的悠长吟诵声也悄然远去。
作为华夏儿女、龙的传人,何不在学批处理的同时重温国学经典。

以下三道题目,希望大家不仅只是解题,还能够能广开思路,举一反三:
1、计算千字文全文字数
2、证明千字文是否有重复字,若有则列举出来
3、四个字一组,逆序输出,组内字符顺序不变
比如:
  1. 天地玄黄 宇宙洪荒 日月盈昃 辰宿列张
复制代码
颠倒后:
  1. 辰宿列张
  2. 日月盈昃
  3. 宇宙洪荒
  4. 天地玄黄
复制代码
提示:
1、2题解题时空格不算在内,只判断汉字汉字。可以就题解题
评分依据:
思路>效率>简洁>无临时文件
以此为根据,评分从1~15分不等,非常优秀的思路另加5pb、1技术

千字文:
  1. 天地玄黄 宇宙洪荒 日月盈昃 辰宿列张 寒来暑往 秋收冬藏
  2. 闰馀成岁 律吕调阳 云腾致雨 露结为霜 金生丽水 玉出昆冈
  3. 剑号巨阙 珠称夜光 果珍李柰 菜重芥姜 海咸河淡 鳞潜羽翔
  4. 龙师火帝 鸟官人皇 始制文字 乃服衣裳 推位让国 有虞陶唐
  5. 吊民伐罪 周发殷汤 坐朝问道 垂拱平章 爱育黎首 臣伏戎羌
  6. 遐迩一体 率宾归王 鸣凤在竹 白驹食场 化被草木 赖及万方
  7. 盖此身发 四大五常 恭惟鞠养 岂敢毁伤 女慕贞洁 男效才良
  8. 知过必改 得能莫忘 罔谈彼短 靡恃己长 信使可复 器欲难量
  9. 墨悲丝染 诗赞羔羊 景行维贤 克念作圣 德建名立 形端表正
  10. 空谷传声 虚堂习听 祸因恶积 福缘善庆 尺璧非宝 寸阴是竞
  11. 资父事君 曰严与敬 孝当竭力 忠则尽命 临深履薄 夙兴温凊
  12. 似兰斯馨 如松之盛 川流不息 渊澄取映 容止若思 言辞安定
  13. 笃初诚美 慎终宜令 荣业所基 籍甚无竟 学优登仕 摄职从政
  14. 存以甘棠 去而益咏 乐殊贵贱 礼别尊卑 上和下睦 夫唱妇随
  15. 外受傅训 入奉母仪 诸姑伯叔 犹子比儿 孔怀兄弟 同气连枝
  16. 交友投分 切磨箴规 仁慈隐恻 造次弗离 节义廉退 颠沛匪亏
  17. 性静情逸 心动神疲 守真志满 逐物意移 坚持雅操 好爵自縻
  18. 都邑华夏 东西二京 背邙面洛 浮渭据泾 宫殿盘郁 楼观飞惊
  19. 图写禽兽 画彩仙灵 丙舍傍启 甲帐对楹 肆筵设席 鼓瑟吹笙
  20. 升阶纳陛 弁转疑星 右通广内 左达承明 既集坟典 亦聚群英
  21. 杜稿钟隶 漆书壁经 府罗将相 路侠槐卿 户封八县 家给千兵
  22. 高冠陪辇 驱毂振缨 世禄侈富 车驾肥轻 策功茂实 勒碑刻铭
  23. 磻溪伊尹 佐时阿衡 奄宅曲阜 微旦孰营 桓公匡合 济弱扶倾
  24. 绮回汉惠 说感武丁 俊乂密勿 多士寔宁 晋楚更霸 赵魏困横
  25. 假途灭虢 践土会盟 何遵约法 韩弊烦刑 起翦颇牧 用军最精
  26. 宣威沙漠 驰誉丹青 九州禹迹 百郡秦并 岳宗泰岱 禅主云亭
  27. 雁门紫塞 鸡田赤城 昆池碣石 巨野洞庭 旷远绵邈 岩岫杳冥
  28. 治本于农 务资稼穑 俶载南亩 我艺黍稷 税熟贡新 劝赏黜陟
  29. 孟轲敦素 史鱼秉直 庶几中庸 劳谦谨敕 聆音察理 鉴貌辨色
  30. 贻厥嘉猷 勉其祗植 省躬讥诫 宠增抗极 殆辱近耻 林皋幸即
  31. 两疏见机 解组谁逼 索居闲处 沉默寂寥 求古寻论 散虑逍遥
  32. 欣奏累遣 戚谢欢招 渠荷的历 园莽抽条 枇杷晚翠 梧桐蚤凋
  33. 陈根委翳 落叶飘摇 游鹍独运 凌摩绛霄 耽读玩市 寓目囊箱
  34. 易輶攸畏 属耳垣墙 具膳餐饭 适口充肠 饱饫烹宰 饥厌糟糠
  35. 亲戚故旧 老少异粮 妾御绩纺 侍巾帷房 纨扇圆絜 银烛炜煌
  36. 昼眠夕寐 蓝笋象床 弦歌酒宴 接杯举觞 矫手顿足 悦豫且康
  37. 嫡后嗣续 祭祀烝尝 稽颡再拜 悚惧恐惶 笺牒简要 顾答审详
  38. 骸垢想浴 执热愿凉 驴骡犊特 骇跃超骧 诛斩贼盗 捕获叛亡
  39. 布射僚丸 嵇琴阮啸 恬笔伦纸 钧巧任钓 释纷利俗 竝皆佳妙
  40. 毛施淑姿 工颦妍笑 年矢每催 曦晖朗曜 璇玑悬斡 晦魄环照
  41. 指薪修祜 永绥吉劭 矩步引领 俯仰廊庙 束带矜庄 徘徊瞻眺
  42. 孤陋寡闻 愚蒙等诮 谓语助者 焉哉乎也
复制代码
链接: https://pan.baidu.com/s/1KccstnpWy1RQjyd2oaVS9Q?pwd=g3jy
作者: Demon    时间: 2011-5-31 19:36

本帖最后由 Demon 于 2011-5-31 19:58 编辑

第一题
  1. @ECHO OFF
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. FOR /F "delims=" %%i IN (千字文.txt) DO CALL :strlen %%i
  4. ECHO %n%
  5. PAUSE & GOTO :EOF
  6. :strlen
  7.     SET str=%*
  8.     SET str=%str: =%
  9.     :strlen_loop
  10.     IF "%str%" NEQ "" (
  11.         SET /A n += 1
  12.         SET str=!str:~1!
  13.         GOTO :strlen_loop
  14.     )
  15. GOTO :EOF
复制代码

作者: Demon    时间: 2011-5-31 19:50

本帖最后由 Demon 于 2011-5-31 20:16 编辑

第二题无法证明,“发 云 昆 巨 资 戚”这几个字不是重复了么?
  1. @ECHO OFF
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. FOR /F "delims=" %%i IN (千字文.txt) DO CALL :check %%i
  4. PAUSE & GOTO :EOF
  5. :check
  6.     SET str=%*
  7.     SET str=%str: =%
  8.     :check_loop
  9.     IF "%str%" NEQ "" (
  10.         SET c=!str:~0,1!
  11.         SET str=!str:~1!
  12.         IF DEFINED dic[!c!] CALL ECHO %%dic[!c!]%% 重复
  13.         SET dic[!c!]=!c!
  14.         GOTO :check_loop
  15.     )
  16. GOTO :EOF
复制代码

作者: CrLf    时间: 2011-5-31 19:58

2# Demon


能用for的地方建议不用call或goto,思路还有拓展的空间,不妨进一步展开想象。
作者: CrLf    时间: 2011-5-31 20:13

3# Demon


哈哈,这倒是,检查了下原来是我自己的代码错了,感谢提醒!
作者: mxxcgzxxx    时间: 2011-5-31 22:31

本帖最后由 mxxcgzxxx 于 2011-5-31 22:50 编辑

答个1,3,2题
  1. @ECHO OFF
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. set a=0
  4. for /f "tokens=1-6 delims= " %%1 in (千字文.txt) do (
  5.             set /a a+=1 & set "a!a!=%%1"
  6.             set /a a+=1 & set "a!a!=%%2"
  7.             set /a a+=1 & set "a!a!=%%3"
  8.             set /a a+=1 & set "a!a!=%%4"
  9.             set /a a+=1 & set "a!a!=%%5"
  10.             set /a a+=1 & set "a!a!=%%6"
  11.             )
  12. set /a b=%a%-6
  13. for /l %%i in (%b%,1,%a%) do if "!a%%i!"==""  set /a a-=1
  14. set /a b=%a%*4
  15. echo 《千字文》篇幅总计有%b%字;
  16. pause>nul
  17. set c=
  18. for /l %%i in (%a%,-1,1) do echo,!a%%i! &set c=!c!!a%%i!
  19. pause>nul
  20. set /a d=b-1
  21. set f=
  22. for /l %%i in (1,1,%d%) do (
  23.          set /a e=%%i+1
  24.          for /l %%1 in (!e!,1,%b%) do if "!c:~%%i,1!"=="!c:~%%1,1!" set "f=!f! !c:~%%i,1!"
  25.          )
  26. echo  有以下重字:%f%
  27. pause>nul
复制代码

作者: CrLf    时间: 2011-5-31 22:51

6# mxxcgzxxx


思路很好,找到了文本的规律所在,这是高效的前提。
不过代码还可以进一步简化。
作者: mxxcgzxxx    时间: 2011-5-31 22:53

我的重字较对那里花的时间有点多!
作者: neorobin    时间: 2011-5-31 23:46

本帖最后由 neorobin 于 2011-5-31 23:49 编辑

计算字串长度, 没有比此处
http://www.bathome.net/viewthrea ... muid=20015#pid74946
更好的代码, 就不写了
  1. @echo off & setlocal enableDelayedExpansion
  2. for /f "delims=:" %%n in ('findstr /n /b /e :text "%~0"') do set jump=%%n
  3. for /f "skip=%jump% usebackq delims=" %%l in ("%~0") do set text=!text!%%l
  4. set text=!text: =!
  5. set kiloChr=!text!$
  6. for /l %%i in (999 -1 0) do (
  7.   set tmp=!kiloChr!
  8.   for %%c in (!kiloChr:~%%i^,1!) do (
  9.     set kiloChr=!kiloChr:%%c=!
  10.     if #!kiloChr:~%%i! neq #$ (
  11.       set kiloChr=!tmp:~0,-2!$
  12.       set duplicate=!duplicate!%%c
  13.     )
  14.   )
  15. )
  16. set duplicate
  17. pause
  18. for /l %%p in (12 16 1004) do (
  19.   set /a qMin=%%p-12
  20.   for /l %%q in (%%p -4 !qMin!) do echo,!text:~%%q,4!
  21. )
  22. pause
  23. exit
  24. :text
  25. 天地玄黄 宇宙洪荒 日月盈昃 辰宿列张 寒来暑往 秋收冬藏
  26. 闰馀成岁 律吕调阳 云腾致雨 露结为霜 金生丽水 玉出昆冈
  27. 剑号巨阙 珠称夜光 果珍李柰 菜重芥姜 海咸河淡 鳞潜羽翔
  28. 龙师火帝 鸟官人皇 始制文字 乃服衣裳 推位让国 有虞陶唐
  29. 吊民伐罪 周发殷汤 坐朝问道 垂拱平章 爱育黎首 臣伏戎羌
  30. 遐迩一体 率宾归王 鸣凤在竹 白驹食场 化被草木 赖及万方
  31. 盖此身发 四大五常 恭惟鞠养 岂敢毁伤 女慕贞洁 男效才良
  32. 知过必改 得能莫忘 罔谈彼短 靡恃己长 信使可复 器欲难量
  33. 墨悲丝染 诗赞羔羊 景行维贤 克念作圣 德建名立 形端表正
  34. 空谷传声 虚堂习听 祸因恶积 福缘善庆 尺璧非宝 寸阴是竞
  35. 资父事君 曰严与敬 孝当竭力 忠则尽命 临深履薄 夙兴温凊
  36. 似兰斯馨 如松之盛 川流不息 渊澄取映 容止若思 言辞安定
  37. 笃初诚美 慎终宜令 荣业所基 籍甚无竟 学优登仕 摄职从政
  38. 存以甘棠 去而益咏 乐殊贵贱 礼别尊卑 上和下睦 夫唱妇随
  39. 外受傅训 入奉母仪 诸姑伯叔 犹子比儿 孔怀兄弟 同气连枝
  40. 交友投分 切磨箴规 仁慈隐恻 造次弗离 节义廉退 颠沛匪亏
  41. 性静情逸 心动神疲 守真志满 逐物意移 坚持雅操 好爵自縻
  42. 都邑华夏 东西二京 背邙面洛 浮渭据泾 宫殿盘郁 楼观飞惊
  43. 图写禽兽 画彩仙灵 丙舍傍启 甲帐对楹 肆筵设席 鼓瑟吹笙
  44. 升阶纳陛 弁转疑星 右通广内 左达承明 既集坟典 亦聚群英
  45. 杜稿钟隶 漆书壁经 府罗将相 路侠槐卿 户封八县 家给千兵
  46. 高冠陪辇 驱毂振缨 世禄侈富 车驾肥轻 策功茂实 勒碑刻铭
  47. 磻溪伊尹 佐时阿衡 奄宅曲阜 微旦孰营 桓公匡合 济弱扶倾
  48. 绮回汉惠 说感武丁 俊乂密勿 多士寔宁 晋楚更霸 赵魏困横
  49. 假途灭虢 践土会盟 何遵约法 韩弊烦刑 起翦颇牧 用军最精
  50. 宣威沙漠 驰誉丹青 九州禹迹 百郡秦并 岳宗泰岱 禅主云亭
  51. 雁门紫塞 鸡田赤城 昆池碣石 巨野洞庭 旷远绵邈 岩岫杳冥
  52. 治本于农 务资稼穑 俶载南亩 我艺黍稷 税熟贡新 劝赏黜陟
  53. 孟轲敦素 史鱼秉直 庶几中庸 劳谦谨敕 聆音察理 鉴貌辨色
  54. 贻厥嘉猷 勉其祗植 省躬讥诫 宠增抗极 殆辱近耻 林皋幸即
  55. 两疏见机 解组谁逼 索居闲处 沉默寂寥 求古寻论 散虑逍遥
  56. 欣奏累遣 戚谢欢招 渠荷的历 园莽抽条 枇杷晚翠 梧桐蚤凋
  57. 陈根委翳 落叶飘摇 游鹍独运 凌摩绛霄 耽读玩市 寓目囊箱
  58. 易輶攸畏 属耳垣墙 具膳餐饭 适口充肠 饱饫烹宰 饥厌糟糠
  59. 亲戚故旧 老少异粮 妾御绩纺 侍巾帷房 纨扇圆絜 银烛炜煌
  60. 昼眠夕寐 蓝笋象床 弦歌酒宴 接杯举觞 矫手顿足 悦豫且康
  61. 嫡后嗣续 祭祀烝尝 稽颡再拜 悚惧恐惶 笺牒简要 顾答审详
  62. 骸垢想浴 执热愿凉 驴骡犊特 骇跃超骧 诛斩贼盗 捕获叛亡
  63. 布射僚丸 嵇琴阮啸 恬笔伦纸 钧巧任钓 释纷利俗 竝皆佳妙
  64. 毛施淑姿 工颦妍笑 年矢每催 曦晖朗曜 璇玑悬斡 晦魄环照
  65. 指薪修祜 永绥吉劭 矩步引领 俯仰廊庙 束带矜庄 徘徊瞻眺
  66. 孤陋寡闻 愚蒙等诮 谓语助者 焉哉乎也
复制代码

作者: batman    时间: 2011-6-1 12:05

先给个计算字数的vbs:
  1. Dim vbstr, fso
  2. Set fso = CreateObject("scripting.filesystemobject")
  3. vbstr = fso.OpenTextFile("a.txt").ReadAll()
  4. MsgBox "千字文总字数为:" & Len(Replace(Replace(vbstr, Chr(32), ""), vbCrLf, ""))
  5. Set fso = Nothing
复制代码

作者: 523066680    时间: 2011-6-1 12:38

那个, 检查重复字的是不是用 那个文字做变量名,然后用if defined ... 来判断是否重复的。
作者: batman    时间: 2011-6-1 12:44

完整的:
  1. Dim vbstr, fso, vbout, out, vbk, judge
  2. Set fso = CreateObject("scripting.filesystemobject")
  3. vbstr = Replace(fso.OpenTextFile("a.txt").ReadAll(), vbCrLf, "")
  4. judge = "没有"
  5. For Each out In Split(vbstr, Chr(32))
  6.   vbout = out & vbCrLf & vbout
  7.   For i = 1 To Len(out)
  8.     If InStr(vbk, Mid(out, i, 1)) = 0 Then
  9.       vbk = vbk & Mid(out, i, 1)
  10.       Else
  11.       judge = "有"
  12.     End If
  13.   Next
  14. Next
  15. MsgBox "千字文总字数为:" & Len(Replace(vbstr, Chr(32), "")) & "字," & judge & "重复"
  16. MsgBox vbout, , "倒序输出"
  17. Set fso = Nothing
复制代码

作者: CrLf    时间: 2011-6-1 12:47

本帖最后由 zm900612 于 2011-6-1 13:32 编辑

11# 523066680

还有别的方法,变量替换就至少有两三种

另外,大家别看第一题简单,其实方法不少,找到文本的规律就可以写出有针对性的思路,迥异的思路至少有三种
作者: 523066680    时间: 2011-6-1 12:59

本帖最后由 523066680 于 2011-6-1 13:09 编辑

第一题关于统计字符个数因为前人做过这么多折腾了,我就不折腾了,绕过。找最简单的,第二条。
以前有做过类似,我的目的是搞得结果人性化一点,代码没有优势
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set line=0
  4. for /f "tokens=*" %%a in (src2.txt) do (
  5. set /a line+=1
  6. call :next "%%a" !line!
  7. )
  8. pause
  9. exit
  10. :next
  11. set str=%~1
  12. set /a x=0,xb=1
  13. :lp
  14. set get=!str:~%x%,1!
  15. if "%get%"==" " (set /a x+=1 &goto :lp)
  16. if defined SPEC_%get% (
  17. echo    !SPEC_%get%:%get%=_%get%_!
  18. echo PK 行!line! !str:%get%=_%get%_!
  19. echo ,
  20. ) else (
  21. set SPEC_!str:~%x%,1!=行!line! !str!
  22. )
  23. set /a x+=1
  24. if not "!str:~%x%!"=="" (goto :lp) else (goto :eof)
复制代码
处理结果
  1.    行5 吊民伐罪 周[发]殷汤 坐朝问道 垂拱平章 爱育黎首 臣伏戎羌
  2. PK 行7 盖此身[发] 四大五常 恭惟鞠养 岂敢毁伤 女慕贞洁 男效才良
  3. ,
  4.    行2 闰馀成岁 律吕调阳 [云]腾致雨 露结为霜 金生丽水 玉出昆冈
  5. PK 行26 宣威沙漠 驰誉丹青 九州禹迹 百郡秦并 岳宗泰岱 禅主[云]亭
  6. ,
  7.    行2 闰馀成岁 律吕调阳 云腾致雨 露结为霜 金生丽水 玉出[昆]冈
  8. PK 行27 雁门紫塞 鸡田赤城 [昆]池碣石 巨野洞庭 旷远绵邈 岩岫杳冥
  9. ,
  10.    行3 剑号[巨]阙 珠称夜光 果珍李柰 菜重芥姜 海咸河淡 鳞潜羽翔
  11. PK 行27 雁门紫塞 鸡田赤城 昆池碣石 [巨]野洞庭 旷远绵邈 岩岫杳冥
  12. ,
  13.    行11 [资]父事君 曰严与敬 孝当竭力 忠则尽命 临深履薄 夙兴温凊
  14. PK 行28 治本于农 务[资]稼穑 俶载南亩 我艺黍稷 税熟贡新 劝赏黜陟
  15. ,
  16.    行32 欣奏累遣 [戚]谢欢招 渠荷的历 园莽抽条 枇杷晚翠 梧桐蚤凋
  17. PK 行35 亲[戚]故旧 老少异粮 妾御绩纺 侍巾帷房 纨扇圆絜 银烛炜煌
  18. ,
复制代码
哟呵,下划线改成方括号比较直观。
作者: plp626    时间: 2011-6-2 18:37

本帖最后由 plp626 于 2011-6-2 19:35 编辑

好早看到这个题,以为是给新手的。
今天看到几个老鸟的代码有些意外。
版主是在考大家的词频统计算法(联盟的精华帖那个),怎么没人用啊:
  1. @ECHO off&setlocal EnableDelayedExpansion
  2. Set $=&Set n=-1&for %%a in (
  3. 天地玄黄 宇宙洪荒 日月盈昃 辰宿列张 寒来暑往 秋收冬藏
  4. 闰馀成岁 律吕调阳 云腾致雨 露结为霜 金生丽水 玉出昆冈
  5. 剑号巨阙 珠称夜光 果珍李柰 菜重芥姜 海咸河淡 鳞潜羽翔
  6. 龙师火帝 鸟官人皇 始制文字 乃服衣裳 推位让国 有虞陶唐
  7. 吊民伐罪 周发殷汤 坐朝问道 垂拱平章 爱育黎首 臣伏戎羌
  8. 遐迩一体 率宾归王 鸣凤在竹 白驹食场 化被草木 赖及万方
  9. 盖此身发 四大五常 恭惟鞠养 岂敢毁伤 女慕贞洁 男效才良
  10. 知过必改 得能莫忘 罔谈彼短 靡恃己长 信使可复 器欲难量
  11. 墨悲丝染 诗赞羔羊 景行维贤 克念作圣 德建名立 形端表正
  12. 空谷传声 虚堂习听 祸因恶积 福缘善庆 尺璧非宝 寸阴是竞
  13. 资父事君 曰严与敬 孝当竭力 忠则尽命 临深履薄 夙兴温凊
  14. 似兰斯馨 如松之盛 川流不息 渊澄取映 容止若思 言辞安定
  15. 笃初诚美 慎终宜令 荣业所基 籍甚无竟 学优登仕 摄职从政
  16. 存以甘棠 去而益咏 乐殊贵贱 礼别尊卑 上和下睦 夫唱妇随
  17. 外受傅训 入奉母仪 诸姑伯叔 犹子比儿 孔怀兄弟 同气连枝
  18. 交友投分 切磨箴规 仁慈隐恻 造次弗离 节义廉退 颠沛匪亏
  19. 性静情逸 心动神疲 守真志满 逐物意移 坚持雅操 好爵自縻
  20. 都邑华夏 东西二京 背邙面洛 浮渭据泾 宫殿盘郁 楼观飞惊
  21. 图写禽兽 画彩仙灵 丙舍傍启 甲帐对楹 肆筵设席 鼓瑟吹笙
  22. 升阶纳陛 弁转疑星 右通广内 左达承明 既集坟典 亦聚群英
  23. 杜稿钟隶 漆书壁经 府罗将相 路侠槐卿 户封八县 家给千兵
  24. 高冠陪辇 驱毂振缨 世禄侈富 车驾肥轻 策功茂实 勒碑刻铭
  25. 磻溪伊尹 佐时阿衡 奄宅曲阜 微旦孰营 桓公匡合 济弱扶倾
  26. 绮回汉惠 说感武丁 俊乂密勿 多士寔宁 晋楚更霸 赵魏困横
  27. 假途灭虢 践土会盟 何遵约法 韩弊烦刑 起翦颇牧 用军最精
  28. 宣威沙漠 驰誉丹青 九州禹迹 百郡秦并 岳宗泰岱 禅主云亭
  29. 雁门紫塞 鸡田赤城 昆池碣石 巨野洞庭 旷远绵邈 岩岫杳冥
  30. 治本于农 务资稼穑 俶载南亩 我艺黍稷 税熟贡新 劝赏黜陟
  31. 孟轲敦素 史鱼秉直 庶几中庸 劳谦谨敕 聆音察理 鉴貌辨色
  32. 贻厥嘉猷 勉其祗植 省躬讥诫 宠增抗极 殆辱近耻 林皋幸即
  33. 两疏见机 解组谁逼 索居闲处 沉默寂寥 求古寻论 散虑逍遥
  34. 欣奏累遣 戚谢欢招 渠荷的历 园莽抽条 枇杷晚翠 梧桐蚤凋
  35. 陈根委翳 落叶飘摇 游鹍独运 凌摩绛霄 耽读玩市 寓目囊箱
  36. 易輶攸畏 属耳垣墙 具膳餐饭 适口充肠 饱饫烹宰 饥厌糟糠
  37. 亲戚故旧 老少异粮 妾御绩纺 侍巾帷房 纨扇圆絜 银烛炜煌
  38. 昼眠夕寐 蓝笋象床 弦歌酒宴 接杯举觞 矫手顿足 悦豫且康
  39. 嫡后嗣续 祭祀烝尝 稽颡再拜 悚惧恐惶 笺牒简要 顾答审详
  40. 骸垢想浴 执热愿凉 驴骡犊特 骇跃超骧 诛斩贼盗 捕获叛亡
  41. 布射僚丸 嵇琴阮啸 恬笔伦纸 钧巧任钓 释纷利俗 竝皆佳妙
  42. 毛施淑姿 工颦妍笑 年矢每催 曦晖朗曜 璇玑悬斡 晦魄环照
  43. 指薪修祜 永绥吉劭 矩步引领 俯仰廊庙 束带矜庄 徘徊瞻眺
  44. 孤陋寡闻 愚蒙等诮 谓语助者 焉哉乎也
  45. )do Set $=%%a^&echo/!$!&set/a n+=4
  46. ECHO %$%
  47. ECHO 总字数:%n%+1
  48. Set "$=!$:&echo/=!"
  49. for /l %%a in (0 1 %n%)do Set/a "_!$:~%%a,1!+=1"
  50. ECHO 重复字:
  51. Set _|find/v "=1"
  52. pause
复制代码
更新一下(修改关于字数n的计算):
  1. @ECHO off&setlocal EnableDelayedExpansion
  2. Set $=&Set n=&for %%a in (
  3. rem ----- 复制千字文 粘贴到这里 -------
  4. )do Set $=%%a^&echo/!$!&set/a n+=4
  5. ECHO 总字数:%n%
  6. Set "#=!$:&echo/=!"
  7. for /l %%a in (%n% -1 1)do Set/a "_!#:~-%%a,1!+=1"
  8. ECHO 重复字:
  9. Set _|find /v "=1"
  10. set/p=按任意键开始逆序输出
  11. ECHO %$%
  12. pause
复制代码

作者: mxxcgzxxx    时间: 2011-6-2 19:03

本帖最后由 mxxcgzxxx 于 2011-7-14 22:08 编辑

看到楼上的
  1. for /l %%a in (0 1 %n%)do Set/a "_!$:~%%a,1!+=1"
  2. Set _|find/v "=1"
复制代码
发现自己的思路是好窄!
但有趣的是我的机子在重复运行后会出错全都变成2了怎么回事?

原来是自己多复制了一次
作者: mxxcgzxxx    时间: 2011-7-14 21:57

本帖最后由 mxxcgzxxx 于 2011-7-14 22:07 编辑

在原基础上提高重字效率
  1. @ECHO OFF
  2. setlocal EnableDelayedExpansion
  3. set a=0
  4. for /f "tokens=1-6 delims= " %%1 in (千字文.txt) do (
  5.             set /a a+=1 & set "a!a!=%%1"
  6.             set /a a+=1 & set "a!a!=%%2"
  7.             set /a a+=1 & set "a!a!=%%3"
  8.             set /a a+=1 & set "a!a!=%%4"
  9.             set /a a+=1 & set "a!a!=%%5"
  10.             set /a a+=1 & set "a!a!=%%6"
  11.             )
  12. set /a b=%a%-6
  13. for /l %%i in (%b%,1,%a%) do if "!a%%i!"==""  set /a a-=1
  14. set /a b=%a%*4
  15. echo 《千字文》篇幅总计有%b%字;
  16. pause>nul
  17. set c=
  18. for /l %%i in (%a%,-1,1) do echo,!a%%i! &set c=!c!!a%%i!
  19. pause>nul
  20. set /a b-=1
  21. set f=
  22. for /l %%1 in (1,1,%b%) do (
  23.    set "a=!c:~0,1!"
  24.    set "c=!c:~1!"
  25.    for %%i in (!a!) do set "d=!c:%%i=!"
  26.    if "!d!" neq "!c!" set "f=!f! !a!"
  27.    )
  28. echo  有以下重字:%f%
  29. pause>nul
复制代码

作者: scarcr    时间: 2011-8-8 16:25

低效无脑流
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (qianzhiwen.txt) do (
  3. set a=%%i
  4. set a=!a: =!
  5. set b=!b!!a!
  6. )
  7. for /l %%i in (1 1 10000) do (
  8. set e=!b!
  9. if "!e!"=="" (goto b)
  10. set c=!e:~,1!
  11. set #%%i=!c!
  12. set /a n+=1
  13. set e=!e:~1!
  14. )
  15. :b
  16. echo there are !n! words in txt
  17. pause
  18. for /l %%i in (1 1 !n!) do (
  19. echo %%1
  20. pause
  21. call if not "%%b:!#%%i!=%%"=="!b:~1!" (set/a m+=1&&set s!m!=!#%%i!&&set b=!b:~1!))
  22. if not defined m (echo there are no repeating words in txt) else (
  23. echo there are !m! repeating words in txt , there are :
  24. for /l %%i in (1 1 !m!) do (echo !s%%i!)
  25. )
  26. pause
  27. set d=!n!
  28. :c
  29. if "!d!"=="0" (goto :eof&pause)
  30. set/a d3=!d!-3
  31. set/a d2=!d!-2
  32. set/a d1=!d!-1
  33. echo !#%d3%!!#%d2%!!#%d1%!!#%d%!
  34. set/a d=!d!-4
  35. goto c
复制代码

作者: keiamy    时间: 2014-4-8 20:41

笨方法也想了很久很久
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (a.txt) do (
  3. for %%j in (%%i) do (
  4. set /a n+=4
  5. set "str=%%j !str!")
  6. set "str1=!str: =!"
  7. call :lp !str!
  8. set str=)
  9. echo.&echo Total: %n%&echo.
  10. for /f "tokens=1,2 delims=.=" %%i in ('set .^|sort /+4 /r') do (
  11. if %%j gtr 1 (echo %%i = %%j&set str=flag) else (
  12. if not defined str echo 千字文沒有重字
  13. pause&exit))
  14. :lp
  15. if "%1" neq "" echo %1&shift
  16. set /a ".%str1:~,1%+=1"
  17. set "str1=%str1:~1%"
  18. if defined str1 goto lp
复制代码

作者: hu_contact    时间: 2014-5-12 20:21

  1. @echo off
  2. for /f "tokens=1-6" %%i in (千字文.txt) do call set words=%%words%%%%i%%j%%k%%l%%m%%n&call set wordsCopy=%%words%%
  3. echo %words%>tempTxt.txt
  4. for %%p in (tempTxt.txt) do set /a number=(%%~zp-2)/2&call echo 1.该文共计%%number%%个汉字。
  5. pause>nul
  6. echo 2.检查是否有重复的字
  7. set bool=no
  8. :loop
  9. set word=%words:~0,1%
  10. set words=囧%words:~1%囧
  11. for /f "delims=%word% tokens=1,2" %%a in ("%words%") do if "%%b" neq "" echo 发现重复的汉字:%word%。&set bool=yes
  12. for /f "delims=囧" %%p in ("%words%") do set words=%%p
  13. if "%words%" neq "囧囧" goto loop
  14. if "%bool%"=="no" echo 没有重复的汉子。
  15. pause>nul
  16. echo 3.倒序输出
  17. set /a group=%number%/4
  18. for /l %%k in (1,1,%group%) do call echo %%wordsCopy:~-4%%&call set wordsCopy=%%wordsCopy:~0,-4%%
  19. echo 干完活啦!&pause>nul
复制代码

作者: PowerShell    时间: 2014-5-12 22:52

我来也,powershell库丰富,我还是那个论点,学一年等于学bat5年,学一年等于学vbs3年。
这些题,都是powershell菜鸟题。

第一题:
把千字文读入字符串,然后unicode编码,-----这是负责,一般的做法,做了这一步后,中文,英文,乱码,空格啥的,都算一个字符。字符串自带长度属性,就是千字文的字符数,然后减去空格数量即可。


第二题
powershell 有 sort-object,具有排序去重功能。可以对数组对象去重,可以对行去重,当然了,这道题其实就是考核行去重。
。net 或者说powershell,的字符串类,有tochararray()方法。
用了这个方法后,“天地玄黄”就变成了 “天,地,玄,黄”即字符串变数组了。然后再去重,得出结果。
把千字文读入字符串,然后变成单个字符数组,然后再去重,然后和没去重前比较,得出结果。


第三题
多种解法,这里说说我的解法。
还把千字文读入字符串,然后以空格为分隔符,切割字符串,变成n个字串数组,数组第一个单位的内容为“天地玄黄”。然后按照 4321,8765,这样的顺序输出数组元素即可。

写出来的代码都极其简单,期待我群中菜鸟来作,敬请期待。。。
作者: PakTC    时间: 2014-5-12 23:11

我来也,powershell库丰富,我还是那个论点,学一年等于学bat5年,学一年等于学vbs3年。
这些题,都是powe ...
PowerShell 发表于 2014-5-12 22:52



   擦咧,原来Powershell要学一年? 让那些一个月学会其他语言的会员情何以堪?
作者: shelluserwlb    时间: 2014-11-9 13:20

本帖最后由 shelluserwlb 于 2014-11-10 07:41 编辑
  1. @echo off
  2. color 9e
  3. setlocal EnableDelayedExpansion
  4. set /a num=0
  5. for /f "tokens=1-6" %%i in (千字文.txt) do (
  6.     set /a num+=1 & set str!num!=%%i
  7.     set /a num+=1 & set str!num!=%%j
  8.     set /a num+=1 & set str!num!=%%k
  9.     set /a num+=1 & set str!num!=%%l
  10.     set /a num+=1 & set str!num!=%%m
  11.     set /a num+=1 & set str!num!=%%n
  12. )
  13. set /a a=%num%-6
  14. for /l %%i in (%a%,1,%num%) do if defined str%%i set /a a=%%i
  15. set /a total= a * 4
  16. echo 《千字文》共有汉字字数:%total%个
  17. set str=
  18. for /l %%i in (%a%,-1,1) do (
  19.     set str=!str!!str%%i:~0,1!
  20.     set str=!str!!str%%i:~1,1!
  21.     set str=!str!!str%%i:~2,1!
  22.     set str=!str!!str%%i:~3,1!
  23.     echo !str%%i!
  24. )
  25. echo.
  26. set dup=
  27. for /l %%i in (0,1,%total%) do (
  28.     set ch=!str:~%%i,1!
  29.     if defined str[!ch!] set dup=!dup! !ch!
  30.     set str[!ch!]=!ch!
  31. )
  32. echo 简体字版《千字文》中重复的字有:!dup!
  33. endlocal
  34. echo.& pause
复制代码

作者: ann    时间: 2014-12-14 19:46

新手,第二题不会。想了多久没想出来。第一题:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :qu
  4. for /f "tokens=1-6 delims= " %%a in (F:\1.txt) do (
  5.        set var=%%a&call :jq&set var=%%b&call :jq&set var=%%c&call :jq&set var=%%d&call :jq&set var=%%e&call :jq&set var=%%f&call :jq)
  6. echo 一共有%js%字
  7. goto end
  8. :jq
  9. if not "%var%"=="" (set d1=%var:~-4,1%&if not "!d1!"==" " (set /a js+=1)) else (goto :eof)
  10. if not "%var%"=="" (set d2=%var:~-3,1%&if not "!d2!"==" " (set /a js+=1)) else (goto :eof)
  11. if not "%var%"=="" (set d3=%var:~-2,1%&if not "!d3!"==" " (set /a js+=1)) else (goto :eof)
  12. if not "%var%"=="" (set d4=%var:~-1,1%&if not "!d1!"==" " (set /a js+=1)&goto :eof) else (goto :eof)
  13. :end
  14. pause>nul
复制代码

作者: taofan712    时间: 2017-2-15 11:40

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "delims=" %%a in (千字文.txt) do (
  4. for %%b in (%%a) do set /p=%%b<nul
  5. ))>temp.txt
  6. for /f "skip=4 tokens=3 delims= " %%c in ('dir temp.txt') do (
  7. set byte=%%c
  8. set /a num=!byte:,=!/2
  9. echo;千字文.txt中共有!num!个汉字&pause>nul
  10. )
复制代码
哈哈,就题解题,第一题可以这样做,请求【加分鼓励】
作者: niudd    时间: 2017-2-24 14:34

高手在民间!!
作者: sdjnab    时间: 2017-11-10 08:58

表示看不懂的路过,这个VBS还是BAT
作者: yhcfsr    时间: 2017-12-9 11:28

回复 2# Demon


    运行结果1002,应该是1000才对呀
作者: wtuldn    时间: 2018-1-1 12:55

@echo off
setlocal EnableDelayedExpansion
set m=0
for /f "delims=" %%a in (千字文.txt) do (
    set x=%%a
    call :next !x: =!
)
echo 千字文共有!m!字
pause

:next
set "var=%~1"
set n=0

:loop
call set str=%%var:~!n!,1%%
if "%str%"=="" goto :eof
set /a n+=1,m+=1
goto loop
作者: wtuldn    时间: 2018-1-3 02:58

第二题、第三题、第一题:
@echo off
setlocal EnableDelayedExpansion
for /f "delims=" %%a in (千字文.txt) do (
    for %%b in (%%a) do (
       set var=%%b
       for /l %%c in (0,1,3) do (
         set /a #!var:~%%c,1!+=1
        )   
     )
)
rem set #>>2.txt
  for /f "tokens=1,2 delims=#=" %%a in ('set #') do (
    if %%b gtr 1 echo 重复字:%%a 出现次数:%%b
)
echo:
echo:

for /f "tokens=1-6 delims= " %%a in (千字文.txt) do (
echo %%f
echo %%e
echo %%d
echo %%c
echo %%b
echo %%a
)
echo:
echo:
set m=0
for /f "delims=" %%a in (千字文.txt) do (
    set x=%%a
    call :next !x: =!
)
echo 千字文共有!m!字

:next
set "var=%~1"
set n=0

:loop
call set str=%%var:~!n!,1%%
if "%str%"=="" goto :eof
set /a n+=1,m+=1
goto loop

echo:
echo:

pause
作者: for_flr    时间: 2021-12-22 17:24

powershell练习一下题目。千字文保存为qzw.txt
  1. $txt=(gc qzw.txt).split()|?{$_ -ne ""}
  2. $dic=@{}
  3. foreach($w in $txt){
  4. for($i=0;$i -le 3;$i++){
  5. if (!$dic.containskey($w[$i])){
  6. $dic[$w[$i]]=1
  7. } else {
  8. $dic[$w[$i]]+=1
  9. }
  10. }
  11. }
  12. write-host "千字文中有以下重复字"
  13. $dic.getenumerator()|?{$_.value -gt 1}
  14. [console]::readkey()
复制代码

作者: 772074834    时间: 2023-5-12 16:17

@echo off
setlocal enabledelayedexpansion
set /a total=0
:: 4字组合的个数
set /a word4num=0
for /f "delims=" %%i in (test.txt) do (
        set line=%%i
        for %%j in (!line!) do (
                set word4=%%j
                set desmap!word4num!=!word4!
                set /a word4num+=1
                set /a total+=4
                for /l %%n in (0 1 3) do (
                        set temp=!word4:~%%n,1!
                        :: 打印重复的字
                        if defined dic[!temp!] echo !temp!重复
                        set dic[!temp!]=!temp!
                )
        )
)
:: 总的字数
echo 总字数:!total!
echo 点击继续,逆序打印
pause>nul
for /l %%m in (!word4num!, -1, 0) do (
        set descnum=%%m
        :: 逆序打印
        call echo %%desmap!descnum!%%
)
作者: LTSC1809    时间: 2023-6-5 22:37

话说可不可以每进行到一个字,就把它和全文每个字对比一遍,这样效率很低,但是我实在只能想到这种...




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2