中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-13 23:57
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 对称输出加分题(具有挑战性)
61 发表于 2008-07-14 10:48 ·  中国 江苏 苏州 常熟市 电信
高级用户
★★
五星老土
积分 558
发帖 172
注册 2003-02-09 00:00
UID 881
性别 男
来自 江苏
状态 离线
Originally posted by zw19750516 at 2008-7-14 10:39 AM:
效率问题出在这里:echo %input%|findstr >nul||set str=#%str:~1,-1%%#
在批处理中要尽量用if做判断,少用findstr。


如前所述, 这是为了兼容性. 我最得意的就是这句了. 而且实际上这里只存在2个字母的判断, 你的CODE再长, 也依旧是2个字母.

高效率和简洁应该建立在准确的前提上吧?

比较了38楼的代码, 运行速度快我很多, 我承认, 因为几乎在瞬间给出答案. 但正如作者所言无法处理重复字母.

我的57楼代码需要等待一下. 想改进但囿于水平问题, 无法再提高了.
另外, 谁能告诉我57楼第二段代码错在哪里? 谢谢了


[ Last edited by quya on 2008-7-14 at 11:20 AM ]
我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
62 发表于 2008-07-14 13:00 ·  中国 江苏 苏州 常熟市 电信
高级用户
★★
五星老土
积分 558
发帖 172
注册 2003-02-09 00:00
UID 881
性别 男
来自 江苏
状态 离线
Originally posted by zw19750516 at 2008-7-14 08:38 AM:
老土,代码第一是考虑效率,第二才是简洁,你这个方案存在效率问题,同时('echo %str%')可以修改为("%str%")。


考虑了下, 不得不面对效率不高的问题, 所以修改如下:


@echo off
set/p input=请输入:
set string=0123456789abcdefghij

:pro1
set str=%input:~0,1%
set input=%input:~1%
call set string=%%string:%str%=#%%
if defined input goto pro1
set "str= "

:pro2
set str=%string:~-1%%str%%string:~0,1%
if %string:~0,1%==# set str=#%str:~1,-1%%#
if %string:~-1%==# set str=#%str:~1,-1%%#
set string=%string:~1,-1%
if not defined string goto end
goto pro2

:end
for /f "tokens=1,2 delims= " %%i in ("%str%") do echo %%j ^| %%i
pause


这下速度同样飞快了.
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
bat-zw +6 2008-07-14 16:06
我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
63 发表于 2008-07-14 16:08 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
UID 112398
性别 男
状态 离线
还有个问题要指出一下:
if 判断语句的最好加上引号 if "%string:~0,1%"=="#" 或 if "%string:~0,1%" equ "#"
批处理之家新域名:www.bathome.net
64 发表于 2008-07-14 18:34 ·  中国 山西 电信
银牌会员
★★★
天的白色影子
积分 2,343
发帖 636
注册 2004-03-06 00:00
UID 19350
性别 男
状态 离线
再精简一下,思路更加清晰


@echo off
set/p input=请输入:
set tab=012t456789abcd6fghi3

:pro1
call set tab=%%tab:%input:~0,1%=#%%
set input=%input:~1%
if defined input goto pro1

set "out= "
:pro2
set out=#%out%#
if not "%tab:~0,1%"=="#" if not "%tab:~-1%"=="#" set out=%tab:~-1%%out:~1,-1%%tab:~0,1%
set tab=%tab:~1,-1%
if defined tab goto pro2

for /f "tokens=1,2 delims= " %%i in ("%out%") do echo %%j ^| %%i
pause
65 发表于 2008-07-14 23:58 ·  中国 江苏 常州 溧阳市 电信
银牌会员
★★★
积分 2,404
发帖 946
注册 2005-09-08 13:44
UID 42345
状态 离线
Originally posted by qzwqzw at 2008-7-14 18:34:
再精简一下,思路更加清晰

@echo off
set/p input=请输入:
set tab=012t456789abcd6fghi3
:pro1
call set tab=%%tab:%input:~0,1%=#%%
set input=%input:~1%
if defined input ...

怎么显示输入的变成#
我改一下

@echo off
setlocal enabledelayedexpansion
set/p input=请输入:
set tab=012t456789abcd6fghi3
set str=%tab%
set /a n-=1,m=0
:pro1
call set tab=%%tab:%input:~0,1%=#%%
set input=%input:~1%
if defined input goto pro1
:pro2
set/a n+=1,m-=1
if "!tab:~,1!"=="#" (set var1=!var1!!str:~%n%,1!&set var2=!str:~%m%,1!!var2!)else (
if "!tab:~-1!"=="#" (set var1=!var1!!str:~%n%,1!&set var2=!str:~%m%,1!!var2!)else set var1=%var1%#&set var2=#%var2%)
set tab=%tab:~1,-1%
if defined tab goto pro2
echo %var1% ^| %var2%
pause
简单!简单!再简单!
‹ 上一页 1 3 4 5
论坛跳转: