Board logo

标题: 批处理奎因 (Quine) 自产生程序 [打印本页]

作者: neorobin    时间: 2012-5-2 16:31     标题: 批处理奎因 (Quine) 自产生程序

本帖最后由 neorobin 于 2012-5-2 16:32 编辑

奎因 (Quine) 是这样一种计算机程序,不读取任何输入,并只会输出一个它自身源代码的副本.
这种程序在可计算性理论和计算机科学文献中的标准术语是自产生程序.

本文给出一个 109 字节的批处理奎因程序, 请用下面的命令运行它, 以确保 延迟变量扩展 被禁用 以及 ECHO 处于关的状态.
  1. Cmd /Q /V:Off /C BatchQuine.bat
复制代码
下面是批处理奎因代码, 同时也是它输出的内容.
如果将输出重定向到一个文件, 那么生成的文件将是 109 字节, 而下面的代码如果第 3 行没有最后的一对 CR LF 字符, 将少 2 个字节, 即只有 107 个字节.
但无论是否存在最后的一对 CR LF 字符, 输出都将是 109 字节.
  1. Set "T=Echo Set "T=!T!"&Call Echo Set E=!E!E!E!!E!E!E!&Echo Cmd/V:On/C"!E!T!E!""
  2. Set E=%%
  3. Cmd/V:On/C"%T%"
复制代码
转自 dostips
http://www.dostips.com/DtTipsQuine.php

关于奎因:
http://en.wikipedia.org/wiki/Quine_(computing)
http://zh.wikipedia.org/wiki/自產生程式
作者: CrLf    时间: 2012-5-2 18:10

有趣,不过不明白这目的何在呢?
另,是否应声明是在 cmd 窗口中黏贴执行?
作者: gawk    时间: 2012-5-2 18:42

  1. @echo off
  2. type "%0"
复制代码
  1. @echo off
  2. more "%~0"
复制代码
  1. @echo off
  2. findstr .* "%~0"
复制代码

作者: neorobin    时间: 2012-5-2 19:04

回复 2# CrLf

这里的奎因代码, 要以批处理文件的方式运行, 不能粘贴到命令行去运行, 那样得不到和自身一样的输出

下面的代码可以生成这个奎因代码, 显示它的内容, 运行它输出结果, 最后将奎因代码的 输出文件 和 奎因代码 自身进行比较, 检测 是否完全一致:
  1. @echo off & endlocal
  2. set "Quine=BatchQuine.bat"
  3. set "Output=Output.bin"
  4. call :genQuine
  5. echo TYPE %Quine%:
  6. type %Quine%
  7. echo.
  8. pause > nul
  9. echo %Quine% OUTPUT:
  10. call %Quine%
  11. pause > nul
  12. echo.
  13. echo TEST whether the output is SAME to the source code:
  14. call %Quine% > %Output%
  15. echo fc /b %Output% %Quine%
  16. fc /b %Output% %Quine%
  17. pause > nul
  18. exit
  19. :genQuine
  20. > %Quine% (
  21.   echo Set "T=Echo Set "T=!T!"&Call Echo Set E=!E!E!E!!E!E!E!&Echo Cmd/V:On/C"!E!T!E!""
  22.   echo Set E=%%%%
  23.   echo Cmd/V:On/C"%%T%%"
  24. )
  25. exit /b
复制代码

作者: neorobin    时间: 2012-5-2 19:06

回复 3# gawk

的确输出了自身, 这一点符合, 但违背了奎因自产生程序的另一点: 不读取任何输入
作者: email10t    时间: 2015-3-3 00:09

本帖最后由 email10t 于 2015-3-3 11:52 编辑

回复 5# neorobin
所以不是奎因。!
因为 3楼的代码接收输入了!!!




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2