Board logo

标题: 对称输出加分题(具有挑战性) [打印本页]

作者: bat-zw     时间: 2008-7-10 21:16    标题: 对称输出加分题(具有挑战性)


-----------------------------------
有如下对应关系:
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 ]
作者: 26933062     时间: 2008-7-10 21:41
可不可能输入   2a5f  这样字母和数字交错的情况?
作者: bat-zw     时间: 2008-7-10 21:42
有可能,这也不影响啊。
作者: wxcute     时间: 2008-7-10 22:18
如果输入的是e5呢?

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

[ Last edited by wxcute on 2008-7-10 at 10:29 PM ]
作者: pusofalse     时间: 2008-7-10 22:27
这题不像是给新手做的啊~
作者: 26933062     时间: 2008-7-10 22:38
还真是费脑子,总算写出来了,代码比较臃肿,先看看新手们的吧。。。
作者: HAT     时间: 2008-7-10 22:41
第一反应就是字符串逆序,不知道思路是否对头。
作者: bat-zw     时间: 2008-7-10 23:02


  Quote:
Originally posted by HAT at 2008-7-10 22:41:
第一反应就是字符串逆序,不知道思路是否对头。

这一思路是对的,但解决办法是多样的。
作者: 26933062     时间: 2008-7-10 23:10
还多样,就一样就已经把我的头搞大了。。。
作者: pusofalse     时间: 2008-7-11 00:37
果真难。。。 但快成功了,繁杂,太繁杂。。。
作者: bat-zw     时间: 2008-7-11 00:47
呵呵,我刚开始出这题时也没想到这么难!
作者: pusofalse     时间: 2008-7-11 01:26
终于成功了。。。将近4个小时的努力。。。- -|||
繁杂。。。
作者: bat-zw     时间: 2008-7-11 01:42


  Quote:
Originally posted by pusofalse at 2008-7-11 01:26:
终于成功了。。。将近4个小时的努力。。。- -|||
繁杂。。。

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

[ Last edited by zw19750516 on 2008-7-11 at 01:44 AM ]
作者: pusofalse     时间: 2008-7-11 01:44
可能。。。1个多小时根本没思路。。。
作者: pusofalse     时间: 2008-7-11 01:45


  Quote:
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%

作者: bat-zw     时间: 2008-7-11 01:46
晕。。。
ps:兄弟的代码不通用啊,如果两边都是字母或汉字怎么办?

[ Last edited by zw19750516 on 2008-7-11 at 01:49 AM ]
作者: pusofalse     时间: 2008-7-11 01:52


  Quote:
Originally posted by zw19750516 at 2008-7-11 01:46 AM:
晕。。。
ps:兄弟的代码不通用啊,如果两边都是字母或汉字怎么办?

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

还请多指教!~
作者: bat-zw     时间: 2008-7-11 01:55
提示,以中间为界同时从两边截取字符
作者: 26933062     时间: 2008-7-11 01:57


  Quote:
Originally posted by zw19750516 at 2008-7-11 01:46:
晕。。。
ps:兄弟的代码不通用啊,如果两边都是字母或汉字怎么办?

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

两边都是字母?
这只能怪你出题不谨慎了。。
作者: pusofalse     时间: 2008-7-11 02:01
果真是我想太太太复杂了。。。这题做到一半我是想放弃的,FAITH。。。
现在再做的话,我怕我果真会放弃了,如此的一个题目,想的脊椎都疼了~
作者: bat-zw     时间: 2008-7-11 02:02


  Quote:
Originally posted by 26933062 at 2008-7-11 01:57:

两边都是字母?
这只能怪你出题不谨慎了。。

我只是说明代码要提高通用性啊,没别的意思,本题他是已经做出来了,这个我不否认的。
作者: bat-zw     时间: 2008-7-11 02:04


  Quote:
Originally posted by pusofalse at 2008-7-11 02:01:
果真是我想太太太复杂了。。。这题做到一半我是想放弃的,FAITH。。。
现在再做的话,我怕我果真会放弃了,如此的一个题目,想的脊椎都疼了~

胜利往往是跟在你感觉再也挺不住的那一刻之后的。
ps:兄弟们,我先睡觉了,明天还要上班,期待有人写出高效通用的代码(我的就先不发了)。。。

[ Last edited by zw19750516 on 2008-7-11 at 02:08 AM ]
作者: terse     时间: 2008-7-11 02:46
我想没这么长吧  报到
作者: bat-zw     时间: 2008-7-11 10:02


  Quote:
