中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 对称输出加分题(具有挑战性)
« [1] [2] [3] [4] [5] »
作者:
标题: 对称输出加分题(具有挑战性) 上一主题 | 下一主题
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 46 楼』:  

老土想得太多了

只有针对具体问题的解题代码
才需要考虑应用中的很多问题
比如异常处理、界面优化、缺省值等等

而现在讨论的只是一些原型化的代码
根本谈不上如何去应用
只需要抽象出问题的核心然后解决掉它就可以了

2008-7-12 13:55
查看资料  发短消息 网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 47 楼』:  

无须输入空格
@echo off&setlocal enabledelayedexpansion
set/p p=请输入:
set str=27j834fi56a901bghcde
set st=!str!&set pt=!p!
:lp
set ..!p:~%n%,1!=ok&set/a n+=1
set .!str:~,1!=!str:~-1,1!
set str=!str:~1,-1!
if defined str goto lp
:lp1
if defined ..%st:~,1% (set var1=!var1!%st:~,1%&set var2=!.%st:~,1%!!var2!)else (
if defined ..!.%st:~,1%! (set var1=!var1!%st:~,1%&set var2=!.%st:~,1%!!var2!)else set var1=!var1!#&set var2=#!var2!)
set st=!st:~1,-1!&set pt=!pt:~1!
if defined st goto lp1
echo !var1! ^| !var2!
pause


   此帖被 +9 点积分       点击查看详情   
评分人:【 bat-zw 分数: +9  时间:2008-7-13 09:34




简单!简单!再简单!
2008-7-13 03:11
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 48 楼』:  

这回对了。
兄这个if defined ..!.%st:~,1%!真用得叹为观止啊,学习了。



批处理之家新域名:www.bathome.net
2008-7-13 09:33
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
quya
高级用户

五星老土


积分 558
发帖 172
注册 2003-2-9
来自 江苏
状态 离线
『第 49 楼』:  

还是要挑点毛病。

其他的我看不懂, 就这句 set str=27j834fi56a901bghcde

好像还是不太通用啊。

同志们,请原谅我,我水平不行,挑刺还可以。



我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
2008-7-13 09:53
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 50 楼』:  



  Quote:
Originally posted by quya at 2008-7-13 09:53:
还是要挑点毛病。

其他的我看不懂, 就这句 set str=27j834fi56a901bghcde

好像还是不太通用啊。

同志们,请原谅我,我水平不行,挑刺还可以。

老土,这个set是根据情况来的,如要对称的是数字和字母,就set str=数字+字母,如要对称的是数字和汉字,就set str=数字+汉字,如要对称关系是没有规律的,就如terse兄如此set了。



批处理之家新域名:www.bathome.net
2008-7-13 10:14
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
quya
高级用户

五星老土


积分 558
发帖 172
注册 2003-2-9
来自 江苏
状态 离线
『第 51 楼』:  



  Quote:
Originally posted by zw19750516 at 2008-7-13 10:14 AM:

老土,这个set是根据情况来的,如要对称的是数字和字母,就set str=数字+字母,如要对称的是数字和汉字,就set str=数字+汉字,如要对称关系是没有规律的,就如terse兄如此set了。

我对你题的理解是对称和数字,字母无关。

只要找到输入的值, 就在那个位置显示, 然后再在那个位置的对称位置显示。数字和字母都可以乱序。

所以我对你们的解题思路都很疑惑。

比如像下面这样乱序和重复的, (有2个0), 也能显示正确。

但我目前还无法解决原来字符中有空格的。输入的时候倒是可以有空格。
@echo off
set/p input=请输入:
set "string=012t457689aycd0fghi3"
set num=
:pro1
set /a num+=1
set strtmp=%string:~0,1%%string:~-1%
set str%num%=##
rem 下面这句是 findstr [] 类方面的应用
echo %input%|findstr [%strtmp%]>nul&&set str%num%=%strtmp%
set string=%string:~1,-1%
if not defined string goto pro2
goto pro1

:pro2
setlocal enabledelayedexpansion
set str_1=x
for /l %%i in (1,1,%num%) do call set str_1=!str_1:~0,-1!%%str%%i%%
for /l %%i in (1,1,%num%) do call set str_2=%%str%%i%%!str_2:~1!
echo %str_1:~,-1% ^| %str_2:~1,-2%

pause
[ Last edited by quya on 2008-7-13 at 10:35 AM ]



我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
2008-7-13 10:26
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 52 楼』:  

是可以乱序啊,你甚至还可以通过代码来生成,如:
@echo off
set code=0123456789abcdefghijklmnopqrstuvwxyz&set n=36
:again
set /a a=%random%%%n%
call,set a=%%code:~%a%,1%%
call,set code=%%code:%a%=%%
set str=%str%%a%&set /a n-=1
if %n% neq 16 goto again
echo %str%&pause>nul




批处理之家新域名:www.bathome.net
2008-7-13 10:39
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
quya
高级用户

五星老土


积分 558
发帖 172
注册 2003-2-9
来自 江苏
状态 离线
『第 53 楼』:  

那楼主通过你的乱序再检验一下所有的解题看看。

程序只能改 set code=任意字符 这句, 任意字符的意思是原来给定是什么,就写什么。

[ Last edited by quya on 2008-7-13 at 10:58 AM ]



我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
2008-7-13 10:55
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 54 楼』:  

呵呵,老土还真是执著啊,
你试试 38 楼的代码,
已经对人机交互作了处理,可以不输入空格,也可以输入。
缺点是:   任意字符中不能有重复的。



致精致简!
2008-7-13 11:13
查看资料  发短消息 网志   编辑帖子  回复  引用回复
quya
高级用户

五星老土


积分 558
发帖 172
注册 2003-2-9
来自 江苏
状态 离线
『第 55 楼』:  



  Quote:
Originally posted by 26933062 at 2008-7-13 11:13 AM:
呵呵,老土还真是执著啊,
你试试 38 楼的代码,
已经对人机交互作了处理,可以不输入空格,也可以输入。
缺点是:   任意字符中不能有重复的。

试了下 当 set "str=012t456789abcd6fghi3"

输入36 不能正确显示。

而我37楼代码完全准确, 总算胜了众高手一回。

只是感到自己还不算太笨,没别的意思啊。

[ Last edited by quya on 2008-7-13 at 11:34 AM ]



我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
2008-7-13 11:32
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 56 楼』:  



  Quote:
Originally posted by quya at 2008-7-13 11:32:


试了下 当 set "str=012t456789abcd6fghi3"

输入36 不能正确显示。

而我37楼代码完全准确, 总算胜了众高手一回。

只是感到自己还不算太笨 ...

都说了不能有重复的,你这里有两个6啊?



致精致简!
2008-7-13 11:42
查看资料  发短消息 网志   编辑帖子  回复  引用回复
quya
高级用户

五星老土


积分 558
发帖 172
注册 2003-2-9
来自 江苏
状态 离线
『第 57 楼』:  

又想了一个, 这个应该是最简单的了。连延迟变量都没用。
@echo off
set/p input=请输入:
set string=0123456789abcdefghij
set "str= "

:loop
set str=%string:~-1%%str%%string:~0,1%
echo %input%|findstr [%string:~-1%%string:~0,1%]>nul||set str=#%str:~1,-1%%#
set string=%string:~1,-1%
if not defined string goto end
goto loop

:end
for /f "tokens=1,2 delims= " %%i in ("%str%") do echo %%j ^| %%i
pause
其实我想用延迟变量, 但不会用, 刚开始我想类似下边这样写法。
setlocal EnableDelayedExpansion
set string=0123456789abcdefghij
for /l %%i in (1,1,10) do (
set string=!string:~1,-1!
echo !string!
if not defined string goto end)
我期望的结果是 变量 String 慢慢变短,但第一步不成功, 后边的构思就全完了。我真的一直不明白为什么我达不到我要的结果, 高人请指点, 谢谢!

[ Last edited by quya on 2008-7-14 at 10:39 AM ]



我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
2008-7-13 19:38
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 58 楼』:  

老土,代码第一是考虑效率,第二才是简洁,你这个方案存在效率问题,同时('echo %str%')可以修改为("%str%")。



批处理之家新域名:www.bathome.net
2008-7-14 08:38
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
quya
高级用户

五星老土


积分 558
发帖 172
注册 2003-2-9
来自 江苏
状态 离线
『第 59 楼』:  

我57楼这么简单的代码存在效率问题? 试简析下, 谢谢.

%str%已按你建议修改, 但我依旧不知其所以然. 当初光写了%str% ,程序把这个变量当文件, 才ECHO, 不知道可以加 "".

[ Last edited by quya on 2008-7-14 at 10:41 AM ]



我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
2008-7-14 10:28
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 60 楼』:  

效率问题出在这里:echo %input%|findstr [%string:~-1%%string:~0,1%]>nul||set str=#%str:~1,-1%%#
在批处理中要尽量用if做判断,少用findstr。



批处理之家新域名:www.bathome.net
2008-7-14 10:39
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
« [1] [2] [3] [4] [5] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: