Board logo

标题: [求助]文本输出~ [打印本页]

作者: pusofalse     时间: 2008-5-6 22:44    标题: [求助]文本输出~

转自批处理之家

a.txt:
ababababababababa


输出:
ababababababababa
aba a aba ab b b
a a   ab  a  b
  a   ab     b
      a
空格位置是随机产生的,但纵向都是同一字母。。。
作者: bat-zw     时间: 2008-5-7 11:00    标题: 这道题有难度啊!!!


@echo off&setlocal enabledelayedexpansion
set str=ababababababababa
echo %str%
:begin
set n=0&set m=0&set "var="
set /a a=%random%%%17+1,b=%random%%%17+1,c=%random%%%17+1
if %a% equ %b% goto begin
if %a% equ %c% goto begin
if %b% equ %c% goto begin
:lp
set /a n+=1
for %%i in (%a% %b% %c%) do if %%i equ %n% set m=1
if %m% equ 0 (
   set var=!var!%str:~,1%
   ) else (
   set "var=!var! "
)
set str=%str:~1%&set m=0
if defined str goto lp
if "!var!"=="                 " pause>nul&goto :eof
echo !var!
set str=!var!&goto begin
[ Last edited by zw19750516 on 2008-5-7 at 11:01 AM ]
作者: bat-zw     时间: 2008-5-7 11:52    标题: 上面还是没完全合楼主的要求:


@echo off&setlocal enabledelayedexpansion
set str=ababababababababa
echo %str%
:begin
set n=0&set m=0&set x=0&set "var="
:set
set /a a=%random%%%17+1
for %%i in (%code%) do if %%i equ %a% goto set
set /a x+=1&set code=%code% %a%
if %x% lss 3 goto set
:lp
set /a n+=1
for %%i in (%code%) do if %%i equ %n% set m=1
if %m% equ 0 (
   set var=!var!%str:~,1%
   ) else (
   set "var=!var! "
)
set str=%str:~1%&set m=0
if defined str goto lp
if "!var!"=="                 " pause>nul&goto :eof
echo !var!
set str=!var!&goto begin

作者: 26933062     时间: 2008-5-7 12:02
此题的真正要求是 a和b的总数是60个,且第一行第一个字母也是随机的,并不固定是a,第一行的字母总数也是随机的.

[ Last edited by 26933062 on 2008-5-7 at 12:04 PM ]
作者: bat-zw     时间: 2008-5-7 12:04    标题: 请说详细点了:

对于楼主的题意我的代码已可以做到,但不知道原题是怎么样的,LS可以贴出来吗?
作者: 26933062     时间: 2008-5-7 12:07
要求:
  不产生临时文件,生成如楼主所提供的样本格式文件.
具体要求:
  a和b的总数为60个,每行的字母总数及位置都是随机的
作者: bat-zw     时间: 2008-5-7 12:13
条件好像不够吧,每行最多多少个字符啊?如没这个条件,不一行就做到了啊
作者: 26933062     时间: 2008-5-7 12:16
要求的就是随机,如果可能的话一行也有可能.
应该是随机产生a或b,是一个一个产生的.总数为60个.
作者: bat-zw     时间: 2008-5-7 12:47    标题: 先发一个吧:


echo off
set "str=ab "&set m=0
:begin
set /a a=%random%%%60+1
set "var="
:lp
set /a b=%random%%%3
call,set c=%%str:~%b%,1%%
if not "%c%"==" " set /a m+=1
set /a n+=1&set var=%c%%var%
if %n% lss %a% goto lp
echo.%var%
if %m% lss 60 goto begin
pause>nul

作者: 26933062     时间: 2008-5-7 14:15
ls测试了么?
要的是顶楼的那种格式。
作者: bat-zw     时间: 2008-5-7 15:31    标题: 先理一下思路:

&&按兄弟的意思就是先随机生成一个由a和b随机组成的字符总数小于60的字符串,然后逐行将字符串中的三个字符替换为空格,当字符总数(不含空格)达到60时终止是吧?
  但这样我认为会有问题,因为总会出现一行中不够三个字符的情况啊,同时还会出现第二行字符总数就超出60个的情况,再说真要实现上面的确实难度太大了!!!

[ Last edited by zw19750516 on 2008-5-7 at 03:32 PM ]
作者: bat-zw     时间: 2008-5-7 16:30    标题: 终于还是写出来了,确实难!!!


@echo off&setlocal enabledelayedexpansion
set "str=ab"&set /a a=%random%%%60+1
:begin
set /a b=%random%%%2
set c=!str:~%b%,1!&set var=%var%!c!
set /a n+=1
if %n% lss %a% goto begin
echo 下面为本次生成的字符串:
echo %var%&set code=%var%
echo 下面输出的字符(不含空格)总数为60个:
set "str="&set n=0
:lp
if !n! lss 60 if defined var (
   set /a b=%random%%%2
   if !b! equ 0 (
      set "b= "
      ) else (
      set b=!var:~,1!&set /a n+=1
   )
   set str=%str%!b!
   set var=%var:~1%
   goto lp
)
echo.%str%
if !n! lss 60 set str=&set var=%code%&goto lp
pause>nul
如要实现递减输出就难以满足字符总数为60个的要求了,如当原始生成的字符串为:a,就最多只有一行和一个字符了。

[ Last edited by zw19750516 on 2008-5-7 at 05:28 PM ]
作者: uemuem     时间: 2008-5-7 16:45


  Quote:
Originally posted by 26933062 at 2008-5-7 12:16:
要求的就是随机,如果可能的话一行也有可能.
应该是随机产生a或b,是一个一个产生的.总数为60个.

你好像比LZ还LZ。。。
作者: pusofalse     时间: 2008-5-7 17:55


  Quote:
Originally posted by zw19750516 at 2008-5-7 04:30 PM:
[code]@echo off&setlocal enabledelayedexpansion
set "str=ab"&set /a a=%random%%%60+1
:begin
set /a b=%random%%%2
set c=!str:~%b%,1!&set var=%var%!c!
set /a n+=1
if %n% l ...

高!确实高!虽然这段代码看起来还有点难度。。。。^_^
作者: 26933062     时间: 2008-5-7 19:44
回复 12 楼
不好意识,答案仍不正确,可能是我描述的不够清楚吧。
每个字母的正上方不能是空格。
这么说吧
随机生成第一个字母,比如说是a就把他写入新文件,然后再生成第二个字母,如果同上一个字母一样,则把这个字母写在上一个字母的正下方,否则就写在第一行。

回复 13 楼
什么东西。。。。。
作者: slore     时间: 2008-5-7 19:55
说你是马甲=。=
作者: bat-zw     时间: 2008-5-7 20:40


  Quote:
Originally posted by 26933062 at 2008-5-7 19:44:
回复 12 楼
不好意识,答案仍不正确,可能是我描述的不够清楚吧。
每个字母的正上方不能是空格。
这么说吧
随机生成第一个字母,比如说是a就把 ...

做到这点并不难,把我12的代码稍做修改就可以实现,但难的是这样就难以满足字符总数为60的要求了,如当第一行的字符仅为一个a时,代码如下:
@echo off&setlocal enabledelayedexpansion
set "str=ab"&set /a a=%random%%%60+1
:begin
set /a b=%random%%%2
set c=!str:~%b%,1!&set var=%var%!c!
set /a n+=1
if %n% lss %a% goto begin
echo 下面为本次生成的字符串:
echo %var%
set "str="&set n=0
:lp
if !n! lss 60 if defined var (
   set /a b=%random%%%2
   if !b! equ 0 (
      set "b= "
      ) else (
      set b=!var:~,1!&set /a n+=1
   )
   set str=%str%!b!
   set var=%var:~1%
   goto lp
)
echo.%str%
if !n! lss 60 set var=%str%&set str=&goto lp
pause>nul

作者: 26933062     时间: 2008-5-7 21:14
呵呵,看来是我的描述出了大问题了。
结果中第一行的字符永远不会比第二行少,第二行永远不会比第三行少。。。。。。。。
作者: bat-zw     时间: 2008-5-7 21:27
老实说,我是真被你搞晕头了,要不劳兄弟写出代码来吧!
作者: 26933062     时间: 2008-5-7 21:33
有这么难理解吗?
老实说,看顶楼的样本应该就知道了,只是把a和b的总数定为60个而以,
zw19750516 兄写的几个代码有哪个是输出顶楼格式的?
作者: bat-zw     时间: 2008-5-7 21:55
那是我理解不好,就请兄弟写出代码来看看吧!
作者: pusofalse     时间: 2008-5-7 22:21
ababababababababa
xbxbxxabaxxbaxxxa
xbxxxxaxaxxbaxxxx
xxxxxxaxaxxbaxxxx
xxxxxxxxaxxbxxxxx
xxxxxxxxxxxbxxxxx

x代表空格
比如第一行的第2个字符是b 到了第四行时第2个字符成了空格。。。 到了第5行的第二个字符 也必须是空格 如果是在第三行时变成空格,那以后的行,第二的位置上也必须是空格
不知我这样说 能否明白~~^_^
作者: terse     时间: 2008-5-7 22:22
领会错误  删贴

[ Last edited by terse on 2008-5-7 at 11:10 PM ]
作者: bat-zw     时间: 2008-5-7 22:24


  Quote:
Originally posted by pusofalse at 2008-5-7 22:21:
ababababababababa
xbxbxxabaxxbaxxxa
xbxxxxaxaxxbaxxxx
xxxxxxaxaxxbaxxxx
xxxxxxxxaxxbxxxxx
xxxxxxxxxxxbxxxxx

x代表空格
比如第一行的第2个字符是b 到了第四行时第2个字符 ...

如是这样,请运行我17的代码。
作者: slore     时间: 2008-5-7 22:27
希望可以换个90的思维……问题就简单些了……
作者: pusofalse     时间: 2008-5-7 22:41


  Quote:
Originally posted by zw19750516 at 2008-5-7 10:24 PM:

如是这样,请运行我17的代码。

嗯,如果是没有个数限制的情况下确实是这样。。。但是真是不好意思~ 我刚才又忘记说了,ab个数加起来要等于60

各位前辈的执着与钻研精神 真是佩服至极!
作者: bat-zw     时间: 2008-5-7 23:02
&&那我只能说这道题目出得有问题了,要同时满足随机生成字符串和递减输出以及输出字符总数(不包括原始字符串和空格)为60个这三个条件是很难做到的。
  这要看第一:原始生成的字符串字符数多不多,如生成只一个字符的原始字符串看誰能保证以后59行每行都不生成空格。
  还要看第二:每行生成的空格数多不多了,如果在第一行就生成了30个以上的空格,输出字符总数为60个的条件怕是难以保住了吧。
作者: 26933062     时间: 2008-5-7 23:08
回复23楼 terse
你的代码也不对,每行的横向是不可能出现重复字母的,比如 bb或aa 应该是abababab 或 bababa 并且你的代码好像会显示很多多余的空行。。
a和b的总数是60个,但哪个位置是a哪个位置是b不是确定的,是随机的。
但左右相邻的是不能重复,比如 bb 就不行,除非是b空格b,但第一行是不能有空格的。而所有的纵向是必须一样的。
作者: pusofalse     时间: 2008-5-7 23:13
解铃还需系铃人。。。 到批处理之家看看吧,但貌似现在还没有给出源码,那里的版主也是超强的,只是没有时间上网而已
作者: slore     时间: 2008-5-7 23:19
算法问题……我想论坛里高手还是可以解决的。

a和b总共60个?你给的输出貌似不够吧?
作者: 26933062     时间: 2008-5-7 23:33
看来我的表达能力是大有问题。
再来一次
要求生成一个文本文件,内容是a和b及空格,但是a和b的总数是60个。
第一行不能有空格,且必须是ababab这样交错的,不能是bba或aab这样的
举例:
假设得到的第一个随机字母是a,那么就把a写入b.txt
再获取第二个随机字母,假设又是a,则写入到前面得到的a的下面。如果得到的是b。则写入到b.txt的第一行,就是和第一个a并排。
继续获取随机字母,再判断它和上一个字母是否相同,如果相同则写入到上一个字母的正下方,注意:“是上一个字母”,否则就写入到第一行,
那么这样得到的最终结果,就会是以下格式的文本。
ababababa
a ab b ba
  ab b  a
   b    a

作者: slore     时间: 2008-5-7 23:39
我说下我的思路~

abflag="sloreissloreleeandsloreleeisslorehahailovedoscndosgood"

随机生成一个数表示行~比如12
然后生成
abababababab做第一行ab=12
后面开始:
i=i+1
if abflag的i%12位是" " 看是奇数还是偶数直接输出a或者b,ab+=1
i%2……
奇数就a或" "……随机下
if 是" "就abflag的i位换" " else 那就是a了呗,哦对了~ab+=1
偶数就b或" "……再随机
if 是" "就abflag的i位换" " else 那就是b了呗,哦对了~ab+=1
i%12自己处理是不是要换行了呀~
恩,ab=60啦~88


自己看这样的伪代码能看懂不嗬~不懂就当标记了下……
对P处理文字不感冒没有兴趣=。=

[ Last edited by slore on 2008-5-7 at 11:49 PM ]
作者: slore     时间: 2008-5-8 00:19
顺便把歪掉脑袋~~的思路题下……


随机要a还是b开始?x=a?b
随机个行数比如8

k=60-8
循环开始
随机生成小于等于k的数i(k=k-i)
连续生成i个x

随机生成小于等于k的数i(k=k-i)
连续生成i个x反(x是a那么x反就是b)

如果循环次数到第7次了……剩下的k个全输出……
如果k=0了结束……

这样是会生成一个
8行内的52字符……

假使a开始……
第一次随机是8

循环中第一次生成了个9
输出
aaaaaaaaa
然后循环生成5
bbbbb
在循环生成0

再循环生成4
bbbb
再循环生成8
aaaaaaaa
循环生成0

循环生成12
aaaaaaaaaaaa
7次循环了还没有够60哇?
剩下14个给你咯
bbbbbbbbbbbbbb
结果:
aaaaaaaaa
bbbbb
aaaaaaaa

bbbb
aaaaaaaa

aaaaaaaaaaaa
bbbbbbbbbbbbbb
行列转换的代码论坛有吧?
转制后输入到b.txt
然后输出:
babababa
type b.txt

这个似乎麻烦了?哪个快就不知道了……
如果不转的话,生成的代码这个是最容易的……
作者: moniuming     时间: 2008-5-8 10:52
我来一个,这个代码会由于a和b的数量不足60个而显示ECHO 处于关闭状态(只能叉掉才能停止,汗...,希望高手改进),因水平有限第一行的字符数量都是双数(唉,再次汗...),当然也可以为单,只因太牵强,故不为之.没有所谓的算法,只有一点点想法,即把下一行的对应位置的字符和上一行的进行比较,如果不同,则用空格代替,期望高手能给出更高效简洁的代码(最好能把算法讲一讲以便新手及吾等菜鸟学习).
@echo off
setlocal enabledelayedexpansion
set "code=ab"
set /a c=%random%%%2,d=%random%%%60+1,e=d*2
for /l %%i in (1,1,%d%) do (
  if %c%==0 (
    set var1=!var1!ab&set /a numa+=1,numb+=1
    ) else (
    set var1=!var1!ba&set /a numa+=1,numb+=1
))
:again
echo %var1%
set "var2="
set n=0
:again_
set /a f=%random%%%2
call set g=%%code:~%f%,1%%
call set h=%%var1:~%n%,1%%
if "%g%"=="%h%" (
  set "var2=%var2%!g!"&set /a num!g!+=1,n+=1
  ) else (
  set "var2=%var2% "&set /a n+=1
)
if %numa% gtr 60 (if %numb% gtr 60 echo %var2%&pause&exit /b)
if %n% lss %e% goto :again_
echo %var2%
set n=0
set "var1="
:more
set /a i=%random%%%2
call set j=%%code:~%i%,1%%
call set k=%%var2:~%n%,1%%
if "%j%"=="%k%" (
  set "var1=%var1%!j!"&set /a num!j!+=1,n+=1
  ) else (
  set "var1=%var1% "&set /a n+=1
)
if %numa% gtr 60 (if %numb% gtr 60 echo %var2%&pause&exit /b)
if %n% lss %e% goto :more
goto :again

