克隆自己!


13

您将要创建一个程序,该程序可以无限创建自己的精确克隆,直到停止为止。原始程序中的所有内容都必须在克隆中。换句话说,克隆和原始程序在每种方式上都是相同的,只是克隆不必与源代码位于同一文件类型(它们可以是文本文件)。

例:

如果我的原始程序是:

for i in range(0, 10):
     print i

克隆还必须是:

for i in range(0, 10):
     print i

规则和说明:

  • 禁止出现标准漏洞

  • 副本必须是原始副本的精确副本

  • 克隆必须是可读文件,如果放入正确的解释器中,则可以运行

  • 该程序可以读取自己的源代码

  • 所有克隆都必须是单独的文件

  • 不允许打印程序

  • 文件名计入字节数

  • 克隆不必与源文件位于同一目录中,也不必共享相同的文件名

  • 至少应能创建1000个克隆

获奖情况:

最小字节获胜!

Answers:


3

Zsh19 17 9字节

#!/bin/zsh
<$0>$$;$0

根据对meta的共识,shebang从字节数中排除。

在线尝试!

请注意,在生成113个文件之后,TIO的前炸弹保护将终止该进程。在没有这种保守资源限制的情况下,它可以轻松地在系统上生成1000个文件。


yes `<$0`|split -1好多了,但是字节数增加了一倍……
丹尼斯

太糟糕了,这样的进出重定向无法在bash中很好地发挥作用 :(有一刻,我很天真地以为已经超越了您:)
zeppelin

4

批处理,32字节

set/an=%1+1
copy %0 %n%
%0 %n%

不使用,@因为对STDOUT没有限制。%1默认为空字符串,因此n成为1第一次并在每次通过时递增。另外,这可能适用于28个字节,但是我不知道%random%在这样使用时实际有多随机:

copy %0 %random%%random%
%0

2
IIRC %random%基于当前时间,可以生成从0到略高于32,000的任何值。
user2428118 '16

澄清%random%一下,是一个变量,在访问时会产生一个随机数,如@ user2428118所述。
科纳·奥布赖恩

3

重击 251612,11字节

编辑:

  • 删除了换行符(-1个字节),添加了“在线试用”。谢谢@丹尼斯!
  • 使用后台作业PID $!作为文件名(每32k文件将重用,但现在允许),-4字节

打高尔夫球

#!/bin/bash
$0&cp $0 $!

解释

在进行复制之前,使用&重新生成自身作为后台作业,因此每次迭代都将在其自己的PID下运行。

使用最后一个作业PID作为文件名。

这可以无限运行(或直到停止),但是将重用克隆文件名。每〜32k迭代。

可能会令人讨厌,但AFAIK并不违反规定。

在线试用!


您是否有测试场所可以自己尝试?
Anthony Pham

@PythonMaster,我通常会使用Tutorial Point的在线测试平台,但它没有安装uuid,也不喜欢脚本执行大量IO。
齐柏林飞艇

TIO的I / O没有问题。另外,您不需要在之后的换行符&tio.run/nexus/bash#VY5BS8NAEIXP7q943W5tq6QpelMRRCIIGg/…–
丹尼斯

3

Ruby,78字节77 43 + 4(文件名:a.rb)= 47字节

  • 版本1.2

43字节+名称/感谢@Alexis这么短!!!

loop{File.write "#{$.+=1}",open("a.rb",?r)}

就像我想的那样打高尔夫球

  • 版本1.1

73个字节+名称/感谢@Alexis Anderson

i=0
loop do
File.open("#{i}",?w){|b|b.puts File.read("a.rb",?r)}
i+=1
end
  • 版本1.0

74字节+名称

i=0
loop do
File.open("#{i}","w") do{|b|b.puts File.read("a.rb")}
i+=1
end

这是我的第一个Ruby答案,因此欢迎所有改进。


内核打开转发到文件打开,您应该可以省略文件。共。?w代替“ w”。我认为File.open上的do没有用,因为您有花括号。
亚历克西斯·安徒生

open('a.rb',?r)代替File.read('a.rb')
Alexis Andersen

?w是字符w。字符串本身就是权利。?w =='w'。因此您不需要在“?w”中加上引号
Alexis Andersen

i = 0循环执行File.write“#{i}”,open(“ a.rb”,?r)i + = 1结束
Alexis Andersen

实际上,您也可以将花括号用于循环方法
Alexis Andersen


2

C#,104102字节

-2字节归功于berkeleybross

namespace System.IO{class a{static void Main(){int i=0;while(1>0){i++;File.Copy("c{i}.cs");}}}}

不,这不是最短的。但这是C#。您期望什么?


1
您不需要名称空间,因此可以完全限定File.Copy。更改为for循环,以便您可以内联int声明并删除该1>0部分。和预增量iFile.Copy声明中,给你86个字节,我相信:class P{static void Main(){for(int i=0;;)System.IO.File.Copy("c.cs","c"+ ++i+".cs");}}
TheLethalCoder

