批处理之家's Archiver

CrLf 发表于 2011-5-31 18:34

批处理检查《千字文》是否有重复字

[i=s] 本帖最后由 zm900612 于 2011-5-31 22:52 编辑 [/i]

[color=YellowGreen]千字文是中华民族的文化瑰宝,与三字经、百家姓合称“三百千”,历来是启蒙教材。白话盛行的今天,一群幼童摇头晃脑背书的场面几乎绝迹,而“天地玄黄,宇宙洪荒。日月盈仄,辰宿列张”的悠长吟诵声也悄然远去。
作为华夏儿女、龙的传人,何不在学批处理的同时重温国学经典。[/color]
以下三道题目,希望大家不仅只是解题,还能够能广开思路,举一反三:
1、计算千字文全文字数
2、证明千字文是否有重复字,若有则列举出来
3、四个字一组,逆序输出,组内字符顺序不变
比如:[code]天地玄黄 宇宙洪荒 日月盈昃 辰宿列张[/code]颠倒后:[code]辰宿列张
日月盈昃
宇宙洪荒
天地玄黄[/code]提示:
1、2题解题时空格不算在内,只判断汉字汉字。可以就题解题
评分依据:
思路>效率>简洁>无临时文件
以此为根据,评分从1~15分不等,非常优秀的思路另加5pb、1技术

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

Demon 发表于 2011-5-31 19:36

[i=s] 本帖最后由 Demon 于 2011-5-31 19:58 编辑 [/i]

第一题[code]
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "delims=" %%i IN (千字文.txt) DO CALL :strlen %%i
ECHO %n%
PAUSE & GOTO :EOF

:strlen
    SET str=%*
    SET str=%str: =%
    :strlen_loop
    IF "%str%" NEQ "" (
        SET /A n += 1
        SET str=!str:~1!
        GOTO :strlen_loop
    )
GOTO :EOF
[/code]

Demon 发表于 2011-5-31 19:50

[i=s] 本帖最后由 Demon 于 2011-5-31 20:16 编辑 [/i]

第二题无法证明,“发 云 昆 巨 资 戚”这几个字不是重复了么?[code]
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "delims=" %%i IN (千字文.txt) DO CALL :check %%i
PAUSE & GOTO :EOF

:check
    SET str=%*
    SET str=%str: =%
    :check_loop
    IF "%str%" NEQ "" (
        SET c=!str:~0,1!
        SET str=!str:~1!
        IF DEFINED dic[!c!] CALL ECHO %%dic[!c!]%% 重复
        SET dic[!c!]=!c!
        GOTO :check_loop
    )
GOTO :EOF
[/code]

CrLf 发表于 2011-5-31 19:58

[b] [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=80980&ptid=12590]2#[/url] [i]Demon[/i] [/b]


能用for的地方建议不用call或goto,思路还有拓展的空间,不妨进一步展开想象。

CrLf 发表于 2011-5-31 20:13

[b] [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=80985&ptid=12590]3#[/url] [i]Demon[/i] [/b]


哈哈,这倒是,检查了下原来是我自己的代码错了,感谢提醒!

mxxcgzxxx 发表于 2011-5-31 22:31

[i=s] 本帖最后由 mxxcgzxxx 于 2011-5-31 22:50 编辑 [/i]

答个1,3,2题[code]@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
set a=0
for /f "tokens=1-6 delims= " %%1 in (千字文.txt) do (
            set /a a+=1 & set "a!a!=%%1"
            set /a a+=1 & set "a!a!=%%2"
            set /a a+=1 & set "a!a!=%%3"
            set /a a+=1 & set "a!a!=%%4"
            set /a a+=1 & set "a!a!=%%5"
            set /a a+=1 & set "a!a!=%%6"
            )
set /a b=%a%-6
for /l %%i in (%b%,1,%a%) do if "!a%%i!"==""  set /a a-=1
set /a b=%a%*4
echo 《千字文》篇幅总计有%b%字;
pause>nul
set c=
for /l %%i in (%a%,-1,1) do echo,!a%%i! &set c=!c!!a%%i!
pause>nul
set /a d=b-1
set f=
for /l %%i in (1,1,%d%) do (
         set /a e=%%i+1
         for /l %%1 in (!e!,1,%b%) do if "!c:~%%i,1!"=="!c:~%%1,1!" set "f=!f! !c:~%%i,1!"
         )
echo  有以下重字:%f%
pause>nul[/code]

CrLf 发表于 2011-5-31 22:51

[b] [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=81009&ptid=12590]6#[/url] [i]mxxcgzxxx[/i] [/b]


思路很好,找到了文本的规律所在,这是高效的前提。
不过代码还可以进一步简化。

mxxcgzxxx 发表于 2011-5-31 22:53

我的重字较对那里花的时间有点多!

