我也出个题,用js写个打印自己源码的程序
发布于 10 年前 作者 zealoth 5708 次浏览 最后一次编辑是 7 年前

如题,如果你程序名是a.js 则在命令行中运行 node a.js 及 cat a.js (linux, osx) 或 type a.js (windows, dos) 及 cat a.js | node node a.js | node | node | node … | node , 任意多的 |node 结果都一样 输出内容一样。非空短者胜

其实不难,不过瘾,可以用c试试

25 回复

a.js 内容如下

终结此问题

C难,js不难,注意去掉node.js的function(exports, require, module, __filename, __dirname){ }就行了。

出乎意料,忘了加非空的限制了

我去,我刷了半天,我以为我浏览器出问题了,现在明白了。 楼主你觉得我解出来了么?

@coordcn 没看明白,能写出来吗?

@zealoth

var bar;
var test;

(function(){
  console.log(arguments.callee.caller.toString().slice(61, -1));
})();

@coordcn 太长了,我的还要短

@zealoth 原理一样么?

@zealoth

console.log(arguments.callee.toString().slice(61, -1));

node.js自己添加的函数也是要利用起来的,根本没必要自己再包装一个。

@zealoth 那上面的已经是我能做到的最短了(不算console.log总共20个字好像),坐等答案。

@coordcn 我试了,你的这个没正常的结果,另外长度是56字节,还是长,怎么是20个? 如果是(function(){console.log(arguments.callee.caller.toString().slice(61, -1));})() 长度79,输出时还多了3个回车,与原文不符

@zealoth 我试过了啊,数错了,应该是20几双。 console.log(arguments.callee.toString().slice(61, -1)); 按上面的,没注意回车啊,我再改进下。

20几双还是长 cat a.js | node 这样就没结果就不对了,是吗?

我用windos,有类似命令么?

@coordcn type a.js | node

console.log(require(‘fs’).readFileSync(‘test.js’).toString()); 不会是这个东西吧。

console.log(require('fs').readFileSync(__filename).toString()); 不过这样无法在REPL上运行

都不对啊,三个条件 node a.js cat a.js cat a.js | node 输出完全一样

console.log()会自动加’\n’,换成process.stdout.write就没有多余的一行,就完全一样了。 这个肯定不是最短的。楼主速度放出答案吧。^_^

print-self.js

require('fs').createReadStream('print-self.js').pipe(process.stdout)

读自己文件内容,这方法就不要再想了,不会是最短的, 而且受制于文件名,文件名一变,结果就不对了

公布答案: function a(){console.log(a+";a()")};a()

文件名任意, 大家想偏了,用c做过这题的人,就没问题。

回到顶部