作者: 26933062     时间: 2008-5-8 11:15
上帝!总算有一个明白题意的了,代码确实存在bug,而且b和a好像不太随机,要求的是每一个a或b都是随机得到的。。
也不错了,加分鼓励。。
作者: moniuming     时间: 2008-5-8 11:22


  Quote:
而且b和a好像不太随机

set "code=ab"
set f=%random%%%2
call set g=%%code:~%f%,1%%
这样不算随机吗
作者: 26933062     时间: 2008-5-8 12:01
也是哦,应该是随机的,只是开始看你的结果怎么有这么多字母,应该总数60个才对啊。
作者: moniuming     时间: 2008-5-8 12:53
强烈要求26933062老大将代码贴出来
作者: slore     时间: 2008-5-8 17:09

@echo off&setlocal enabledelayedexpansion
Title 本代码演示了个无聊的过程…
color 1f
Set Max=60
Set FixTime=0
::这个为自定义开关~你想使用自己设定的列数修改之……
Set firstline=slore
Set abFlag=sloreissloreleeandsloreleeisslorehahailovedoscndosgoodblue
::自然可以用1~60,不过第一行太多不好看哈哈,不喜欢的自己改~
if %firstline%==slore (
Set /a firstline=%random%%%5+20
Set /a Max=%random%%%20+40
Set Msg=Slore 设置输出!firstline!列 共!Max!个字符
) else (
Set Msg=%username% 设置输出%firstline%列 共%Max%个字符)
echo o(∩_∩)o-----------------------------------轩----
echo          %Msg%
echo ----轩-----------------------------------o(∩_∩)o
echo.
Set /a n=%firstline%/2
for /l %%i in (1,1,%n%) do Call,Set fl=!fl!ab
Set /a n=%firstline%%%2
if %n% EQU 1 Set fl=%fl%a
echo %fl%
Set ab=%firstline%
Set /a endline=%ab%-1
Set i=0
:Loop
Set /a abPos=%i%%%%firstline%
Set /a rad1=%abPos%%%2
Set /a rad2=%random%%%2
Set /a i+=1
Set Posletter=!abFlag:~%abPos%,1!

if %FixTime% EQU %endline% Set rad2=1
if %rad1% EQU 0 (
    if "%Posletter%"==" " (Set nl=%nl% ) else (
    if %rad2% EQU 0 (Set nl=%nl% &Call :Fix %abPos%) else Set nl=%nl%a&Set /a ab+=1)
) else (
    if "%Posletter%"==" " (Set nl=%nl% ) else (
    if %rad2% EQU 0 (Set nl=%nl% &Call :Fix %abPos%) else Set nl=%nl%b&Set /a ab+=1)
)
if %abPos% EQU %endline% echo %nl%
if %abPos% EQU %endline% Set nl=
if %ab% EQU %Max% goto :ExitLoop
goto :Loop

:ExitLoop
if Not "%nl%"=="" echo %nl%
echo.
::echo ab的个数为:%ab%
echo 无聊的代码演示结束!
pause>nul

:Fix
if %FixTime% EQU %endline% goto :EndFix
Set /a e=%1+1
Set abFlag=!abFlag:~0,%1! !abFlag:~%e%!
Set /a FixTime+=1
:EndFix
[ Last edited by slore on 2008-5-8 at 05:19 PM ]
作者: moniuming     时间: 2008-5-8 17:56
先删掉,汗

[ Last edited by moniuming on 2008-5-8 at 06:27 PM ]
作者: slore     时间: 2008-5-8 18:06
……
你的代码貌似不是固定输出格式?
而且md,rd=。=造文件夹是……
作者: 26933062     时间: 2008-5-8 19:30
39楼格式是对了,但初看你的列数都是可以自定义的啊?那a和b岂不是就不是随机的了?若每一个a和b都是随机的,那么列数是不可能预知的。
作者: moniuming     时间: 2008-5-8 19:47


  Quote:
