中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-13 22:11
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 对称输出加分题(具有挑战性)
楼 主 对称输出加分题(具有挑战性) 发表于 2008-07-10 21:16 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
UID 112398
性别 男
状态 离线

-----------------------------------
有如下对应关系:
0123456789 | abcdefghij
要求写出人机交互批处理,
-----------------------------------
当输入7时,输出如下:
#######7## | ##c#######
当输入a5时,输出如下:
#####5###9 | a###e#####
当输入12j时,输出如下:
012####### | #######hij
-----------------------------------
1 本人会视解题思路和技巧予以加分(重在思路)。
2 如不想处理特殊字符,可以略去中间的|不输出。
3 请在解答时注意代码的通用性,并请尽量保持代码简洁(考虑问题复杂化,解决
问题简单化)。
4 在人机交互界面时进行输入时可尽量为解题提供便利。
5 不需写出对输入字符进行判断的代码部分。
-----------------------------------

-----------------------------------
pusofalse兄弟在15楼已第一个解答出此题,但其代码明显过于复杂且不通用,因
此仅加上1分。
本人也在25楼给出了一个解决方案(代码还是复杂点了)。
已有多种解决方案(10楼、25楼、26楼、28楼、29楼、35楼、37楼、38楼...),
个人还是倾向于在28楼给出的方案(最佳方案还要大家来评定),代码如下:

@echo off&setlocal enabledelayedexpansion
set str=0j 1i 2h 3g 4f 5e 6d 7c 8b 9a
set /p code=请输入字符,中间请用空格格开:
for %%a in (%str%) do (set a=%%a
for %%i in (%code%) do (
if "%%i" equ "!a:~,1!" set flag=a
if "%%i" equ "!a:~1!" set flag=a
)
if defined flag (
set str1=!str1!!a:~,1!&set str2=!a:~1!!str2!&set "flag="
) else (
set str1=!str1!#&set str2=#!str2!
))
cls&echo %str1% ^| %str2%&pause>nul

本人认为此代码集合了思路清晰、通用、简洁、高效等特点。
特此推介terse兄的代码如下:

@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

-----------------------------------
在此谢谢大家对本贴的踊跃回复,但唯一感到不足的就是基本都是高级会员
(quya老土其实也是位元老级的会员),而少见新人的踪迹,希望新人都有勇于挑
战的精神,我不断出题的原意也在于此了。
-----------------------------------


[ Last edited by zw19750516 on 2008-7-13 at 09:44 AM ]
批处理之家新域名:www.bathome.net
2 发表于 2008-07-10 21:41 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
UID 73968
性别 男
状态 离线
可不可能输入 2a5f 这样字母和数字交错的情况?
致精致简!
3 发表于 2008-07-10 21:42 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
UID 112398
性别 男
状态 离线
有可能,这也不影响啊。
批处理之家新域名:www.bathome.net
4 发表于 2008-07-10 22:18 ·  中国 福建 三明 电信
中级用户
★★
积分 458
发帖 211
注册 2006-07-26 19:42
UID 59307
状态 离线
如果输入的是e5呢?

==!
是挺难的,很费脑子。

[ Last edited by wxcute on 2008-7-10 at 10:29 PM ]
┌───────┐
├→学习→实践→┤
└───────┘
5 发表于 2008-07-10 22:27 ·  中国 山东 淄博 联通
银牌会员
★★★
积分 1,604
发帖 646
注册 2008-04-13 23:39
UID 115804
性别 男
状态 离线
这题不像是给新手做的啊~
心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^
6 发表于 2008-07-10 22:38 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
UID 73968
性别 男
状态 离线
还真是费脑子,总算写出来了,代码比较臃肿,先看看新手们的吧。。。
致精致简!
7 发表于 2008-07-10 22:41 ·  美国 惠普HP
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
UID 89899
性别 男
状态 离线
第一反应就是字符串逆序,不知道思路是否对头。
8 发表于 2008-07-10 23:02 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
UID 112398
性别 男
状态 离线
Originally posted by HAT at 2008-7-10 22:41:
第一反应就是字符串逆序,不知道思路是否对头。