neorobin 发表于 2011-5-31 23:46

[i=s] 本帖最后由 neorobin 于 2011-5-31 23:49 编辑 [/i]

计算字串长度, 没有比此处
[url]http://www.bathome.net/viewthread.php?tid=11799&page=1&fromuid=20015#pid74946[/url]
更好的代码, 就不写了[code]@echo off & setlocal enableDelayedExpansion
for /f "delims=:" %%n in ('findstr /n /b /e :text "%~0"') do set jump=%%n
for /f "skip=%jump% usebackq delims=" %%l in ("%~0") do set text=!text!%%l
set text=!text: =!
set kiloChr=!text!$

for /l %%i in (999 -1 0) do (
  set tmp=!kiloChr!
  for %%c in (!kiloChr:~%%i^,1!) do (
    set kiloChr=!kiloChr:%%c=!
    if #!kiloChr:~%%i! neq #$ (
      set kiloChr=!tmp:~0,-2!$
      set duplicate=!duplicate!%%c
    )
  )
)
set duplicate
pause

for /l %%p in (12 16 1004) do (
  set /a qMin=%%p-12
  for /l %%q in (%%p -4 !qMin!) do echo,!text:~%%q,4!
)
pause
exit

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

batman 发表于 2011-6-1 12:05

先给个计算字数的vbs:[code]
Dim vbstr, fso
Set fso = CreateObject("scripting.filesystemobject")
vbstr = fso.OpenTextFile("a.txt").ReadAll()
MsgBox "千字文总字数为:" & Len(Replace(Replace(vbstr, Chr(32), ""), vbCrLf, ""))
Set fso = Nothing
[/code]

523066680 发表于 2011-6-1 12:38

那个, 检查重复字的是不是用 那个文字做变量名,然后用if defined ... 来判断是否重复的。

batman 发表于 2011-6-1 12:44

完整的:[code]
Dim vbstr, fso, vbout, out, vbk, judge
Set fso = CreateObject("scripting.filesystemobject")
vbstr = Replace(fso.OpenTextFile("a.txt").ReadAll(), vbCrLf, "")
judge = "没有"
For Each out In Split(vbstr, Chr(32))
  vbout = out & vbCrLf & vbout
  For i = 1 To Len(out)
    If InStr(vbk, Mid(out, i, 1)) = 0 Then
      vbk = vbk & Mid(out, i, 1)
      Else
      judge = "有"
    End If
  Next
Next
MsgBox "千字文总字数为:" & Len(Replace(vbstr, Chr(32), "")) & "字," & judge & "重复"
MsgBox vbout, , "倒序输出"
Set fso = Nothing
[/code]

CrLf 发表于 2011-6-1 12:47

[i=s] 本帖最后由 zm900612 于 2011-6-1 13:32 编辑 [/i]

[b] [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=81067&ptid=12590]11#[/url] [i]523066680[/i] [/b]

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

另外,大家别看第一题简单,其实方法不少,找到文本的规律就可以写出有针对性的思路,迥异的思路至少有三种

523066680 发表于 2011-6-1 12:59

[i=s] 本帖最后由 523066680 于 2011-6-1 13:09 编辑 [/i]

第一题关于统计字符个数因为前人做过这么多折腾了,我就不折腾了,绕过。找最简单的,第二条。
以前有做过类似,我的目的是搞得结果人性化一点,代码没有优势[code]
@echo off
setlocal enabledelayedexpansion
set line=0
for /f "tokens=*" %%a in (src2.txt) do (
        set /a line+=1
        call :next "%%a" !line!
)
pause
exit

:next
set str=%~1
set /a x=0,xb=1
:lp
        set get=!str:~%x%,1!
        if "%get%"==" " (set /a x+=1 &goto :lp)
        if defined SPEC_%get% (
                echo    !SPEC_%get%:%get%=_%get%_!
                echo PK 行!line! !str:%get%=_%get%_!
                echo ,
        ) else (
                set SPEC_!str:~%x%,1!=行!line! !str!
        )
        set /a x+=1
        if not "!str:~%x%!"=="" (goto :lp) else (goto :eof)
[/code]处理结果[code]
   行5 吊民伐罪 周[发]殷汤 坐朝问道 垂拱平章 爱育黎首 臣伏戎羌
PK 行7 盖此身[发] 四大五常 恭惟鞠养 岂敢毁伤 女慕贞洁 男效才良
,
   行2 闰馀成岁 律吕调阳 [云]腾致雨 露结为霜 金生丽水 玉出昆冈
PK 行26 宣威沙漠 驰誉丹青 九州禹迹 百郡秦并 岳宗泰岱 禅主[云]亭
,
   行2 闰馀成岁 律吕调阳 云腾致雨 露结为霜 金生丽水 玉出[昆]冈
PK 行27 雁门紫塞 鸡田赤城 [昆]池碣石 巨野洞庭 旷远绵邈 岩岫杳冥
,
   行3 剑号[巨]阙 珠称夜光 果珍李柰 菜重芥姜 海咸河淡 鳞潜羽翔
PK 行27 雁门紫塞 鸡田赤城 昆池碣石 [巨]野洞庭 旷远绵邈 岩岫杳冥
,
   行11 [资]父事君 曰严与敬 孝当竭力 忠则尽命 临深履薄 夙兴温凊
PK 行28 治本于农 务[资]稼穑 俶载南亩 我艺黍稷 税熟贡新 劝赏黜陟
,
   行32 欣奏累遣 [戚]谢欢招 渠荷的历 园莽抽条 枇杷晚翠 梧桐蚤凋
PK 行35 亲[戚]故旧 老少异粮 妾御绩纺 侍巾帷房 纨扇圆絜 银烛炜煌
,

[/code]哟呵,下划线改成方括号比较直观。

plp626 发表于 2011-6-2 18:37

[i=s] 本帖最后由 plp626 于 2011-6-2 19:35 编辑 [/i]

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

mxxcgzxxx 发表于 2011-6-2 19:03

[i=s] 本帖最后由 mxxcgzxxx 于 2011-7-14 22:08 编辑 [/i]

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

原来是自己多复制了一次

mxxcgzxxx 发表于 2011-7-14 21:57

[i=s] 本帖最后由 mxxcgzxxx 于 2011-7-14 22:07 编辑 [/i]

在原基础上提高重字效率[code]@ECHO OFF
setlocal EnableDelayedExpansion
set a=0
for /f "tokens=1-6 delims= " %%1 in (千字文.txt) do (
            set /a a+=1 & set "a!a!=%%1"
            set /a a+=1 & set "a!a!=%%2"
            set /a a+=1 & set "a!a!=%%3"
            set /a a+=1 & set "a!a!=%%4"
            set /a a+=1 & set "a!a!=%%5"
            set /a a+=1 & set "a!a!=%%6"
            )
set /a b=%a%-6
for /l %%i in (%b%,1,%a%) do if "!a%%i!"==""  set /a a-=1
set /a b=%a%*4
echo 《千字文》篇幅总计有%b%字;
pause>nul
set c=
for /l %%i in (%a%,-1,1) do echo,!a%%i! &set c=!c!!a%%i!
pause>nul
set /a b-=1
set f=
for /l %%1 in (1,1,%b%) do (
   set "a=!c:~0,1!"
   set "c=!c:~1!"
   for %%i in (!a!) do set "d=!c:%%i=!"
   if "!d!" neq "!c!" set "f=!f! !a!"
   )
echo  有以下重字:%f%
pause>nul[/code]

scarcr 发表于 2011-8-8 16:25

低效无脑流[code]
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (qianzhiwen.txt) do (
        set a=%%i
        set a=!a: =!
        set b=!b!!a!
        )

for /l %%i in (1 1 10000) do (
        set e=!b!
        if "!e!"=="" (goto b)
        set c=!e:~,1!
        set #%%i=!c!
        set /a n+=1
        set e=!e:~1!
        )

:b
echo there are !n! words in txt
pause

for /l %%i in (1 1 !n!) do (
        echo %%1
        pause
        call if not "%%b:!#%%i!=%%"=="!b:~1!" (set/a m+=1&&set s!m!=!#%%i!&&set b=!b:~1!))
if not defined m (echo there are no repeating words in txt) else (
        echo there are !m! repeating words in txt , there are :
        for /l %%i in (1 1 !m!) do (echo !s%%i!)
        )
pause
set d=!n!
:c
if "!d!"=="0" (goto :eof&pause)
set/a d3=!d!-3
set/a d2=!d!-2
set/a d1=!d!-1
echo !#%d3%!!#%d2%!!#%d1%!!#%d%!
set/a d=!d!-4
goto c
[/code]

keiamy 发表于 2014-4-8 20:41

笨方法也想了很久很久[code]
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (a.txt) do (
for %%j in (%%i) do (
set /a n+=4
set "str=%%j !str!")
set "str1=!str: =!"
call :lp !str!
set str=)
echo.&echo Total: %n%&echo.

for /f "tokens=1,2 delims=.=" %%i in ('set .^|sort /+4 /r') do (
if %%j gtr 1 (echo %%i = %%j&set str=flag) else (
if not defined str echo 千字文沒有重字
pause&exit))

:lp
if "%1" neq "" echo %1&shift
set /a ".%str1:~,1%+=1"
set "str1=%str1:~1%"
if defined str1 goto lp
[/code]

hu_contact 发表于 2014-5-12 20:21

[code]@echo off
for /f "tokens=1-6" %%i in (千字文.txt) do call set words=%%words%%%%i%%j%%k%%l%%m%%n&call set wordsCopy=%%words%%
echo %words%>tempTxt.txt
for %%p in (tempTxt.txt) do set /a number=(%%~zp-2)/2&call echo 1.该文共计%%number%%个汉字。
pause>nul

echo 2.检查是否有重复的字
set bool=no
:loop
set word=%words:~0,1%
set words=囧%words:~1%囧
for /f "delims=%word% tokens=1,2" %%a in ("%words%") do if "%%b" neq "" echo 发现重复的汉字:%word%。&set bool=yes
for /f "delims=囧" %%p in ("%words%") do set words=%%p
if "%words%" neq "囧囧" goto loop
if "%bool%"=="no" echo 没有重复的汉子。
pause>nul

echo 3.倒序输出
set /a group=%number%/4
for /l %%k in (1,1,%group%) do call echo %%wordsCopy:~-4%%&call set wordsCopy=%%wordsCopy:~0,-4%%
echo 干完活啦!&pause>nul[/code]

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

[quote]我来也,powershell库丰富,我还是那个论点,学一年等于学bat5年,学一年等于学vbs3年。
这些题,都是powe ...
[size=2][color=#999999]PowerShell 发表于 2014-5-12 22:52[/color] [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=148171&ptid=12590][img]http://bbs.bathome.net/images/common/back.gif[/img][/url][/size][/quote]


   擦咧,原来Powershell要学一年? 让那些一个月学会其他语言的会员情何以堪?

shelluserwlb 发表于 2014-11-9 13:20

[i=s] 本帖最后由 shelluserwlb 于 2014-11-10 07:41 编辑 [/i]

[code]@echo off
color 9e
setlocal EnableDelayedExpansion
set /a num=0
for /f "tokens=1-6" %%i in (千字文.txt) do (
    set /a num+=1 & set str!num!=%%i
    set /a num+=1 & set str!num!=%%j
    set /a num+=1 & set str!num!=%%k
    set /a num+=1 & set str!num!=%%l
    set /a num+=1 & set str!num!=%%m
    set /a num+=1 & set str!num!=%%n
)
set /a a=%num%-6
for /l %%i in (%a%,1,%num%) do if defined str%%i set /a a=%%i
set /a total= a * 4
echo 《千字文》共有汉字字数:%total%个
set str=
for /l %%i in (%a%,-1,1) do (
    set str=!str!!str%%i:~0,1!
    set str=!str!!str%%i:~1,1!
    set str=!str!!str%%i:~2,1!
    set str=!str!!str%%i:~3,1!
    echo !str%%i!
)
echo.
set dup=
for /l %%i in (0,1,%total%) do (
    set ch=!str:~%%i,1!
    if defined str[!ch!] set dup=!dup! !ch!
    set str[!ch!]=!ch!
)
echo 简体字版《千字文》中重复的字有:!dup!
endlocal
echo.& pause[/code]

ann 发表于 2014-12-14 19:46

新手,第二题不会。想了多久没想出来。第一题:[code]@echo off
setlocal enabledelayedexpansion
:qu
for /f "tokens=1-6 delims= " %%a in (F:\1.txt) do (
       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)
echo 一共有%js%字
goto end
:jq
if not "%var%"=="" (set d1=%var:~-4,1%&if not "!d1!"==" " (set /a js+=1)) else (goto :eof)
if not "%var%"=="" (set d2=%var:~-3,1%&if not "!d2!"==" " (set /a js+=1)) else (goto :eof)
if not "%var%"=="" (set d3=%var:~-2,1%&if not "!d3!"==" " (set /a js+=1)) else (goto :eof)
if not "%var%"=="" (set d4=%var:~-1,1%&if not "!d1!"==" " (set /a js+=1)&goto :eof) else (goto :eof)
:end
pause>nul[/code]

taofan712 发表于 2017-2-15 11:40

[code]@echo off
setlocal enabledelayedexpansion
(for /f "delims=" %%a in (千字文.txt) do (
        for %%b in (%%a) do set /p=%%b<nul
))>temp.txt
for /f "skip=4 tokens=3 delims= " %%c in ('dir temp.txt') do (
        set byte=%%c
        set /a num=!byte:,=!/2
        echo;千字文.txt中共有!num!个汉字&pause>nul
)[/code]哈哈,就题解题,第一题可以这样做,请求【加分鼓励】

niudd 发表于 2017-2-24 14:34

高手在民间!!

sdjnab 发表于 2017-11-10 08:58

表示看不懂的路过,这个VBS还是BAT

yhcfsr 发表于 2017-12-9 11:28

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=80980&ptid=12590]2#[/url] [i]Demon[/i] [/b]


    运行结果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

页: [1] 2

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.