返回列表 发帖

批处理奎因 (Quine) 自产生程序

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

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

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

关于奎因:
http://en.wikipedia.org/wiki/Quine_(computing)
http://zh.wikipedia.org/wiki/自產生程式

有趣,不过不明白这目的何在呢?
另,是否应声明是在 cmd 窗口中黏贴执行?

TOP

@echo off
type "%0"COPY
@echo off
more "%~0"COPY
@echo off
findstr .* "%~0"COPY

TOP

回复 2# CrLf

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

下面的代码可以生成这个奎因代码, 显示它的内容, 运行它输出结果, 最后将奎因代码的 输出文件 和 奎因代码 自身进行比较, 检测 是否完全一致:
@echo off & endlocal
set "Quine=BatchQuine.bat"
set "Output=Output.bin"
call :genQuine
echo TYPE %Quine%:
type %Quine%
echo.
pause > nul
echo %Quine% OUTPUT:
call %Quine%
pause > nul
echo.
echo TEST whether the output is SAME to the source code:
call %Quine% > %Output%
echo fc /b %Output% %Quine%
fc /b %Output% %Quine%
pause > nul
exit
:genQuine
> %Quine% (
  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!""
  echo Set E=%%%%
  echo Cmd/V:On/C"%%T%%"
)
exit /bCOPY

TOP

回复 3# gawk

的确输出了自身, 这一点符合, 但违背了奎因自产生程序的另一点: 不读取任何输入

TOP

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

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

TOP

返回列表