这一思路是对的,但解决办法是多样的。
批处理之家新域名:www.bathome.net
9 发表于 2008-07-10 23:10 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
UID 73968
性别 男
状态 离线
还多样,就一样就已经把我的头搞大了。。。
致精致简!
10 发表于 2008-07-11 00:37 ·  中国 山东 淄博 联通
银牌会员
★★★
积分 1,604
发帖 646
注册 2008-04-13 23:39
UID 115804
性别 男
状态 离线
果真难。。。 但快成功了,繁杂,太繁杂。。。
心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^
11 发表于 2008-07-11 00:47 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
UID 112398
性别 男
状态 离线
呵呵,我刚开始出这题时也没想到这么难!
批处理之家新域名:www.bathome.net
12 发表于 2008-07-11 01:26 ·  中国 山东 淄博 联通
银牌会员
★★★
积分 1,604
发帖 646
注册 2008-04-13 23:39
UID 115804
性别 男
状态 离线
终于成功了。。。将近4个小时的努力。。。- -|||
繁杂。。。
心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^
13 发表于 2008-07-11 01:42 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
UID 112398
性别 男
状态 离线
Originally posted by pusofalse at 2008-7-11 01:26:
终于成功了。。。将近4个小时的努力。。。- -|||
繁杂。。。

兄弟是不是想得太复杂了啊。
ps:你可以发你的代码了。

[ Last edited by zw19750516 on 2008-7-11 at 01:44 AM ]
批处理之家新域名:www.bathome.net
14 发表于 2008-07-11 01:44 ·  中国 山东 淄博 联通
银牌会员
★★★
积分 1,604
发帖 646
注册 2008-04-13 23:39
UID 115804
性别 男
状态 离线
可能。。。1个多小时根本没思路。。。
心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^
15 发表于 2008-07-11 01:45 ·  中国 山东 淄博 联通
银牌会员
★★★
积分 1,604
发帖 646
注册 2008-04-13 23:39
UID 115804
性别 男
状态 离线
Originally posted by zw19750516 at 2008-7-11 01:42 AM:

兄弟是不是想得太复杂了啊。
ps:你可以发你的代码了。

[ Last edited by zw19750516 on 2008-7-11 at 01:44 AM ]

可能。。。1个多小时根本没思路。。。
写完了再看看,也没什么新思路。。。

@echo off&setlocal enabledelayedexpansion
set str=0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j
set str1=%str: =%
set n=10
set letter=%str:~19%
set num=%str:~,19%
for %%a in (%letter%) do (
set/a n-=1
set !n!=%%a
set %%a=!n!
)
set/p var=Input:
set var3=%var%
:pu
if defined var3 (
set var4=!var3:~,1!
if !var4! leq 9 set "shuzi=!shuzi!!var4! "
if !var4! gtr 9 call :shuzi
set var3=!var3:~1!
goto pu
)
goto lp
:shuzi
set "shuzi=!shuzi!!%var4%! "
goto :eof


:lp
if defined str1 (
set str2=!str1:~,1!
for %%a in (%shuzi%) do if "-!str2!" equ "-%%a" goto next
for %%a in (%shuzi%) do if "-!str2!" neq "-%%a" set str2=#
:next
set pus=!pus!!str2!
set str1=!str1:~1!
goto lp
)
set will=%pus:~,10%
:will
if defined will (
set wil=!will:~-1!
call :w
set will=!will:~0,-1!
goto will
)
echo %pus:~,10%^|%false%
pause>nul&exit/b


:w
if defined %wil% (set false=!false!!%wil%!) else set false=!false!%wil%
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
bat-zw +1 2008-07-11 01:50
心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^
1 2 3 5 下一页 ›
论坛跳转: