부정 행위


56

오랜 시간 숨은 사람, 최초의 포스터. 여기로갑니다.

quine 의 Wikipedia 페이지에서 "Quine은 자체 소스 코드를 보면 부정 행위로 간주됩니다"라고 말합니다. 당신의 임무는 자체 소스 코드를 읽는 이러한 "치팅 퀴인"중 하나를 만드는 것입니다.

이것은 이므로 각 언어에서 가장 짧은 바이트 단위의 코드가 우선합니다 . 이것은 5 바이트 Pyth 스크립트가 21 바이트 Python 스크립트를이기는 것이 아니라 15 바이트 Python 스크립트를이기는 것을 의미합니다.

소스 코드를 읽으려면 파일 I / O를 사용해야하므로 공식 Wikipedia 페이지에서 가져온 다음 JavaScript 코드가 유효하지 않습니다.

function a() {
    document.write(a, "a()");
}
a()

디스크 에있는 파일의 소스 코드에 액세스해야합니다 .

파일 이름을 지정할 수 없습니다. 파일 이름 자체를 감지하도록해야합니다.

모두 클리어? 가다!


1
원본 파일에없는 후행 줄 바꿈이 허용됩니까?
— isaacg

3
@isaacg IMHO 소스 코드가 아니기 때문에 quine이 아닙니다.
— mınxomaτ

3
소스 위치에 대해 하드 코드 된 문자열을 가정하는 대신 실제 파일 이름을 결정해야한다는 요구 사항을 명시해야합니다.
— feersum

3
그러나 @feersum에 동의하지만 특정 파일 이름을 요구하면이 도전이 쉽지 않습니다.
— mınxomaτ

1
(컴파일 된 언어의 경우) 소스 코드가 동일한 폴더에 있다고 가정 할 수 있습니다 (예 : ".cpp"또는 ".hs"를 arg [0]에 추가하여 소스를 가져올 수 있음).
— HEGX64

답변:


60

Zsh , 4 바이트

<$0

Z 쉘에는 고양이 기능이 내장되어 있습니다. 네 번째 문자는 줄 바꿈입니다.

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

코드는 어떤 식 으로든 파일 이름에 의존하지 않습니다. 파일 이름에 공백이나 줄 바꿈과 같은 특수 문자가 포함되어 있어도 작동합니다.

시운전

$ cat "my quine.sh"
<$0
$ zsh "my quine.sh" 
<$0
$ diff -s <(zsh "my quine.sh") <(cat "my quine.sh")
Files /dev/fd/63 and /dev/fd/62 are identical

28
feline functionalities:)
— theB

48

배쉬, 6 바이트

cat $0

원래.


3
개행을 인쇄하지 않습니다.
— 애디슨

2
cat줄 바꿈을 추가하지 않습니다 (적어도 내 시스템에서는).
— 스파게티

7
@isaacg cat는 바이트 당 제공된 파일 바이트의 내용을 인쇄합니다.
— Dennis

2
@LukStorms 그러나 이것이 cat솔루션 대신 bash솔루션이 아닐까요? 고양이는 실제로 프로그래밍 언어로 자격이 없습니다
— Fabian Schmengler

30
파일 이름이 지정되면 작동 -e합니까?
— Mark Plotnick

32

UNIX 실행 로더, 10 바이트

#!/bin/cat

표준 오류에서 스팸을 신경 쓰지 않으면 1 바이트 더 짧게 만들 수 있습니다.

#!/bin/dd

7
나는 이것을 좋아한다. 그래도 "언어"자격이 있는지 확실하지 않습니다.
— Kevin

아마도 바람을 피우고 있지만 bin 폴더와 cat 프로그램의 이름을 바꾸어 경로를 줄일 수 없습니까?
— James Webster

3
나는 당신 에게 btw를 제안 하지 않습니다 . 난 당신이 제안하고있어 수
— 제임스 웹스터

3
@Kevin "언어"(즉, 통역사)는 cat입니다. 그리고 당신이 매우 구체적 cat
— 이기를 원한다면

1
@JamesWebster sudo install /bin/cat /c. /bin루트 파일 시스템에없는 경우를 대비하여 알고 있습니다. cat단일 사용자로 설정 해야합니다 …
— Blacklight Shining

25

C, 52

s[99];main(){read(open(__FILE__,0),s,99);printf(s);}

물론 이것은 컴파일 된 프로그램이 아닌 소스 코드를 읽습니다. 사양에 부합한다고 가정합니다.


후행 줄 바꿈을 피하기 위해 printf대신 사용할 수 있습니다 puts.
— feersum

@feersum 그렇습니다, 잘 잡으십시오
— Digital Trauma

