Quine… 그러나 1 개씩 움직였다


15

10 진수로 인쇄 가능한 ASCII 문자 코드를 참조하면 32에서 126까지 32의 공백이있는 인쇄 가능한 문자가 있음을 알 수 있습니다. 32-125 (126 제외)의 문자 만 사용하여 프로그램을 작성해야합니다.이 코드는 실행될 때 소스 코드의 각 문자에 ASCII 코드가 1 씩 증가하는 것을 제외하고 자체 소스 코드를 인쇄합니다.

예를 들어 소스 코드가

main(){printf("Hello World");}

출력은

nbjo)*|qsjoug)#Ifmmp!Xpsme#*<~

다음은 금지되어 있습니다 :

  • 외부 파일 또는 스토리지 (인터넷 포함) 읽기 / 쓰기 / 사용
  • 자신의 소스 코드 읽기 / 에코
  • 2 자 미만의 소스 코드 (재미 없음). 2 이상이어야합니다.

최소 2 주간 기다린 후, 어떤 언어로든 가장 높은 투표율을 가진 응답이 타이 브레이커 인 적은 문자 수로 승리하는 인기 콘테스트가되었습니다.


왜 126을 허용하지 않지만 32로 가야합니까? (나는 왜 / 어떻게해야하는지 모르겠다.)
Justin

이러한 종류의 질문은 또한 오류 메시지가 "출력"(죄송합니다 @GariBN)으로 간주되는 것을 금지해야합니다. "출력"은 언어 실행 파일에 의해 결정되는 임의의 부작용이 아니라 코드에 의해 표준 출력에 의도적으로 인쇄 된 것입니다.
l0b0

3
사용할 수 없다는 것은 ~실제로 GolfScript를 짜증나게합니다. 당신은 의도적으로 그렇게 했어. :-)
Ilmari Karonen

1
"자신의 소스 코드 읽기"를 정의하십시오. 함수를 문자열화할 수 있습니까, 아니면 문자열을 평가해야합니까?
John Dvorak

1
이 문제는 인기 콘테스트로 적합하지 않은 것 같습니다.
l4m2

답변:


46

파이썬 (27 자)

Python 셸에서 다음 스크립트는 원하는 결과를 출력합니다.

TzoubyFssps;!jowbmje!tzouby

예! 출력 :

SyntaxError: invalid syntax

6
오 이런, 이걸 보지 못했다. :-D
Fixed Point

9
실제로 결과는 틀린 방향으로 바뀐다 : P
Erbureth는 Reinstate Monica

@Erbureth 이것은 많은 다른 답변들과도 관련이 있습니다 ... =)
Gari BN

똑똑하지는 않지만 가장 짧습니다. xD
cjfaure

2
나는 Trollololololol을 부르고 있습니다.
PyRulez

14

응? , 5 자

Ntbg 

다섯 번째 문자는 뒤에 공백Ntbg 입니다. 이것은 이전의 답변 중 하나 와 같은 트릭 입니다. Ntbg는 유효하지 않은 경로이므로 인터프리터는 Ouch!다음과 같이 실행해야합니다.

huh.exe Ntbg 

"Huh"로 많은 퀴즈를 상상할 수 있습니다. 지금. 반전 된 Quine :! hcuO Quine : 아야!
MilkyWay90

8

PHP (351)

코드 골프를 처음 접했을 때 더 좋은 방법이 있다고 확신하지만 다음은 PHP 솔루션입니다.

function q(){$q=chr(39);$a=array('function q(){$q=chr(39);$a=array(',');@$r.=$a[0];foreach($a as$b)$r.=$q.$b.$q.",";$r=substr($r,0,-1);$r.=$a[1];for($i=0;$i<strlen($r);$i++)$r{$i}=chr(ord($r{$i})+1);return $r;}');@$r.=$a[0];foreach($a as$b)$r.=$q.$b.$q.",";$r=substr($r,0,-1);$r.=$a[1];for($i=0;$i<strlen($r);$i++)$r{$i}=chr(ord($r{$i})+1);return $r;}

산출:

gvodujpo!r)*|%r>dis)4:*<%b>bssbz)(gvodujpo!r)*|%r>dis)4:*<%b>bssbz)(-(*<A%s/>%b\1^<gpsfbdi)%b!bt%c*%s/>%r/%c/%r/#-#<%s>tvctus)%s-1-.2*<%s/>%b\2^<gps)%j>1<%j=tusmfo)%s*<%j,,*%s|%j~>dis)pse)%s|%j~*,2*<sfuvso!%s<~(*<A%s/>%b\1^<gpsfbdi)%b!bt%c*%s/>%r/%c/%r/#-#<%s>tvctus)%s-1-.2*<%s/>%b\2^<gps)%j>1<%j=tusmfo)%s*<%j,,*%s|%j~>dis)pse)%s|%j~*,2*<sfuvso!%s<~

6

TI-BASIC, 10

TI-83 / 84 계산기 용!

DQQ9RXMS@W

출력 :

ERR:SYNTAX

6

GolfScript, 15 자

{`{)}%"/2+"}.1*

산출:

|a|*~&#03,#~/2+

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

"회전 퀴인"챌린지에 참가할 때 사용한 기술을 기반으로하는 매우 간단한 솔루션 입니다. 까다로운 세부 사항 중 하나 ~는 챌린지 규칙에 따라 문자 (ASCII 126)가 허용되지 않으므로 코드 블록을 실행하는 데 사용할 수 없다는 것입니다. 다행히 1*동의어로 사용할 수 있습니다.

설명:

코드 블록 {`{)}%"/2+"}은에 의해 복제되고 .두 번째 사본은 1*(기술적으로는 단일 반복 루프)에 의해 실행되며 다른 사본은 스택에 남습니다. 코드 블록 내부 `코드 블록을 stringifies하고, {)}%하나 각각 증가 (의 ASCII 코드)의 문자를 통해 반복합니다. 마지막으로 "/2+"리터럴 문자열 /2+( .1*1 씩 이동)을 스택으로 푸시합니다. 프로그램이 끝나면 GolfScript 인터프리터는 자동으로 스택에 모든 것을 인쇄합니다.

추신. 예, 이것이 라는 것을 알고 있습니다 엄격한 아닌 . 그러나 GolfScript와 관련하여 다른 작업은 무엇입니까? ASCII 아트? ;-)


3

자바 스크립트, 117 자

나는 그것이 코드 골프가 아니라는 것을 알고 있지만 어쨌든 골프를 쳤다.

function f(){alert((f+';f()').split('').map(function(x){return String.fromCharCode(x.charCodeAt()+1)}).join(''))};f()

(나는 내 ​​자신의 소스 코드를 읽지 않고 단순히 Function객체의 toString기능을 사용하고 있습니다.)


2

Java-1331 바이트, 618 바이트 및 504 바이트

여기는 자바입니다. 멋진 점은 꽤 읽기 쉽고 유연하다는 것입니다. SHIFT변수를 0 으로 변경하는 실험을 할 수 있으며 퀴인이됩니다. 음수 값을 포함하여 원하는 값으로 변경할 수 있으며 그에 따라 코드가 이동합니다.

public class Quinex {

    private static final int SHIFT = 1;

    private static String next(String now, boolean mangles) {
        String sb = "";
        for (char c : now.toCharArray()) {
            if (!mangles && c == 87) {
                sb += next(String.valueOf(SHIFT), true);
            } else {
                sb += (char) ((mangles ? c : c == 94 ? 10 : c == 64 ? 34 : c) + SHIFT);
            }
        }
        return sb;
    }

    public static void main(String... args) {
        System.out.println(next(TEXT, false) + next(TEXT, true) + new String(new char[] { 34, 59, 10, 125 }));
    }

    private static final String TEXT = "public class Quinex {^^    private static final int SHIFT = W;^^    private static String next(String now, boolean mangles) {^        String sb = @@;^        for (char c : now.toCharArray()) {^            if (!mangles && c == 87) {^                sb += next(String.valueOf(SHIFT), true);^            } else {^                sb += (char) ((mangles ? c : c == 94 ? 10 : c == 64 ? 34 : c) + SHIFT);^            }^        }^        return sb;^    }^^    public static void main(String... args) {^        System.out.println(next(TEXT, false) + next(TEXT, true) + new String(new char[] { 34, 59, 10, 125 }));^    }^^    private static final String TEXT = @";
}

그러나 이전 클래스의 유일한 단점은 줄 바꿈인데, 이는 질문 사양에서 허용되지 않습니다 (32-125 범위를 벗어남). 그래서 여기에 줄 바꿈이없는 골프 버전을 제공합니다 (그리고 처리 할 수있는 단점이 없음). S변수 값을 편집 하여 이동을 변경할 수 있습니다. 618 바이트가 있습니다 :

class Q{static String g(String p,int m){int S=1;String u="";for(char c:p.toCharArray()){if(m==0&&c==87){u+=g(String.valueOf(S),1);}else{u+=(char)((m>0?c:c==64?34:c)+S);}}return u;}public static void main(String[]y){System.out.println(g(T,0)+g(T,1)+new String(new char[]{34,59,125}));}static final String T="class Q{static String g(String p,int m){int S=W;String u=@@;for(char c:p.toCharArray()){if(m==0&&c==87){u+=g(String.valueOf(S),1);}else{u+=(char)((m>0?c:c==64?34:c)+S);}}return u;}public static void main(String[]y){System.out.println(g(T,0)+g(T,1)+new String(new char[]{34,59,125}));}static final String T=@";}

확실히 오프셋의 미세 조정을 줄이고 시프트 값을 하드 코딩하면 504 바이트로 완전히 골프 버전을 만들 수 있습니다.

class Q{static String g(String p,int m){String u="";for(char c:p.toCharArray()){u+=(char)((m>0?c:c==64?34:c)+1);}return u;}public static void main(String[]y){System.out.println(g(T,0)+g(T,1)+new String(new char[]{34,59,125}));}static final String T="class Q{static String g(String p,int m){String u=@@;for(char c:p.toCharArray()){u+=(char)((m>0?c:c==64?34:c)+1);}return u;}public static void main(String[]y){System.out.println(g(T,0)+g(T,1)+new String(new char[]{34,59,125}));}static final String T=@";}

1

Perl 5, 284 자, 줄 바꿈 포함

~를 사용하지 못하게하면 조금 더 까다로워졌습니다.

#!/usr/bin/perl
$_=<<X;
#!/usr/bin/perl
Y
\$a=\$_;
s/\\\\/\\\\\\\\/g;
s/\\\$/\\\\\\\$/g;
\$b=\$_;
\$_=\$a;
s/Y/\\\$\\_\\=\\<\\<X\\;\\n\${b}X/;
s/(.)/chr(ord(\$1)+1)/ge;
print;
X
$a=$_;
s/\\/\\\\/g;
s/\$/\\\$/g;
$b=$_;
$_=$a;
s/Y/\$\_\=\<\<X\;\n${b}X/;
s/(.)/chr(ord($1)+1)/ge;
print;

1

파이썬, 99

s='import sys;sys.stdout.write("".join(chr(ord(c)+1)for c in a%(s,a)))';a='s=%r;a=%r;exec s';exec s

산출:

t>(jnqpsu!tzt<tzt/tuepvu/xsjuf)##/kpjo)dis)pse)d*,2*gps!d!jo!b&)t-b***(<b>(t>&s<b>&s<fyfd!t(<fyfd!t

이것은 75 자로 단축 될 수 있지만 출력 후에 줄 바꿈 문자를 인쇄하여 기술적으로 규칙을 위반합니다.

s='print"".join(chr(ord(c)+1)for c in a%(s,a))';a='s=%r;a=%r;exec s';exec s

1
\x09탭이 한 줄씩 이동하면 줄 바꿈 ( \x0A) 이기 때문에 탭 ( )을 끝에 두지 마십시오 . 그런 다음 단축 버전은 76 바이트로 작동합니다.
mbomb007


0

루아-192

꽤 직설적 인,

s=[[print((('s=['..'['..s..']'..']'..s):gsub('.',function(x)return string.char(x:byte()+1)end)))]]print((('s=['..'['..s..']'..'];'..s):gsub('.',function(x)return string.char(x:byte()+1)end)))

0

C-156

char*f="char*f=%c%s%c,q[200];i;main(){sprintf(q,f,34,f,34);while(q[i])q[i++]++;puts(q);}",q[200];i;main(){sprintf(q,f,34,f,34);while(q[i])q[i++]++;puts(q);}

필요한 수정이 필요한 고전적인 C 퀘인

추신 : 분명히 sprintf(f,...,f,...)segfault입니다.


0

자바 스크립트 (276)

사용하지 않고 .toString():

function q(){x=String.fromCharCode;y=x(39);a=['function q(){x=String.fromCharCode;y=x(39);a=[','];r=a[0]+y+a[0]+y+","+y+a[1]+y+a[1];q="";for(c in r)q+=x(r[c].charCodeAt(0)+1);return q;}'];r=a[0]+y+a[0]+y+","+y+a[1]+y+a[1];q="";for(c in r)q+=x(r[c].charCodeAt(0)+1);return q;}

0

루비, 63

젠장,이 문서에는 heredoc을 사용할 수 없습니다.

s="s=%p;(s%%s).chars{|c|$><<c.succ}";(s%s).chars{|c|$><<c.succ}

루비는 .succ캐릭터에 이것을 수행 하는 기본 방법 을 가지고 있으며 , 개행없이 인쇄하는 것이 인쇄하는 것보다 짧기 때문에 꽤 깔끔하게 작동합니다.


0

C, 153

main(a){char b[999];sprintf(b,a="main(a){char b[999];printf(a=%c%s%c,34,a,34);for(a=0;b[a];)b[a++]++;puts(b);}",34,a,34);for(a=0;b[a];)b[a++]++;puts(b);}

C.에서 고전적인 quine의 또 다른 수정






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