[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

【练习-070】批处理最简代码实现1至100的连加

出题目的:
  展示技术,拓展思路
加分原则:
  满分20分,成功完成连加计算5分,不用循环语句10分,最简代码5分
  思路奇妙的再追加10分
题目如下:
  在脚本之家看到vbs计算1到100连加的骨灰级代码并简化如下:
  Dim a(101):Execute(Join(a,"s=s+i:i=i+1:")):MsgBox s
  就请大家用批处理写出自己认为的最简代码吧!
***共同提高***

回复 36# m891319


    申明下,批处理中的此类写法首见于:http://bbs.bathome.net/viewthread.php?tid=12689

TOP

本帖最后由 m891319 于 2012-12-23 19:32 编辑

回复 28# CrLf


    学习了m+=n+=1的方法

看了前面几位大大的思路
稍微总结了下简化代码的思考方向:
1. 利用%0等方式递规呼叫
2. 利用 && 或 || 简化判断流程
3. 目前看到递规的最简化 set/am+=n+=1 ,实在经典
4. 由于题目没有限定输出,后面的讨论都在于不拘泥于正式输出,
    以求更加精简代码

这是小弟领悟后的答案
  1. @set/%~n0%0
复制代码
得将档案储存为"am+=n+=1&setlocal enabledelayedexpansion&if !n!==100 (echo !m!&pause) else endlocal&"
不包含双引号,输出相当正式,也不会有递规产生
不过由于档名有字元限制,"set/" 实在是无法省略
算是有些投机取巧的方法...
1

评分人数

    • CrLf: 有新意!技术 + 1
Rick

TOP

本帖最后由 CrLf 于 2012-12-23 23:00 编辑

回复 34# qzwqzw


    set/p好办法,似乎调整次序可以再简化一个字节:
  1. @set/as+=i+=1/!!(i-100)2>nul||set/p=%s%&%0
复制代码
1

评分人数

TOP

本帖最后由 qzwqzw 于 2012-12-23 17:54 编辑

如果不考虑任何隐含的限制条件
那么set.&pause也可以省略了
反正也没有限定一定要输出结果
而2>的使用也完全可以省略了
也因为题目没有限定要屏蔽错误
@在未限定屏蔽命令时也无必要
最后精简得到的代码结果如下:
  1. set/as+=i+=1,1/(i/100)||0
复制代码
还是给一个稍微正常点的精简
  1. @set/as+=i+=1,1/(i-101)2>nul&&%0||set/p=%s%
复制代码
上段代码会递减输出从0~100到0~0的累加结果
另外给一个递增输出从0~100到0~...的代码
  1. @set/as+=i+=1,1/(i/101)2>nul&&set/p=%s%||%0
复制代码
从代码的执行结果来看
&&与||联用的执行逻辑与我想象的还有些不同
它的执行条件受到了set/p的影响
如果set/p=%s%改成echo %s%结果会有不同
因为Echo会置%errorlevel%为0而set/p会置1
天的白色影子

TOP

回复 32# qzwqzw


    如此,貌似可再精简一下:
  1. @set/a.+=n+=1,1/(n-100)2>#&&0&set.&pause
复制代码

TOP

楼上几种方案的微调
如果再精简的话
可以把nul改为#
不过那和%0改0一样具有限制
  1. @set/az+=i+=1,1/(100-i)2>nul&&%0&set,z&pause
复制代码
  1. @set/az+=i+=1
  2. @if %i% leq 99 %0
  3. @set,z&pause
复制代码
  1. @set/az+=i+=1
  2. @%0%i:~2%=2>nul||(set,z&pause)
复制代码
天的白色影子

TOP

回复 28# CrLf


    唔,还是保存为0.bat,再省几个字节,不过看着更蛋疼了...
  1. @set/am+=n+=1,1/(n-101)2>nul&&0&echo %m%&pause
复制代码

TOP

其实我7楼的代码字节数还是很少的
不过到这里也学到了个新知识
如无特别说明,代码测试环境均为 XP SP3

TOP

  1. @set sum=0
  2. :count
  3. @echo %sum%
  4. @if %sum% lss 100 set /a sum+=1 && goto :count
  5. pause
复制代码
凑个热闹, 膜拜13, 28楼的方法.
还以为没有人用goto法, 发个比27楼更简单的. -.-

TOP

本帖最后由 CrLf 于 2012-12-21 17:28 编辑

最简很难看……保存为 0.bat
  1. @set/a m+=n+=1,1/(n-100) 2>nul&&0
  2. @echo %m%&pause
复制代码
2

评分人数

    • m891319: 对此思路和写法深感佩服技术 + 1
    • cutebe: set/a m+=n+=1 第一次见技术 + 1

TOP

不能单纯用公式 要用累加的话
goto算不算循环?
  1. @echo off
  2. set n=100
  3. :r
  4. set /a i=%i%+1
  5. set /a a=%a%+%i%
  6. if not %i%==%n% goto :r
  7. echo %a%
  8. pause
复制代码
1

评分人数

Rick

TOP

虽不明,但觉厉。

TOP

回复  Demon


    求bat代码,你也懂的。。。
batman 发表于 2012-12-20 12:14


真小气

TOP

回复 23# Demon


    求bat代码,你也懂的。。。
***共同提高***

TOP

返回列表