Originally posted by terse at 2008-7-11 02:46:
我想没这么长吧  报到

但解题的代码肯定都不会短,我想应该不能在10行内解决问题。
作者: bat-zw     时间: 2008-7-11 11:49
看来此题确实有点难度,我先公布本人所想的比较复杂的一种方法吧:
@echo off&setlocal enabledelayedexpansion
set str=0123456789abcdefghij
:lp
set a=%str:~,1%&set /a n+=1
set .%n%=%a%&set _%n%=!str:~-1,1!&set str=%str:~1,-1%
if defined str goto lp
set /p code=please enter the code:
:loop
set a=%code:~,1%&set var=%var% !a!&set code=%code:~1%
if defined code goto loop
for /l %%a in (1,1,%n%) do (
    for %%i in (%var%) do (
        if "!.%%a!" equ "%%i" set flag=a
        if "!_%%a!" equ "%%i" set flag=a
    )
    if defined flag (
       set str1=!str1!!.%%a!&set str2=!_%%a!!str2!&set "flag="
       ) else (
       set str1=!str1!#&set str2=#!str2!
))
cls&echo %str1% ^| %str2%&pause>nul

作者: 26933062     时间: 2008-7-11 12:11
确实够绕人的。!花费了我不少时间。。。
前后共想出三种方法,第一种没通用性,后两种比较通用。
总的来说感觉思路没有zw19750516的清晰。。。 已经迷糊了。被绕晕了。。。
代码一、
左边的必须是数字。(不通用、仅针对顶楼的题目)
@echo off&setlocal enabledelayedexpansion
echo.&set /p num= 请输入 &cls
set "str=a b c d e f g h i j"
set "var1=##########"
set /a n=10
for %%a in (%str%) do (
  set /a n-=1&set .%%a=!n!&set .!n!=!n!&set "_!n!=%%a"
)
for /l %%a in (0 1 9) do (
  if not "!num:~%%a,1!"=="" set num2=!num2! !num:~%%a,1!
)
for %%a in (!num2!) do (
  set /a n=!.%%a!+1
  call set "var1=%%var1:~0,!.%%a!%%!.%%a!%%var1:~!n!%%"
)
for /l %%a in (0 1 9) do (
  if "!var1:~%%a,1!"=="#" (set var2=#!var2!) else set "var2=!_%%a!!var2!"
)
echo.&echo  !var1!   !var2!
pause>nul
代码二、
通用点的,不局限于数字、左右两边可以是任意字符但不能有重复。
@echo off&setlocal enabledelayedexpansion
set "str1=abcdefghij"&set "str2=tsrqponmlk"
for /l %%a in (0 1 9) do (
   set ".!str1:~%%a,1!=!str1:~%%a,1!"
   set ".!str2:~%%a,1!=!str1:~%%a,1!"
   set "_!str1:~%%a,1!=#"
   set "_!str2:~%%a,1!=#"
)
echo  !str1!  klmnopqrst
echo.&set /p num= 请输入 &cls&echo  !num!
echo.&echo  !str1!  klmnopqrst
set num=!num: =!
for /l %%a in (0 1 9)do if not "!num:~%%a,1!"=="" set num2=!num2! !num:~%%a,1!
for %%a in (!num2!) do set _%%a=!.%%a!&set "_!.%%a!=!.%%a!"
for /l %%a in (0 1 9) do call set "var1=!var1! %%_!str1:~%%a,1!%%"
set /a nnn=-1
for %%a in (!var1!) do (
  set /a nnn+=1
  if "%%a"=="#" (set var2=#!var2!) else call set "var2=%%str2:~!nnn!,1%%!var2!"
)
echo.&echo  !var1: =!  !var2!
pause>nul
代码三、
@echo off&setlocal enabledelayedexpansion
set "str1=abcdefghij"&set "str2=tsrqponmlk"
set var1=##########&set var2=!var1!
echo  !str1!  klmnopqrst
echo.&set /p num= 请输入 &cls&echo  你输入的是 !num!
echo.&echo  !str1!  klmnopqrst
set num=!num: =!
for /l %%a in (0 1 9)do if not "!num:~%%a,1!"=="" set num2=!num2! !num:~%%a,1!
for /l %%a in (0 1 9) do (
   set /a mmm=%%a+1
   set ".!str1:~%%a,1!=!mmm!"
   set ".!str2:~%%a,1!=!mmm!"
)
for %%a in (!num2!) do (
  set /a hhh=!.%%a!-1
  call set var1=%%var1:~0,!hhh!%%%%str1:~!hhh!,1%%%%var1:~!.%%a!%%
  call set var2=%%var2:~0,!hhh!%%%%str2:~!hhh!,1%%%%var2:~!.%%a!%%
)  
for /l %%a in (0 1 9) do set var3=!var2:~%%a,1!!var3!
echo.&echo  !var1!  !var3!
pause>nul

作者: bat-zw     时间: 2008-7-11 12:15
说老实话,我看你的化码看晕了。。。强人居然想出了三种方法。
思路突出这处在于巧妙运用了变量赋值。
缺陷我想还是在代码过于繁杂上。

[ Last edited by zw19750516 on 2008-7-11 at 01:02 PM ]
作者: bat-zw     时间: 2008-7-11 12:21
再给出本人有点取巧的代码(输入时必须按如1 a f 4这样的方式):
@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

作者: pusofalse     时间: 2008-7-11 13:09
看了前辈们的代码,惭愧之至。。。
作者: 26933062     时间: 2008-7-11 15:18
再来一个,思路清晰点的。
@echo off&setlocal enabledelayedexpansion
set "str1= 0 1 2 3 4 5 6 7 8 9"
set "str2= j i h g f e d c b a"
echo.&set /p num= 请输入 &cls&set num=!num: =!
for %%a in (!str1! !str2!) do set num=!num:%%a= %%a!
for %%a in (%str1%) do set /a wei+=1,weis=wei*2

for /l %%a in (1 2 !weis!) do (
   set ".!str1:~%%a,1!=!str2:~%%a,1!"
   set ".!str2:~%%a,1!=!str1:~%%a,1!"
)
for %%a in (!num!)do set _%%a=a&set _!.%%a!=a
for %%a in (!str1!)do if defined _%%a (set var1=!var1!%%a) else set "var1=!var1!#"
for %%a in (!str2!)do if defined _%%a (set var2=%%a!var2!) else set "var2=#!var2!"
echo.&echo  !var1!  !var2!
pause>nul
[ Last edited by 26933062 on 2008-7-11 at 04:14 PM ]
作者: bat-zw     时间: 2008-7-11 15:37


  Quote:
Originally posted by 26933062 at 2008-7-11 15:18:
再来一个,思路清晰点的。
[code]
@echo off&setlocal enabledelayedexpansion
set "str1= 0 1 2 3 4 5 6 7 8 9"
set "str2= j i h g f e d c b a"
echo.&set /p n ...

小楼兄这个方案还是欠缺在通用性上面。
作者: 26933062     时间: 2008-7-11 15:40
哦?
如何不通用?
作者: bat-zw     时间: 2008-7-11 15:48
for /l %%a in (1 2 19) do (。。。
就这句。
作者: 26933062     时间: 2008-7-11 16:14


  Quote:
Originally posted by zw19750516 at 2008-7-11 15:48:
for /l %%a in (1 2 19) do (。。。
就这句。

对位数加了个判断和计算,这样应该可以了吧?
作者: terse     时间: 2008-7-11 16:50
我有分不
@echo off&setlocal enabledelayedexpansion
set/p p=请输入:
set str=abcdefghij
for /l %%i in (0 1 9) do set %%i=%%i&set/a !str:~%%i,1!=9-%%i
:lp
if defined p set .!%p:~,1%!=!%p:~,1%!&set p=!p:~1!&goto lp
   for /l %%i in (0 1 9) do (
       if defined .%%i (
       set var1=!var1!%%i&set/a _%%i=9-%%i
       call set var2=%%str:~!_%%i!,1%%!var2!
       )else set var1=!var1!#&set var2=#!var2!
   )
echo !var1! ^| !var2!
pause

作者: bat-zw     时间: 2008-7-11 17:01


  Quote:
Originally posted by terse at 2008-7-11 16:50:
我有分不
[code]
@echo off&setlocal enabledelayedexpansion
set/p p=请输入:
set str=abcdefghij
for /l %%i in (0 1 9) do set %%i=%%i&set/a !str:~%%i,1!=9-%%i
:lp
if defined p set ...

for /l %%i in (0 1 9)...
不通用,请兄弟仔细看下我顶楼的说明。
作者: quya     时间: 2008-7-11 17:03
我这个又是产生临时文件的, 初学者的思路, 不过通用性很好!
@echo off
set/p input=请输入:
rem " .%input%" 中"." 为了防止纯单数字(1-9?) 输入出现错误
echo .%input%>%temp%\temp.txt
set string=0123456789abcdefghij
set num=
:pro1
set /a num+=1
set strtmp=%string:~0,1%%string:~-1%
set str%num%=##
rem 下面这句是 findstr [] 类方面的应用
findstr [%strtmp%] %temp%\temp.txt>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
我自我感觉通用性最好,不相信可以验证, 高手可以按照我思路简化下, 我写的东西经常性带有冗余代码.

不产生临时文件的写法, 其实更简单, 我主要用惯了临时文件。
@echo off
set/p input=请输入:
set string=0123456789abcdefghij
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-11 at 07:33 PM ]
作者: 26933062     时间: 2008-7-11 18:38
再来
@echo off&setlocal enabledelayedexpansion
set "str=0123456789abcdefghij"
set str1=!str!
:loop
set .!str:~0,1!=!str:~-1,1!
set .!str:~-1,1!=!str:~0,1!
set str=!str:~1,-1!
set /a nnn+=1
if defined str goto loop
for /f "tokens=2 delims==" %%a in ('set .') do set str1=!str1:%%a= %%a!

set /p num=请输入、可以不输入空格  &cls&set num=!num: =!
for %%i in (!str1!) do set num=!num:%%i= %%i!
for %%a in (!num!) do set num=!num! !.%%a!
for %%a in (!num!) do set _%%a=a
for %%a in (!str1!) do if defined _%%a (set var=!var!%%a) else set var=!var!#
echo.&echo !var:~0,%nnn%! !var:~%nnn%!
pause>nul
[ Last edited by 26933062 on 2008-7-13 at 11:10 AM ]
作者: terse     时间: 2008-7-11 20:35


  Quote:
Originally posted by zw19750516 at 2008-7-11 17:01:

for /l %%i in (0 1 9)...
不通用,请兄弟仔细看下我顶楼的说明。

当输入7时,输出如下:
#######7## | ##c#######   
当输入a5时,输出如下:
#####5###9 | a###e#####
当输入12j时,输出如下:
012####### | #######hij
我想我的代码做到了
小弟愚笨 想不通那里不对  望zw19750516兄明示
作者: quya     时间: 2008-7-11 22:26
楼上的, 你的不通用性在于:

1. 如果两边少点字符, 你要修改代码多处
2. 最大的缺点是, 如果左右边互换, 你又要改,如果左边逆序呢? 如果左边有字母呢? 如果两边的字符毫无规律呢?

所以确实不通用。
作者: bat-zw     时间: 2008-7-12 10:54
严重同意老土的,还有就是请兄弟每次解我的题时先看下顶楼的要求是不是改变了,因为本人出题的思路开始可能会欠慎密,但我会不断修改的,也难为兄弟们了。
作者: bat-zw     时间: 2008-7-12 10:58


  Quote:
:loop
set .!str:~0,1!=!str:~-1,1!
set .!str:~-1,1!=!str:~0,1!
set str=!str:~1,-1!
set /a nnn+=1
if defined str goto loop

小楼兄这次的思路和我的第一个方案是一样的都是从两头同时截取字符,只是兄在处理技巧上更胜我一筹,加入了以本身为变量的赋值,学习了。

[ Last edited by zw19750516 on 2008-7-12 at 11:35 AM ]
作者: quya     时间: 2008-7-12 12:36
你们的代码我基本看不懂, 我看见 !变量!什么的就头痛, 所以不到万不得已就不用, 可以用CALL代替的就代替。(CALL也是最近才学的)

这次主动用上延迟变量算是我破天荒第一次了,实在想不出啥办法, 一般我都是抄人家延迟变量的代码的。

另外,你们的输入大多数要加空格隔开的, 不知道为什么,我想凭你们的技巧,肯定可以用别的办法,加个空格输入的时候多别扭啊。
作者: bat-zw     时间: 2008-7-12 12:56


  Quote:
另外,你们的输入大多数要加空格隔开的, 不知道为什么,我想凭你们的技巧,肯定可以用别的办法,加个空格输入的时候多别扭啊。

老土,要解决是不是问题(我25楼的代码就不是加空格输入的),但这样会使代码显得繁杂,本题的核心问题也不在对这个的处理上,因此,为了更加突出解题的核心代码,我第二个方案采用了加空格输入的办法。
作者: quya     时间: 2008-7-12 13:36
我不敢苟同楼主观点。

综观最近几天的出题解题,我发现大家都有点走火入魔了,重技巧而轻实用。

程序最终是用来方便自己和大家的, 所以首先要人机界面友好,缺省设置合理,符合大多数人使用习惯,可以有个性化设置,其次兼容性好,再次就是运行速度快,占内存和硬盘空间少。

人机界面友好的例子如下:

1. 比如这个题目输入的时候一定要加个空格, 这就不爽
2. 比如运行的时候一开始一定要点一个什么东西,也不爽。
等等

像此类问题,用户每用一次都要去适应它就不好了, 不如把程序编得复杂点, 因为程序只编一次(当然调试是多次的), 但用户要用N次。我们公司用的EPR程序就一直在折磨我。

技巧应该用在的地方:

1. 不用该技巧无法编程的
2. 能显著改善运行速度的,比如循环语句的优化, 某些只运行一次的代码就无所谓了,如果过于追求技巧将会使代码维护困难。
3. 该用技巧的时候不用, 比如现在编程的模块化,使得一些编大型程序的程序员不动脑筋, 最后编的程序一点都没有人性化,合理化,例如运行结果会出现3.00头猪之类的结果。把数据库里计算机自动生成的ID等当成搜索条件,而用户需要的好记的搜索条件却很难找到,不隐藏根本和用户不打交道的字段等等。

暂时写这么多, 其实实际中我碰到的问题实在太多太多。
作者: qzwqzw     时间: 2008-7-12 13:55
老土想得太多了

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

而现在讨论的只是一些原型化的代码
根本谈不上如何去应用
只需要抽象出问题的核心然后解决掉它就可以了
作者: terse     时间: 2008-7-13 03:11
无须输入空格
@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

作者: bat-zw     时间: 2008-7-13 09:33
这回对了。
兄这个if defined ..!.%st:~,1%!真用得叹为观止啊,学习了。
作者: quya     时间: 2008-7-13 09:53
还是要挑点毛病。

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

好像还是不太通用啊。

同志们,请原谅我,我水平不行,挑刺还可以。
作者: bat-zw     时间: 2008-7-13 10:14


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

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

好像还是不太通用啊。

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

老土,这个set是根据情况来的,如要对称的是数字和字母,就set str=数字+字母,如要对称的是数字和汉字,就set str=数字+汉字,如要对称关系是没有规律的,就如terse兄如此set了。
作者: quya     时间: 2008-7-13 10:26


  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 ]
作者: bat-zw     时间: 2008-7-13 10:39
是可以乱序啊,你甚至还可以通过代码来生成,如:
@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

作者: quya     时间: 2008-7-13 10:55
那楼主通过你的乱序再检验一下所有的解题看看。

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

[ Last edited by quya on 2008-7-13 at 10:58 AM ]
作者: 26933062     时间: 2008-7-13 11:13
呵呵,老土还真是执著啊,
你试试 38 楼的代码,
已经对人机交互作了处理,可以不输入空格,也可以输入。
缺点是:   任意字符中不能有重复的。
作者: quya     时间: 2008-7-13 11:32


  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 ]
作者: 26933062     时间: 2008-7-13 11:42


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


试了下 当 set "str=012t456789abcd6fghi3"

输入36 不能正确显示。

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

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

都说了不能有重复的,你这里有两个6啊?
作者: quya     时间: 2008-7-13 19:38
又想了一个, 这个应该是最简单的了。连延迟变量都没用。
@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 ]
作者: bat-zw     时间: 2008-7-14 08:38
老土,代码第一是考虑效率,第二才是简洁,你这个方案存在效率问题,同时('echo %str%')可以修改为("%str%")。
作者: quya     时间: 2008-7-14 10:28
我57楼这么简单的代码存在效率问题? 试简析下, 谢谢.

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

[ Last edited by quya on 2008-7-14 at 10:41 AM ]
作者: bat-zw     时间: 2008-7-14 10:39
效率问题出在这里:echo %input%|findstr [%string:~-1%%string:~0,1%]>nul||set str=#%str:~1,-1%%#
在批处理中要尽量用if做判断,少用findstr。
作者: quya     时间: 2008-7-14 10:48


  Quote:
Originally posted by zw19750516 at 2008-7-14 10:39 AM:
效率问题出在这里:echo %input%|findstr [%string:~-1%%string:~0,1%]>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 ]
作者: quya     时间: 2008-7-14 13:00


  Quote:
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
这下速度同样飞快了.
作者: bat-zw     时间: 2008-7-14 16:08
还有个问题要指出一下:
if 判断语句的最好加上引号 if "%string:~0,1%"=="#" 或 if "%string:~0,1%" equ "#"
作者: qzwqzw     时间: 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 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

作者: terse     时间: 2008-7-14 23:58


  Quote:
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