你的代码貌似不是固定输出格式?
而且md,rd=。=造文件夹是……

因为我无法控制输出的字符个数,当超出范围会显示"ECHO 处于关闭状态",所以只能造文件夹来确定变量是否为空格(即如果可以造文件夹,则继续输出,否则退出)
@echo off
setlocal enabledelayedexpansion
set "code=ab"
set /a c=%random%%%2,d=%random%%%20+20,e=d*2
for /l %%i in (1,1,%d%) do (
  if %c%==0 (
    set var1=!var1!ab
    ) else (
    set var1=!var1!ba
))
:again
md "%var1%" >nul 2>nul
if errorlevel 1 pause&exit /b
rd "%var1%" >nul 2>nul
echo %var1%
set "var2="
set n=0
:again_
set /a f=%random%%%2
call set g=%%code:~%f%,1%%
call set h=%%var1:~%n%,1%%
if "%g%"=="%h%" (
  set "var2=%var2%!g!"&set /a n+=1
  ) else (
  set "var2=%var2% "&set /a n+=1
)
if %n% lss %e% goto :again_
md "%var2%" >nul 2>nul
if errorlevel 1 pause&exit /b
rd "%var2%" >nul 2>nul
echo %var2%
set n=0
set "var1="
:more
set /a i=%random%%%2
call set j=%%code:~%i%,1%%
call set k=%%var2:~%n%,1%%
if "%j%"=="%k%" (
  set "var1=%var1%!j!"&set /a n+=1
  ) else (
  set "var1=%var1% "&set /a n+=1
)
if %n% lss %e% goto :more
goto :again
[ Last edited by moniuming on 2008-5-8 at 08:08 PM ]
作者: 26933062     时间: 2008-5-8 20:59
汗啊!
我只是觉得自己这段代码平均要把loop标签运行30次左右,效率不太高,想寻求更高效点的代码,没想到引发40几楼的回帖,居然大部分是搞不清题意的。表达能力实在是差到极点,相信此帖已经没法引起其他高手的兴趣了。唉。。。
还是用代码来说明问题吧,为了显示美观我把a和b替换成了两个其它符号,看起来更清楚。
代码如下:
@echo off&color 1f
set _0=○&set "_1=●"&set /a ko=60
setlocal enabledelayedexpansion
for /l %%l in (1 1 %ko%) do (
   set /a w=!random!%%2
   call set "ss=%%_!w!%%"
   if not "!ss!"=="!flag!" (
      set "flag=!ss!"
      set /a h=1
      set "num1=!num1!!ss!"
      call :loop     
      ) else (
        set /a h+=1
        call set "num!h!=%%num!h!:~0,-1%%!ss!"
))
for /l %%l in (1 1 %ko%) do if not "!num%%l: =!"=="" echo !num%%l!
echo.&pause&exit
:loop
   for /l %%l in (2 1 !ko!) do set "num%%l=!num%%l! "
goto :eof

作者: slore     时间: 2008-5-8 21:01


  Quote:
Originally posted by 26933062 at 2008-5-8 19:30:
39楼格式是对了,但初看你的列数都是可以自定义的啊?那a和b岂不是就不是随机的了?若每一个a和b都是随机的,那么列数是不可能预知的。

那就仔细看...


自定义也没有啥稀奇的……因为随机结果不一定很理想……
如果随出个1!
那就是60个a一列了……

谁叫这个问题你叙述的也怪怪的……

  Quote:
第一行不能有空格,且必须是ababab这样交错的

每一个a和b都是随机的……

你这样随机了?
你的第一行就是最大列数……
我的是这个样子的……

如果不修改默认slore的话~列数和最大值都采用随机设置……

除了第一行剩下的都是random……的……
作者: 26933062     时间: 2008-5-8 21:05
看44楼的代码吧,
描述有问题,对不起大家了。。。。。
作者: slore     时间: 2008-5-8 21:18
果然还是用数组比较快……
还是VBS处理来比较爽……
作者: bat-zw     时间: 2008-5-8 22:25    标题: 不再跟此贴了:

我一直觉得题目出得有问题,所以保留意见并不再跟贴了。。。