interweaving quine 만들기


17

당신의 작업은 실행될 때 스스로 출력으로 반환하는 프로그램을 만드는 것입니다 (이것은 퀴네라고합니다). 그러나,이 quine의 필수는,이 복사 할 때 n시간의 quine을 반환하지만 그 문자의 각 장소에서 중복과 n시간, 여기서 n양의 정수이다.

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

Derp -> Derp (must return itself as output to be a quine)

DerpDerp -> DDeerrpp
(the "Derp" is copied twice, so each character in the output has to be copied twice)

DerpDerpDerp -> DDDeeerrrppp
etc. etc.

"기본"프로그램에는 공백이 허용되지만 "혼합"할 때 계산됩니다. 당신의 프로그램이

Derp 
{newline}

개행은 후행 개행을 나타내며. 뒤에 추가 공간이 Derp있습니다. 복제 될 때

Derp 
Derp 
{newline}

당신은 출력해야합니다

DDeerrpp  
{newline}
{newline}

다음에 2추가 공백 이 있음을 기억 하십시오 DDeerrpp.

규칙 및 사양 :

  • 프로그램은 최소한 두 개의 고유 문자를 포함해야합니다 (코드 길이가 2 바이트 이상이어야 함).
  • 표준 퀴니 규칙이 적용됩니다.

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다!


1
"표준 규칙 적용"-소스 코드를 읽지 않는다는 의미입니까?
FlipTack

@FlipTack 그것은 더 많은 정보를 원하시면 링크를 읽으십시오.
clismique

답변:


12

핵분열 , 6 바이트

'!+OR"

온라인으로 사용해보십시오! 두 장을보십시오! 세 번 시도하십시오!

설명

이것은 Fission 표준 quine 입니다. Fission은 프로그램에 명확한 진입 점을 가지고 있기 때문에이 문제에 대해 효과가 있습니다. 특히 프로그램을 복제함으로써 R다른 원자를 추가하는 또 다른 원자를 추가합니다 (지시 포인터). 소스 코드는 환상적이므로 실행중인 유효 코드는 다르게 변경되지 않습니다. 각 원자마다 코드는 여전히 동일하게 보입니다. 그러나 원자는 잠금 단계에서 실행되므로 인쇄되는 항목이 인터리브되고 출력에 각 문자의 추가 사본이 제공됩니다.

완벽을 기하기 위해 프로그램 자체의 작동 방식을 간단히 반복하겠습니다. 프로그램의 반복 여부에 관계없이 (예 '!+OR"'!+OR"'!+OR":) 각 아톰에는 다음 코드가 표시됩니다.

R"'!+OR"'!+O

"토글 문자열 인쇄 모드는, 그래서 프로그램은 인쇄하여 시작 '!+OR하는 모든 따옴표를 제외하고 quine이다 STDOUT에 직접. 그러면 '!문자의 코드 원자의 질량을 설정 !, +범 그것을 단위, "O동시에 원자를 파괴하면서 인쇄를. 그러면 남아있는 원자가 없기 때문에 프로그램이 종료됩니다.


11

파이썬 2.7, 377 310 304 194 191 바이트!

이것은 나의 첫 번째 골프이기 때문에 골프가 너무 좋다고는 생각하지 않았습니다. 그러나 내가 생각해 낸 솔루션의 개념이 다소 재미 있다고 생각했기 때문에 어쨌든 게시하고 있습니다.

def f():
 import threading as T,inspect as i;global t,a,i
 try:t.cancel()
 except:a=0
 a+=1;t=T.Timer(1,d);t.start()
def d():print''.join(c*a for c in i.getsource(f)+i.getsource(d)+"f()")
f()

실제로 이것은 퀴네입니다. 당신은 할 수 여기를보십시오 . 검사 모듈을 매우 어렵게 남용합니다.

동일한 소스 코드 x2로 실행하면 올바른 결과를 얻을 수 있습니다. 당신은 할 수 있습니다 여기에 시도 . x3, x4 등은 모두 예상대로 작동합니다.

설명이없는 골퍼

def f():                                   # Defines a central function f
    import threading as T,inspect as i     # Imports threading and inspect
    global t,a,i                           # Global vars
    try:
        t.cancel()                         # Tries to cancel Timer from previous code
    except:
        a = 0                              # Reached when code is 1st copy; initializes a.
    a += 1                                 # a++; this is the number of copies thus far.
    t = T.Timer(1,d)               # Creates, then starts a timer to call function
    t.start()                              # d in 1 second.

def d():                                   # Prints out the source code; the quine part.
    print''.join(c*a for c in i.getsource(f)+i.getsource(d)+"f()")

f()                                        # Calls f()!

?를 사용하여 자체 함수의 소스 코드를 읽을 때 부정 행위가 아닌가 inspect? ( 관련 메타 게시물 참조 ). PPCG에는 퀴인을 유효하게 만드는 것에 대한 특정 정의가 있으며 '소스를 읽는 것' 은 일반적으로 부정 행위로 간주됩니다.
FlipTack

@FlipTack 함수를 검사하는 것이 소스 코드를 읽는 것과 같은지 확실하지 않습니다. JavaScript 및 스택 기반 언어의 Quines가 항상이 작업을 수행합니다.
Dennis

확인 :). 귀하의 게시물에 구문 강조 표시를 추가했습니다. 스레딩을 사용하는 것이 좋습니다!
FlipTack

import threading,inspect as i가능import threading as T,inspect as i
nedla2004

@FlipTack 죄송합니다.
Calconym

3

CJam , 19 바이트

{]W=s"_~"+T):Te*}_~

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

작동 원리

{               }_~  Define an anonymous code block (function).
                 _~  Push a copy, and execute the copy.
 ]W=                 Wrap the entire stack in an array and select its last element.
                     This discards whatever was on the stack before the original
                     code block, which is needed for subsequent iterations.
    s"_~"+           Cast the code block to string, push "_~", and concatenate.
                     This pushes the stringified source code on the stack.
          T):T       Push T (initially 0), increment it, and save the result in T.
              e*     Repeat each character in the stringified source code T times.

뭐 ... 어떻게 ... 너무 빨리 ... 코드를 설명 해주세요. CJam의 방법을 가르쳐주세요.
clismique

@ Qwerp-Derp 설명을 추가했습니다.
Dennis

3

RProgN , 66 바이트

중요한 공백은 나의 죽음

[ "[ %q ] F 0 1 + `0 = `. { 0 m } R " ] F 0 1 + `0 = `. { 0 m } R 

설명

[ "[ %q ] F 0 1 + `0 = `. { 0 m } R " ] F 0 1 + `0 = `. { 0 m } R   #
[                                                                   # Pop whatever is already on the stack, if anything.
  "[ %q ] F 0 1 + `0 = `. { 0 m } R "                               # This string contains basically the entire function.
                                      ] F                           # ] F duplicates the string, and then F formats it, which in this case puts the first string into the second at %q, surrounded by qoutes.
                                          0 1 + `0 =                # I needed an Incrementer, so I chose 0. 0, is conveniently, pre initilized at 0. And because RProgN is horrifying, you can remap the number functions as they're just more variables. So this increments 0 every time the group is called.
                                                     `. { 0 m } R   # Replace each character with itself repeated '0' times. Because '0' is an incrementer, each time the script is called, the amount of times the characters are repeated increase.

좋은 주 님 나는 괴물입니다 ...

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


또한 ~["[%q]F01+`0=`.{0m}R"]F01+`0=`.{0m}R일반적으로 잘 작동 하지만 ZSS 마커를 복제 할 방법이 없기 때문에 올바른 솔루션이 아닙니다.
ATaco

2

펄 5, 107 바이트

$_=q[$_=q[S];s/S/$_/;$a++;END{s/./$&x$a/eg;print if$a;$a=0}];s/S/$_/;$a++;END{s/./$&x$a/eg;print if$a;$a=0}

언 골프 드 :

$_ = '...INSERT_SOURCE_HERE...';      # Standard quine
s/INSERT_SOURCE_HERE/$_;
$a++;                                 # Count the number of repetitions
END {
    s/./$&x$a/eg;                     # Interweave
    print if $a;                      # Print...
    $a=0;                             # ...but only once
}

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


2

파이썬 (3) , 122 (121) 112 바이트

s='try:from atexit import*;n+=1\nexcept:n=1;register(lambda:[print(end=c*n)for c in"s=%r;exec(s);"%s])';exec(s);

온라인으로 사용해보십시오 : 1 부 | 두 부 | 세 부 | 자동 확인 기능을 갖춘 4 부

작동 원리

이것은 표준 Python quine을 사용합니다. 실행할 코드를 변수 (문자열)로 저장하십시오. 문자열 자체에 인쇄 할 논리, 그 이전의 모든 것 및 그 이후의 모든 것을 포함하십시오. 그런 다음 해당 문자열을 실행하십시오.

문자열 s 를 통해 실행되는 코드 는 다음과 같습니다.

try:from atexit import*;n+=1
except:n=1;register(lambda:[print(end=c*n)for c in"s=%r;exec(s);"%s])

첫 번째 줄은 무조건 atexit 모듈을 가져 오므 로 종료 핸들러를 등록 할 수 있습니다. 동일한 모듈을 여러 번 가져 오려고해도 스크립트에 영향을 미치지 않습니다. 그런 다음 실행 된 소스 코드의 사본 수를 추적하기 위해 변수 n 증가시킵니다 .

두 번째 줄은 첫 번째 줄에 오류가있는 경우에만 실행됩니다. n 이 아직 정의되지 않았기 때문에 이것은 첫 번째 반복의 경우입니다 . 이 경우 n1 로 초기화 하고 실제 마술을 수행하는 람다를 등록합니다.

등록 된 엑시트 핸들러

lambda:[print(end=c*n)for c in"s=%r;exec(s);"%s]

프로그램이 끝나기 직전에 호출됩니다. 람다 자체가 캐릭터를 생성 "s=%r;exec(s);"%s- %r오른쪽 인자 (의 캐릭터 라인 표현 생성 그 문자를 통해 반복 할 다음 - 작은 따옴표와 따옴표 자신 사이의 모든 것을 포함). 각 문자 c 에 대해 간단히 c의 n 사본을 인쇄 합니다. 명명 된 인수 로 전달하면 줄 바꿈이 추가되지 않습니다.c*nendprint


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