19
@DigitalTrauma 물론 당신의 아바타 때문입니다
— Peter Olson

3
실제로, puts당신은 read더 적은 문자를 필요로 사용할 수 있습니다 .
— user4098326


13

PHP, 21 바이트

<?=file(__FILE__)[0];

file파일을 한 줄씩 배열로 읽어 들이고 파일에는 한 줄만 있습니다. 이것은와 비교하여 바이트를 저장합니다 readfile(__FILE__).


이것은 배열 비 참조를 지원하는 최초의 버전 인 PHP5.4 이상에서만 작동합니다. 그러나 그 외에는 꽤 좋은 답변입니다!
— Ismael Miguel

1
readfile또한 21 : <?readfile(__FILE__);입니다.
— primo

1
필요하지 않습니다<?=
— Fabian Schmengler

12

펄, 15 바이트

open 0;print<0>

@ ThisSuitIsBlackNot 덕분에 3 바이트를 절약했습니다 !


2
다음을 사용하여 3 바이트를 절약 할 수 있습니다open 0;print<0>
— ThisSuitIsBlackNot

나는 그것을하는 더 짧은 방법이 있다고 확신하지 못했지만, 나는 내 일의 삶을 위해 그것을 할 수 없었습니다 ... 사용 0은 가정 $0합니까?
— Dom Hastings

3
네. 참조 perldoc -f open: "단일 인수 호출은 파일 핸들과 동일한 이름의 전역 스칼라 변수에서 파일 이름을 가져옵니다. $ARTICLE = 100; open(ARTICLE) or die "Can't find article $ARTICLE: $!\n";"
— ThisSuitIsBlackNot

11

펄 6, 20 바이트

print slurp $?FILE

나는 Perl 6을 오랫동안 사용하지 않았으므로 이것을 더 짧게 만드는 트릭이 있는지 확실하지 않습니다.


2
두 번째 공간을 제거 할 수 있습니까?
— Eevee

3
아니 @Eevee, 그것은 화가 얻는다
— 단축키

11

osascript (명령 줄의 AppleScript), 40 33 32 바이트

(나에게 경로 읽기)의 단락 1

파일에 실행하는이 호출 osascript a.

파일의 첫 번째 단락 (행)을 가져와 후행 줄 바꿈과 함께 STDOUT에 인쇄합니다. 따라서 코드의 줄 바꿈입니다.



작동하도록 노력하고 있습니다.
— 애디슨 크럼

read path to me나를 위해 일하는 것 같습니다. 엘 캡.
— Digital Trauma

이것을 보지 못했지만 이것이 내가 끝내는 방식입니다. : P 감사합니다, @DigitalTrauma. 편집 : 후행 줄 바꿈을 고려해야하므로 줄 바꿈을 추가하고 단락 1을 사용하십시오.
— Addison Crump

11

파이썬 2, 32 바이트

파일 끝에 줄 바꿈이 있습니다.

print open(__file__).readline()

파이썬 3, 33 바이트

파일 끝에 줄 바꿈이 있습니다.

print(open(__file__).readline())

덕분에 feersum 문제를 잡기 및 공급 __file__, Loovjo을 17 바이트를 저장 파이썬이 솔루션에 대한 새로운 접근 방식에 대한, 그리고 스카 일러 또 다른 바이트를 저장하고 파이썬 2와 3 모두에서 일한 솔루션 (대기 print파이썬에서 함수 인 삼)!

에 대한 문서 링크 readline


end매개 변수를 버릴 수 있기 때문에 python3에 2 바이트도 저장 됩니다.
— Skyler

@Skyler 당신은 절대적으로 맞습니다.
— Celeo

parens가 필요한 Python 3에서는 어떻게 작동 print합니까?
— 손잡이

파이썬 3 print(open(__file__).readline())다음에는 줄 바꿈이 있어야합니다 .
— Skyler

파이썬 3 예제는 파이썬 3 대신 파이썬 2를 말합니다
— TheInitializer

10

일괄, 9 8 바이트

@type %0

@Joshua 덕분에 바이트를 절약했습니다.


3
후행 %를 제거하여 바이트를 저장할 수 있습니다.
— Joshua

10

파이썬 2.7, 30 바이트

print open(__file__).read(29)

편집 : 분명히하기 위해 위의 코드에는 끝에 30 바이트로 줄 바꿈이 있어야합니다. 코드 블록에 표시하는 방법을 알아낼 정도로 마크 다운에 익숙하지 않습니다.

C 제출의 트릭과 동일한 트릭을 사용하고 있습니다. print출력에 추가 할 추가 개행을 설명하기 위해 후행 개행을 제외하고 전체 소스 파일을 읽습니다 .


다른 제출과 마찬가지로 후행 줄 바꿈과 동일한 문제가 발생합니까?
— cole

아니요. 소스 코드에서 30 번째 바이트를 만드는 후행 줄 바꿈이 있어야하지만 코드 블록에 표시 할 수는 없습니다. 제출은 소스 코드의 처음 29 바이트를 읽으므로 개행 문자 print가 필요하지 않기 때문에 작동합니다 .
— xsot

4
쉼표가하는 일은 아닙니다. 개행 문자 대신 공백을 추가합니다.
— xsot

2
␤를 사용하여 의미 적으로 중요한 개행을 표시 할 수 있음
— Eevee

9

Java, 212 196 바이트 (의심 한 하드 코딩 규칙이있는 171 바이트)

~ 15 바이트 단축 한 @Cruncher에게 감사합니다!

나는 이것이 골프를 칠 수 있다는 것은 의심의 여지가 없다.

import java.nio.file.*;class A{public static void main(String[]a){new A();}A(){try{System.out.print(new String(Files.readAllBytes(Paths.get(getClass().getName()+".java"))));}catch(Exception e){}}}

또는 정적 메소드 (및 클래스 이름)를 사용하는 다른 메소드는 171 바이트를 얻습니다. 그래도 이것이 하드 코딩 된 자격이 있는지 확실하지 않습니다.

import java.nio.file.*;class A{public static void main(String[]a)throws Exception{System.out.print(new String(Files.readAllBytes(Paths.get(A.class.getName()+".java"))));}}

정적이 아닌 메소드로 클래스 이름을 가져 오기 위해 생성자를 사용합니다. 정적 메소드 ( A.class.getName())를 사용하는 것은 실제로 하드 코딩되었으므로 '적절한'방법을 사용했습니다. 을 사용 A.class.getName()하면이 코드는 171 바이트로 줄어 듭니다.

읽을 수있는 버전 :

생성자 사용 this.getClass():

import java.nio.file.*;
class A{
    public static void main(String[]a) {
        new A();
    }
    A(){
        try{
            System.out.print(
                new String(
                Files.readAllBytes(
                Paths.get(
                getClass().getName()+".java"))));
        }
        catch(Exception e) {}
    }
}

정적 방법 사용 A.class.getName():

import java.nio.file.*;
class A {
    public static void main(String[] a) throws Exception {
        System.out.print(
             new String(
                  Files.readAllBytes(
                       Paths.get(
                            A.class.getName()+".java"))));
    }
}

파일의 모든 바이트를 한 번에 잡고 STDOUT에 출력합니다. 꽤 직설적 인.


왜 사용하지 A.class.getName()않습니까?
— Fabio F.

3
CodeRelf가 아닌 CodeGolf입니다! ;)
— Fabio F.

1
@FabioF. 예, 그러나 나는 그것이 규칙에 위배되는 하드 코드 된 파일 이름이되는 라인에서 춤을 추는 것 같습니다. 요점은 파일 이름을 변경하면 클래스 이름을 변경해야하지만 하드 코드 된 파일 이름과 같은이 줄도 변경해야한다는 것입니다.
— Cruncher

1
생성자 내에서 print 문을 호출하고 정적 변수 설정에서 자신을 구할 수 없습니까?
— Cruncher

1
@Cruncher Nah. java.io를 얻습니다. java.nio를 고수하겠습니다. 요점은이기는 것이 아니라 다른 방법으로 매우 간결하게 수행하는 방법을 보여줍니다.
— 애디슨 크럼

8

AutoIt, 34 바이트

클립 보드로 출력합니다 :

ClipPut(FileRead(@ScriptFullPath))


7

이동, 111105 바이트

package main
import("io"
."os"
."runtime")
func main(){_,p,_,_:=Caller(0)
f,_:=Open(p)
io.Copy(Stdout,f)}

Go의 첫 번째 코드 골프 – 여기서 사용할 수있는 몇 가지 트릭입니다.


Go에는 이미 답변이 있습니다. 동일한 방법을 사용합니까?
— 애디슨 크럼

@VoteToClose : 나는 그것을 실제로 깨달았지만 실제로 다른 하나에서 영감을 얻었지만 여기에서 패키지 이름 바꾸기 (싼 트릭)와 파일을 열고 stdout에 다른 기술을 사용했습니다. 나에게 거대한 22 바이트 ;-) 저장된
— 토마스을

이 방법은 실제로 약간 다릅니다.
— Fabian Schmengler

7

PowerShell, 39 36 31 25 바이트

내가 얻을 수있는 한 꽉 조여 :

gc $MyInvocation.MyCommand.Path | oh

대중적인 수요로 인해 다음과 같이 변경되었습니다.

gc $PSCommandPath|echo -n

쉘 현재 표준 출력 을 호스트 하기 위해 인쇄합니다 .


gc $MyInvocation.MyCommand.Path충분하다. 자동으로 인쇄됩니다.
— Andrew

특히 스크립트가 자동으로 실행되는 경우에는 보장되지 않습니다
— Chad Baxter

하하 아 상관 없어요. 다른 사람이 PowerShell 답변을하지 않은 경우 게시하려고했습니다. 그러나 나는 그것이 gc별칭이라는 것을 잊었고 방금 사용할 cat것이므로 어쨌든 나에게 바이트가있었습니다.
— Andrew

어, 나는 그렇게 엄격하지 않을 것입니다. 그렇지 않으면 모든 PS 응답이 명시 적으로 호스트 셸로 파이프되어야하지만 그것은 당신에게 달려 있습니다.
— Andrew

대신 gc $PSCommandPath17 바이트 를 사용할 수 있습니다 . 내가 보는 문제는 이것이 소스에 존재하지 않는 개행을 뱉어내는 것입니다. 줄 바꿈 후행이 정상인지 여부는 모호합니다 ... 규칙에 따라 gc $PSCommandPath|write-host -n31 바이트 와 같은 까다로운 작업이 필요할 수 있습니다 .
— AdmBorkBork


5

C, 49 바이트

s[];main(){read(open(__FILE__,0),s,48);puts(s);}

편집 : 명확히하기 위해 49 번째 바이트는 줄 바꿈입니다.

이것은 puts출력의 끝에 추가 될 개행을 설명하기 위해 소스 코드에서 끝에 개행을 뺀 값을 읽습니다 .


이 코드는 정의되지 않은 동작을 두 번 호출합니다.
— Joshua

5
음, 이것은 코드 골프입니다. 내 코드는 원하는 출력을 생성하므로 유효한 제출입니다.
— xsot

1
@xsot이 경우 아마도 컴파일러 버전 + 옵션을 나열해야합니다. 그렇지 않으면 확인할 수 없습니다.
— 저스틴

1
달의 어떤 단계에서 일부 기계에서 원하는 출력을 생성하는 컴파일러를 가질 수있는 한 정의되지 않은 동작이 허용되면 int main (void) {* 0; } 솔루션으로. 결국 표준은 문제를 해결하는 프로그램으로 컴파일하는 구현을 허용합니다. 컴파일러를 지정하는 한 구현 종속 동작을 사용하는 것이 좋지만 정의되지 않은 동작을 사용하면 10 번 연속으로 10 번 실행하면 10 가지 다른 답변을 얻지 못할 수도 있습니다. 같은 기계.
— Ray

1
@ MDXF 나는 우리가 그 해결책을 쓰라고 진지하게 제안하지 않았다. 나는 정의되지 않은 행동을 허용하는 것에 반대했다. 정의되지 않은 동작이 포함되어 있기 때문에 기존 컴파일러에서도 작동 할 int main() {*0;} 수 있습니다 . 마찬가지로 xsot의 솔루션 에는 정의되지 않은 동작이 포함되어 있기 때문에 기존 컴파일러에서 작동 할 수 있습니다 . 어느 쪽도 문제 해결을 보장하지는 않습니다. (xsot 가 그렇게 할 가능성 이 더 높 더라도 쉽게 충돌 할 수 있습니다). 내 실제 주장은 구현 종속적이거나 지정되지 않은 동작에 의존하지만 정의되지 않은 동작에는 의존하지 않는 솔루션을 허용해야한다는 것입니다.
— Ray


4

Pyth, 25 바이트

$import sys$h'e$sys.argv

파일 이름을 읽습니다. 본질적으로 argv를 찾고 마지막 인수에 해당하는 파일을 열고 첫 번째 줄을 인쇄합니다.


그냥 할 수 없어 h'$__file__$?
— kirbyfan64sos

@ kirbyfan64sos 오류가 발생 NameError: name '__file__' is not defined합니다. Pyth는 Python으로 컴파일 된 후 결과 문자열이 실행됩니다. 그래서 나는 그것이 작동하기를 기대하지 않을 것입니다.
— isaacg 2016 년

4

이동, 133 바이트

모두 클리어? 가다!

package main
import("fmt"
"io/ioutil"
"runtime")
func main(){_,f,_,_:=runtime.Caller(0)
s,_:=ioutil.ReadFile(f)
fmt.Print(string(s))}