实际上,这是行不通的,因为c.cs它将不在输出目录中,而必须手动将其复制到该目录中。这是如何运作的?
TheLethalCoder

不要忘记字符串插值$"c{++i}.cs""c"+ ++i+".cs"
berkeleybross

1

处理中,55 + 5(文件名)= 60字节

我不知道文件名是否算作多余的字节

for(int i=0;;)saveStrings(i+++"",loadStrings("a.pde"));

几乎所有内置在一起的一系列内置插件

说明

for(int i=0;;)           //A complex piece of code that cannot be explained in words alone
saveStrings(             //Save param2 (String[]) into file param1 (String)
 i+++"",                 // filename: the int i (and then is incremented)
 loadStrings("a.pde")    // content: load the content of file a.pde as a String[]
);

那个“复杂的密码”在微笑
RomanGräf16年

1

ForceLang + ForceLang-JS模块,162个字节

set j require njs
j var a=function(){for(;;){var p=new java.io.PrintStream(Math.random()+".txt");p.println("set j require njs");p.print("j var a="+a+";a()")}};a()

1

Python 2,54个字节

from shutil import*
a=__file__
while`copy(a,a*2)`:a*=2

不必import sys吗?
塞缪尔·Shifterovich,

@SamuelShifterovich我本来可以的。我不确定该编辑如何存活下来,因为我正在使用的字节数用于现在显示的程序
Blue

1

Mathematica,41个字节

For[a=0,1>0,$Input~CopyFile~ToString@a++]

完整程序。复制它自己的源文件为012等在当前目录。


1

PHP,91 60字节

通过操作节省了31个字节

<?for(;;)file_put_contents(++$i,file_get_contents("f.php"));

用法:$ php f.php克隆f.php及其代码文件名一样无限本身重现123...直到超时。

先前版本:

<?for($i=0;;$i++)$p=fwrite(fopen("$i.php","w"),fread(fopen($f="f.php","r"),filesize($f)));

用法:$ php f.php克隆f.php及其代码再生无限本身喜欢f1.phpf2.phpf3.php... f(n).php,直到超时。


由于克隆文件名可以是任何名称,为什么不只使用不带扩展名的数字呢?<?for(;;)file_put_contents(++$i,file_get_contents("f.php"));
manatwork 2013年

0

awk,29(21)字节,

{while(close(i++)||1)print>i}

awk并不是真正的工具,因为它close()在无限期运行时需要。否则,它产生的都是空文件。

如果克隆计数有限制,例如5:

{while(++i<5)print>i}

该程序将是21个字节。

将该程序粘贴到文件中a并运行:

$ awk -f a a

0

Python,69个字节

a=open(__file__).read()
i=0
while 1:i+=1;open(`i`+'.py','w').write(a)

我尝试使用a文件名命名,但是(毫不奇怪)Windows不喜欢名为a=open(__file__).read()\ni=0\nwhile 1:i+=1;open(i的文件+'.py','w').write(a)。我也尝试过这个:

a=open(__file__).read()
i=''
while 1:i+='.py';open(i,'w').write(a)

但是它给了我这个错误:

Traceback (most recent call last):
  File "C:/Python27/codeGolfCopy.py", line 3, in <module>
    while 1:i+='.py';open(i,'w').write(a)
IOError: [Errno 2] No such file or directory: '.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py'

它创建了83个文件,但是还远远不能达到所需的1000个文件。

如果要删除这些文件,可以使用以下命令:

import os;i = 1
while 1:os.remove(`i`+'.py');i+=1

0

RBX.Lua,14个字节

即使是我不知道的文件系统

script:Clone()

克隆本身。实例化后,再次运行,因此提供了自动递归。


0

JavaScript ES6 34字节

不知道这是否有价值,但是在这里:

_=()=>alert("_="+_+";_()")&_();_()


0

Python 2,61字节(Unix)65(跨平台)

Unix - 61字节

import os;i=1
while os.popen('cp %s %i.py'%(__file__,i)):i+=1

在unix cp上是系统复制文件-命令。通过popen使用控制台,使我可以通过cp复制文件。新文件将在旧文件目录中产生。

CrossPlatform - 65个字节

i=0
while 1:i+=1;open('%i.py'%i,'w').write(open(__file__).read())

这是可行的,因为默认情况下打开允许读取。

功能:用替换1:i+=1i:i-=1它将在i副本处停止。

除此之外,我认为没有比@muddyfish短的方法了。


0

C,80字节

main(a){while(1)printf(a="main(a){while(1)printf(a=%c%s%c,34,a,34);}",34,a,34);}

自行打印,直到将其杀死。只是带有无限循环的标准C quine。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.