자신을 복제하십시오!


13

중지 될 때까지 자체 복제본을 무한정 생성하는 프로그램을 작성해야합니다. 원래 프로그램에있는 것은 클론에 있어야합니다. 즉, 클론과 원본 프로그램은 클론이 소스 코드와 동일한 유형의 파일에있을 필요가 없다는 점을 제외하고 모든면에서 동일합니다 (텍스트 파일 일 수 있음).

예:

내 원래 프로그램이 다음과 같은 경우 :

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

클론도 다음과 같아야합니다.

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

규칙 및 설명 :

  • 표준 허점 은 금지되어 있습니다

  • 클론은 원본의 정확한 사본이어야합니다

  • 클론은 올바른 인터프리터에 넣을 경우 실행할 수있는 읽을 수있는 파일이어야합니다.

  • 프로그램은 자체 소스 코드를 읽을 수 있습니다

  • 모든 클론은 별도의 파일이어야합니다

  • 프로그램을 인쇄 할 수 없습니다

  • 파일 이름은 바이트 수로 계산

  • 클론은 소스 파일과 동일한 디렉토리에 있거나 동일한 파일 이름을 공유 할 필요가 없습니다.

  • 최소 1000 개의 클론을 생성 할 수 있어야합니다

승리:

최소 바이트가 이깁니다!

답변:


3

Zsh , 19 17 9 바이트

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

메타에 대한 합의 의 오두막은 바이트 카운트에서 제외됩니다.

온라인으로 사용해보십시오!

TIO의 지게차 보호는 113 개의 파일이 생성 된 후 프로세스를 종료시킵니다. 이러한 보수적 인 자원 제한없이 시스템에서 1000 개의 파일을 쉽게 생성 할 수 있습니다.


나는 yes `<$0`|split -1훨씬 더 좋아하지만 바이트 수를 두 배로 늘립니다.
Dennis

너무 나쁜에-에서 같은 리디렉션에서 잘 작동하지 않습니다 bash는 한 순간을 위해 :(, 나는 순진하게도 : 당신에게 outgolfed 한 생각
제플린

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

명확히하기 위해 %random%액세스 할 때 언급 된 @ user2428118과 같은 임의의 숫자를 생성하는 변수입니다.
Conor O'Brien

3

세게 때리다, 25, 16, 12, 11 바이트

EDITS :

  • 개행 (-1 바이트)을 제거하고 "온라인으로 시도"를 추가했습니다. 감사합니다 @Dennis!
  • 백그라운드 작업 PID $!를 파일 이름으로 사용하십시오 (~ 32k 파일마다 재사용되지만 이제는 허용됨), -4 바이트

골프

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

설명

복사하기 전에 &를 사용하여 백그라운드 작업으로 다시 생성되므로 각 반복은 자체 PID에서 실행됩니다.

마지막 작업 PID를 파일 이름으로 사용합니다.

이것은 무한대로 (또는 중지 될 때까지) 실행될 수 있지만 복제 파일 이름을 약 재사용합니다. ~ 32k 반복마다.

살해하기에는 조금 불쾌 할 수 있지만 AFAIK는 규칙에 위배되지 않습니다.

온라인으로 사용해보십시오!


내가 직접 시험해 볼 수있는 테스트 장소가 있습니까?
Anthony Pham

@PythonMaster, 나는 일반적으로 Tutorial Point의 온라인 테스트 베드를 사용하지만 uuid가 설치되어 있지 않으며 스크립트가 너무 많은 IO를 수행하는 것을 좋아하지 않습니다.
zeppelin

TIO는 I / O에 문제가 없습니다. 또한 개행 후에는 개행 문자가 필요하지 않습니다 &. tio.run/nexus/bash#VY5BS8NAEIXP7q943W5tq6QpelMRRCIIGg/…
Dennis

3

루비, 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

이것은 나의 첫 번째 루비 답변이므로 모든 증명을 환영합니다.


커널 열기는 파일 열기로 전달하므로 파일을 생략 할 수 있어야합니다. 전부. "w"대신? w. 중괄호가 있기 때문에 File.open에 대한 작업은 쓸모가 없다고 생각합니다.
Alexis Andersen

File.read ( 'a.rb') 대신 open ( 'a.rb',? r)
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 바이트

berkeleybross 덕분에 -2 바이트

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부품을 제거 할 수 있습니다 . 그리고 진술 i에서 in을 미리 증가 시켜서 File.Copy86 바이트를 믿습니다.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"이 2 바이트보다 짧다는 것을 잊지 "c"+ ++i+".cs"
마십시오

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[]
);

즉, "복잡한 코드는"미소
로마 그라프에게

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

파이썬 2, 54 바이트

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

당신은 필요하지 import sys않습니까?
Samuel Shifterovich

@SamuelShifterovich 내가 가지고 있었을 것입니다. 나는 바이트가 나는 프로그램을 위해 지금 나타났다 사용 된 계산으로 그 편집 생존하지 않도록 어떻게 해요
블루

1

수학, 41 바이트

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

전체 프로그램. 복사 자체 소스 파일에 0, 1, 2, 등 현재 디렉토리이다.


1

PHP, 91 60 바이트

manatwork 덕분에 31 바이트 절약

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

사용법 : $ php f.php클론 f.php과 같은 파일 이름에 무한 자체 재현의 코드 1, 2, 3제한 시간까지 ....

이전 버전:

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

사용법 : $ php f.php클론 f.php과 그 코드의 재생은 무한 그 자체가 좋아 f1.php, f2.php, f3.php... f(n).php타임 아웃 될 때까지.


클론 파일 이름은 무엇이든 될 수 있으므로 확장자가없는 숫자 만 사용하면 안됩니다 <?for(;;)file_put_contents(++$i,file_get_contents("f.php"));
manatwork

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

파이썬, 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

자바 스크립트 ES6 34 바이트

이것이 중요한지 확실하지 않지만 여기 있습니다.

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


0

Python 2, 61 바이트 (유닉스) 65 (크로스 플랫폼)

유닉스 - 61 바이트

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

유닉스에서 cp는 시스템 copy-file-명령입니다. popen을 통해 콘솔을 사용하면 cp로 파일을 복사 할 수 있습니다. 새 파일은 이전 파일 디렉토리에 생성됩니다.

크로스 플랫폼 - 65 바이트

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

기본적 으로 열려 있으면 읽을 수 있으므로 작동합니다 .

Funfact :로 교체 1:i+=1하면 i:i-=1i 사본에서 중지됩니다.

그 외에는 @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 퀴인.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.