2
이로 인해 Go에서 나 자신의 코드 골프 솔루션을 작성할 수있었습니다. 몇 가지 일반적인 트릭을 찾으려면 패키지에 단일 문자 이름을 적용하여 여기에서 123 자로 쉽게 내려갈 수 있습니다 r"runtime".
— tomasz

4

> <> , 13 바이트

0:0go:c=?;1+!

온라인 및 오프라인 통역사에서 테스트되었습니다. 이 g명령은 소스 파일에서 읽을 수있는 가장 가까운 명령이며이 과제의 목적으로 계산되지 않으면 항목을 경쟁하지 않는 것으로 표시합니다. 나는 그것이 일반적으로 quines에 대한 "속임수"로 간주된다고 생각합니다.

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


4

하스켈, 63 바이트

과학을 위해!

import System.Environment
main=getProgName>>=readFile>>=putStr

runhaskell명령 에서만 작동합니다 . 그래도 매우 시원합니다
— HEGX64

4

> <> , 31 바이트

면책 조항 :> <>에는 파일 I / O가 없지만> <>에서 영감을 얻은 언어 중 하나 인 Befunge에서 상속 된 코드 공간 I / O를 소개하는 것이 흥미로울 것이라고 생각했습니다.

00voa0+1;!?$~<
1+> :r:@g: ?!^o$

내가 전에 읽은 자체 독서 Quine, 여기서 시도해 볼 수 있습니다 .

나는 더 짧은> <> self-reading quine 이 있음을 보았다 . 코드 골프 표준에서 분명히 더 낫지 만 코드 길이가 하드 코딩되어 있음을 지적하고 싶지만 추가 코드 또는 코드 열을 복사합니다 (원래 코드를 위반하지 않는 한).


> <>에 게시하려고했지만 "<소스 코드를 읽으려면 파일 I / O를 사용해야합니다"
— Sp3000

@ Sp3000은 실제로 문제를 충분히 읽지 못한 것처럼 보입니다. 면책 조항을 추가하겠습니다
— Aaron

3

F #, 54 바이트

printf"%s"(System.IO.File.ReadAllText __SOURCE_FILE__)

용법:

fsi --exec a.fsx

3

펄 5, 15 13 바이트

영감을 얻은 Bash 솔루션에 대한 크레딧 :

print`cat $0`

편집 : 세미콜론이나 첫 번째 공백이 필요하지 않습니다.


순수한 펄이 아닌, 다른 실행 파일, 즉 cat, 존재하고 찾을 수있는 다른 실행 파일이 필요 합니다 $PATH. 그러나 그것이 존재한다면, 그것은 단지 이용 가능한 명령으로 간주 될 수 있습니다 perl.
— Golar Ramblar

3

Node.js, 66 63 바이트

p=process;p.stdout.write(require('fs').readFileSync(p.argv[1]))

console.log개행을 추가하는를 사용하지 않습니다 .


1
동기 API를 사용하여 몇 바이트를 절약 할 수 있습니다.p=process;p.stdout.write(require('fs').readFileSync(p.argv[1]))
— TehShrike

1
왜 console.log(require('fs').readFileSync(process.argv[1]))\n57 바이트가 아닌가?
— Conor O'Brien

항상 작동하지는 않습니다. 파일 이름이이라고 가정하십시오 test.js. 를 실행하여 호출하면 유효하며 node test, 이로 인해 오류가 발생합니다.
— Patrick Roberts

3

C, 31 바이트

main(){system("cat "__FILE__);}

bash 솔루션 은 너무 짧으므로 C 솔루션을 기반으로하지 않는 이유는 무엇입니까?



3

JavaScript가있는 HTML, 115 바이트 (실제로 중요하지 않음)

<!DOCTYPE html><html><title>x</title><script>alert(new XMLSerializer().serializeToString(document))</script></html>

이것이 중요합니까? 상관 없어요, 재미있었습니다 :)

기술적으로 파일을 열지 않습니다. 또한 잘 구성된 HTML5 문서입니다. XMLSerializer는 DOCTYPE 부분도 리턴 한 유일한 도구이지만 비표준입니다. 여전히 크롬과 파이어 폭스에서 작동하며 다른 브라우저에 내기를 걸었습니다.

그리고 보너스로 :

자바 스크립트, 41 바이트

alert(document.currentScript.textContent)

";"제거 마지막에, 1 바이트 저장 :)
— Евгений Новиков

1
@ ЕвгенийНовиков 당신이 옳아 요, 왜 내가 그 당시에 그것을 떠 났는지 잘 모르겠습니다. 그래도 계산하지 않은 것 같습니다.
— Domino
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.