Board logo

标题: 【出题】给定一个文本,右对齐原样输出 [打印本页]

作者: plp626     时间: 2008-5-21 19:13    标题: 【出题】给定一个文本,右对齐原样输出

这段时间批处理室没人气,希望大家踊跃参与。

要求:
只允许用bat,
可以处理特殊字符,
效率尽量高,



文本如下:
"aou"eo

;euou%^>plp626是我
::::ae右对齐原样输出ui
   
:::E2uo alejou 3<o2io|
^aue||%ou

!aue!
aoue eou 2
!str!auoeu!ueo &&
euo 8
ueyi^^^^aueuo2
~ ! @ # $ % ^ & * ( () " ok " No " <>nul
set ok=^

作者: pusofalse     时间: 2008-5-21 19:18
刚看到题目,就想起得找你以前发的关于函数的帖子。。。否则这题没门
作者: plp626     时间: 2008-5-21 19:21
我给的条件还是很宽的,只要是纯P,生成临时文件也可以(只要效率高)
怎么能没门呢,可以借鉴原样输出的帖子加以改进啊
作者: plp626     时间: 2008-5-21 19:27
没人吗?

有个findstr /o参数 打印字符偏移量
大家想想也可以借鉴,方法总是有的,
就看能否高效地实现?
作者: 26933062     时间: 2008-5-21 19:54
我来抛砖,
代码够臃肿的,
@echo off&setlocal enabledelayedexpansion
set /a dx=0
set "var=^(type a.txt^&echo.^&echo.^)^|findstr /o .*"
for /f "tokens=1* delims=:" %%a in ('%var%') do (
   if defined n (
      set /a m=%%a-2-n
      set _!h!=!m!
      if !m! geq !dx! set dx=!m!
   )
   set /a n=%%a,h+=1
)
set /a h-=1,m-=1
set _!h!=!m!
if !m! geq !dx! set "dx=!m!"
for /l %%a in (1 1 %h%) do set num=!num! %%a-!_%%a!
endlocal&set num=%num%&set dx=%dx%&set h=%h%
for %%a in (%num%) do (
   for /f "tokens=1,2 delims=-" %%i in ("%%a") do set _%%i=%%j
)
for /f "delims=" %%a in ('findstr /n .* a.txt') do (
   set "var=%%a"
   set /a n+=1
   setlocal enabledelayedexpansion
   set var=!var:*:=!
   set /a bu=dx-_!n!
   set "ko="
   for /l %%i in (1 1 !bu!) do set "ko= !ko!"
   echo.!ko!!var!
   endlocal
)
pause

作者: bat-zw     时间: 2008-5-21 20:06    标题: 先占个地:

真是高难度的,亏兄弟想得出啊,呵呵。
想了好久,终于把问题解决在10楼。。。

[ Last edited by zw19750516 on 2008-5-21 at 10:08 PM ]
作者: plp626     时间: 2008-5-21 20:13


  Quote:
Originally posted by 26933062 at 2008-5-21 07:54 PM:
我来抛砖,
代码够臃肿的,
[code]
@echo off&setlocal enabledelayedexpansion
set /a dx=0
set "var=^(type a.txt^&echo.^&echo.^)^|findstr /o .*"
for /f "token ...

加15分,代码可以再精简,
还有谁再潜水哪?
作者: bat-zw     时间: 2008-5-21 20:52    标题: 有两行有点问题,先发了:


@echo off
for /f "tokens=*" %%i in ('findstr /n .* a.txt') do (
    set str=%%i
    setlocal enabledelayedexpansion
    set str=!str:*:=!
    call :lp
    echo.!str!
    endlocal
)
pause>nul&goto :eof
:lp
set str= !str!
if "!str:~50!"=="" goto lp
[ Last edited by zw19750516 on 2008-5-21 at 09:38 PM ]
作者: metoo     时间: 2008-5-21 21:35


  Quote:
Originally posted by zw19750516 at 2008-5-21 08:52 PM:
@echo off
for /f "tokens=*" %%i in ('findstr /n .* a.txt') do (
    set str=%%i@
    setlocal enabledelayedexpansion
    set str=!str:*:=!
    call :lp
    echo.!str!
    e ...

和我的代码思想基本差不多。。。不过汉字占两个位置,有汉字的行会出现对不起的状况。。。想尝试用findstr正则来抽出行内的汉字字数。。但是貌似不怎么会用(觉得正则不强大- -! 明显差于perl)

附偶的代码- -
@echo off&setlocal enabledelayedexpansion
set "ttt=                                                              "
FOR /f "eol= tokens=1* delims=" %%a IN (a.txt) DO (
        set "t=%ttt%%%a"
        if "%%a"=="" ( echo\ ) else echo !t:~-60!
)
pause
我晕。。陷阱真多。。还有带空格的空行。。懒得修改代码了。。睡觉

[ Last edited by metoo on 2008-5-21 at 09:38 PM ]
作者: bat-zw     时间: 2008-5-21 22:06    标题: 问题得到最终解决:


@echo off
for /f "tokens=*" %%i in ('findstr /n .* a.txt') do (
    set str=%%i
    setlocal enabledelayedexpansion
    set str=!str:*:=!
    set var=!str!&set n=0&call :lp
    echo.!str!
    endlocal
)
pause>nul&goto :eof
:lp
set a=!var:~,1!
if !a! gtr z set /a n+=1
if defined var set var=!var:~1!&goto lp
set /a m=50-%n%
:loop
set str= !str!
if "!str:~%m%!"=="" goto loop

作者: bat-zw     时间: 2008-5-22 00:20    标题: 修改到兼容文本空格:


@echo off
for /f "tokens=*" %%i in ('findstr /n .* a.txt') do (
    set str=%%i
    setlocal enabledelayedexpansion
    set str=!str:*:=!
    set var=!str!&set n=0&call :lp
    echo.!str!
    endlocal
)
pause>nul&goto :eof
:lp
set a=!var:~,1!
if !a! gtr z set /a n+=1
if "!a!"==" " set /a n+=1
if defined var set var=!var:~1!&goto lp
set /a m=50-%n%
:loop
set str= !str!
if "!str:~%m%!"=="" goto loop