부정 행위


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.