가장 짧은 자체 식별 프로그램 작성 (Quine variant)


57

는 "true"로 출력을 생성하는 프로그램 작성 IFF에 입력이 프로그램의 소스 코드와 일치하고, 입력이 프로그램의 소스 코드와 일치하지 않는 IFF에 "가상"출력을 생성하는합니다.

프로그램이 프로세스에서 자체 소스 코드를 계산할 수 있어야하므로이 문제는 quine과 관련된 것으로 설명 할 수 있습니다.

이것은 코드 골프입니다 : 표준 규칙이 적용됩니다. 프로그램은 자체 소스 코드 파일과 같은 특수 파일에 액세스해서는 안됩니다.

편집 : 원하는 경우 true / false를 True / False 또는 1/0으로 바꿀 수 있습니다.

프로그램의 소스 코드가 인 경우 bhiofvewoibh46948732));:/)4프로그램에서 수행해야 할 작업은 다음과 같습니다.

입력 (Stdin)

bhiofvewoibh46948732));:/)4

출력 (Stdout)

true

입력

(Anything other than your source code)

산출

false

7
true/ false출력이 강력한 요구 사항 입니까 , 아니면 변형 ( True/ False, 1/ 0)도 허용됩니까?
Cristian Lupascu

프로그램이 true / false보다 약간 더 출력하면 문제가 있습니까 (명확하게 유지하고 true / false로 끝나는 경우)
Denys Séguret


5
당신은 자기애 주의자 프로그램을 의미합니까?
PyRulez

답변:



19

자바 스크립트 ES6, 9 자

이것은 JS에서 그것을 할 수있는 유일한 (골피) 방법입니다. ES6은 문자를 훨씬 적게받습니다

최신 Firefox 웹 콘솔에서이를 실행하십시오.

f=x=>f==x

사용법 예 :

f("check") // returns false
f("x=>f==x") // returns true

1
@phinotpi-내 출품작은 여전히 ​​답변으로 선정 될 수 있습니까?
Optimizer

6
이 경우 원본이라고하지만 그것은 주장 할 수 f=x=>f==x하지 x=>f==x데니스 Séguret의 버전은 실제로 전체 소스를 확인 않지만.
Hankrecords 2012 년

@Hankrecords 자바 스크립트가 결정하도록하자. f=x=>f==x function f() f.toSource() "x=>f==x"(기본적으로 콘솔에서 코드를 평가 한 다음 f.toSource()해당 방법을 지원하는 브라우저에서 평가하십시오 .
Optimizer

허용되지 않는 익명의 기능은 다음과 같습니다 (코드를 단축하는 x=>f==x) 편집 : 신경 끄시 고, F는 함수의 내부 참조
MilkyWay90

9

하스켈, 72 자

main=interact$show.(==s++show s);s="main=interact$show.(==s++show s);s="

참고 : 스크립트 끝에 줄 끝 문자가 없습니다.

$ runhaskell Self.hs < Self.hs
True

8

GolfScript, 11 자

{`".~"+=}.~

이 없으면 =이 코드는 자체 소스 코드를 문자열로 생성하는 quine입니다. 는 =그것의 입력과 출력이 문자열을 비교하게 1이 일치한다면 0그들이 아닌 경우. 비교는 정확합니다. 특히 입력 끝에 줄 바꿈 문자가 있으면 실패합니다.

설명:

  • { } GolfScript의 코드 블록 리터럴입니다.
  • .이 코드 블록을 복제 ~하고 두 번째 사본을 실행합니다 (첫 번째 사본은 스택에 남음).
  • `코드 블록을 문자열 화하고 ".~"+를 추가 .~합니다.
  • 마지막으로 =결과 문자열을 입력과 비교하고 (프로그램이 시작되기 전에 GolfScript 인터프리터에 의해 스택에 문자열로 푸시 됨) 1일치하고 일치 0하지 않는 경우 반환 합니다 .

7

Perl, Infinity 41 38 자

$_=q(print<>eq"\$_=q($_);eval"|0);eval

업데이트 : 프로그램이 더 이상 줄 바꿈으로 끝나지 않으므로 여러 줄 파일에서 올바르게 작동합니다. Enter 키를 누르지 않고 STDIN에서 입력을 입력해야합니다. Windows에서는 파일을 읽어야 만 할 수있었습니다.

독창적 인 솔루션 :

print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(...

1
잘 했어요! . . .
mob

코드로 시작하는 파일에 실패합니다. 예 :(cat id.pl; echo foo)|perl id.pl
Geoff Reedy

@GeoffReedy, 감사합니다; 프로그램은 이전에 여러 줄 입력을 처리하지 않았습니다. 이제 수정되었습니다.

이 코드 볼링인가요?
Matthew Roh

7

> <> , 68 바이트

물고기는 똥을 먹는 것을 좋아합니다. 이제 우리는 그들이 친구들과 구별 할 수 있다는 것을 알고 있습니다.

00v      0+1~$^?)0~\;n0\
  >:@@:@gi:0(?\:a=?/=?!/$1+
  0n;n*=f$=2~~/

당신은 할 수 있습니다 온라인으로보십시오 !


1
이것은 1코드의 접두사도 출력 합니다.
Jo King

@ JoKing 스크립트의 접두사보다 최악이었고 잘린 줄도 받아 들였습니다! 나는 그것을 고쳤 지 만, 그것이 내가 원하는만큼 일반적인 것이 아니라는 것에 실망했다. 전체 코드가 일치하는지 확인하기 위해 스크립트 끝에 도달 한 셀을 확인해야했다. 확실히 향상 될 수 있지만 귀찮게 확신하지 못합니다.
Aaron

6

파이썬 2, 55

a='a=%r;print a%%a==raw_input()';print a%a==raw_input()

테스트 :

a='a=%r;print a%%a==raw_input()';print a%a==raw_input() -> True

(anything else) -> False


3
첫 번째 줄로 시작하는 모든 파일에서 실패합니다 a='a=%r;print a%%a==raw_input()';print a%a==raw_input().
boothby

진정한 다중 라인 입력은 지원되지 않습니다.
flornquake

사소한 수정은로 대체 raw_input()하는 것 __import__('sys').stdin.read()입니다.
feersum

나는 도전 문구에 혼란스러워합니다 (왜냐하면 영어 문법이 좋지 않기 때문입니다). 이것이 허용됩니까? print raw_input()==open(__file__).read()? 40 바이트이며 raw_input()접근 방식을 사용 하지만 코드를 읽습니다.
Simon

1
@Simon 허용되지 않습니다. 이와 같은 문제에 대한 표준 허점 중 하나입니다. 그리고 네, 이것이 의미하는 바Your program must not access any special files, such as the file of its own source code.
PunPun1000

6

자바 스크립트 ES6, 16 14 바이트

$=_=>_==`$=`+$

Neil 덕분에 2 바이트 빼기.

프롬프트를 통해 입력을 받아야하는 경우 31 바이트

$=_=>prompt()==`$=${$};$()`;$()

경고를 통해 출력해야하는 경우 38 바이트

$=_=>alert(prompt()==`$=${$};$()`);$()

이것은이다 적절한 최적화의 대답은 전체 소스 코드를 허용하지 않는 한, 그것을 할 수있는 방법입니다.


1
비록, 나는 단지 쓸 것 '$='+$입니다.
Neil

아, 맞아 @ 닐
코너 오브라이언

1
;$()함수 호출이 quine의 일부이기 때문에 종료가 필요하다고 확신합니다 . 또한 prompt입력 을 위해 계정 으로 전환해야합니다 .
Mama Fun Roll

1
그것은 문제가 아닙니다. 함수 호출은 quine의 일부 이므로 필요 합니다. 사용자가 함수로 호출하도록 허용하면 퀴인이 손상됩니다.
Mama Fun Roll

1
try$=_=>prompt()==`$=${$};$()`;$()
Mama Fun Roll

5

Node.js : 54

function f(){console.log(f+'f()'==process.argv[2])}f()

파일로 저장하고 f.js(정확한 이름은 중요하지 않음)

node f.js "test"

(거짓 출력) 또는

node f.js "$(< f.js)"

(참 출력)

또한 eval을 기반으로 다른 버전을 만들었습니다.

eval(f="console.log('eval(f='+JSON.stringify(f)+')'==process.argv[2])")

지금은 72 자입니다. 시간이 있으면 줄이려고합니다.


1
왜? 파일에 액세스하지 않습니다. node.js에 익숙하지 않은 사람들에게 프로그램을 시작하는 방법을 지적했습니다. 파일을 읽지 않습니다.
Denys Séguret

1
모든 Javascript 솔루션은 JS에서 자신의 소스 코드에 액세스 할 수 있다는 사실을 이용합니다. 기술적으로 " 자신의 소스 코드 파일 에 액세스하는 "것은 아니지만 똑같은 일을 수행합니다. 그러나 질문이 특별히 이것을 금지하지 않았기 때문에 귀하의 답변이 합법적이라고 생각합니다.

글쎄, 당신은 프로그램의 일부인 기능의 소스 (정확히 본문 만)에 액세스합니다. D에서 mixin ()을 사용하는 것과 같습니다. 그러나 저를 포함한 다른 두 가지 JS 답변은 실제로 "프로그램"으로 자격이 있다고 생각하지 않습니다.
Denys Séguret

@dystroy는 실제로 D로 믹스 인하는 것이 소스를 읽는 것보다 eval을 사용하는 것과 비슷합니다.
ratchet freak

@ratchetfreak 네, 맞습니다. 그러나 귀하의 프로그램은 열거 형 값의 일종의 toString을 사용한다고 생각합니다. 그리고 eval / mixin을 사용하는 코드는 함수의 소스를 사용하는 것과 거의 같은 트릭입니다.
Denys Séguret

5

스몰 토크 (Pharo 2.0 dialect)

41 문자 메소드를 문자열로 구현하십시오 (코드 골프를 위해 추악한 형식화).

isItMe^self=thisContext method sourceCode

그런 다음 작업 공간에서 이것을 평가하십시오 (전통적인 스몰 토크 방식으로 인쇄하십시오)
stdin에서 입력을 읽지 않고 메시지를 보내는 문자열 일뿐입니다 (프로그램이 스몰 토크에있을 수있는 다른 것) :

'isItMe^self=thisContext method sourceCode' isItMe.

그러나 우리는 속임수를 쓰고 있습니다. sourceCode는 일부 소스 파일을 읽습니다 ...
여기에 51 개의 문자가없는 변형이 있습니다 :

isItMe
    ^ self = thisContext method decompileString

다음으로 테스트하십시오.

'isItMe
    ^ self = thisContext method decompileString' isItMe

작업 공간의 문자열이 유효한 입력으로 간주되지 않으면 116 자로 일부 대화 상자를 사용하는 방법을 살펴 보겠습니다
.이 문장을 평가하십시오.

(UIManager default request: 'type me') = (thisContext method decompileString withSeparatorsCompacted allButFirst: 7)

디 컴파일 형식에는 CR과 TAB이 포함되므로 SeparatorsCompacted로 변경합니다.
그런 다음 처음 7자인 'doIt ^'을 건너 뜁니다.

마지막으로 stdin을 사용 하는 105 문자 변형은 명령 줄 에서이 문장을 해석하여보다 주류를 느끼게합니다.

Pharo -headless Pharo-2.0.image eval "FileStream stdin nextLine = (thisContext method decompileString withSeparatorsCompacted allButFirst: 7)"

4

플렉스-312 자

Q \"
N \n
S " "
B \\
P "Q{S}{B}{Q}{N}N{S}{B}n{N}S{S}{Q}{S}{Q}{N}B{S}{B}{B}{N}P{S}{Q}{P}{Q}{N}M{S}{Q}{M}{Q}{N}%%{N}{P}{N}{M}{N} putchar('1');"
M "(.|{N})* putchar('0');"
%%
Q{S}{B}{Q}{N}N{S}{B}n{N}S{S}{Q}{S}{Q}{N}B{S}{B}{B}{N}P{S}{Q}{P}{Q}{N}M{S}{Q}{M}{Q}{N}%%{N}{P}{N}{M}{N} putchar('1');
(.|{N})* putchar('0');

아마도 더 짧아 질 수도 있지만 멀티 라인 입력 (소스 코드가 여러 줄이므로 필요) 및 프로그램을 하위 문자열로 포함하는 입력에서도 작동합니다. 지금까지 많은 답변이이 둘 중 하나 또는 둘 모두에 실패한 것 같습니다.

컴파일 명령 : flex id.l && gcc -lfl lex.yy.c


3

D (133 자)

enum c=q{import std.stdio;import std.algorithm;void main(){auto i=readln();writeln(equal("auto c=q{"~c~"};mixin(c);",i));}};mixin(c);

3

자바 스크립트 (V8), 35

function i(){alert(prompt()==i+[])}

전화 i()하면 입력하라는 메시지가 표시됩니다


+[]JS가 자동 형 캐스트되므로 선택해야한다
Downgoat


3

파이썬 2, 47 바이트

_='_=%r;print _%%_==input()';print _%_==input()

수표가 추가 된 간단한 퀴즈.


작동하지 않습니다. print함수는 파이썬 3입니다. print(_%%_==input())';print(_%_==input())파이썬 2로 변경하거나 변경해야합니다.
Mego

3

CJam , 12 바이트

{s"_~"+q=}_~

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

설명

이것은 단지 표준 CJam quine 프레임 워크를 사용합니다.

{s"_~"+q=}    e# Push this block (function literal).
          _~  e# Copy and run it.

블록이하는 일 :

 s            e# Stringify the top element (this block itself).
  "_~"+       e# Append "_~". Now the source code is on the stack.
       q      e# Read the input.
        =     e# Check if it equals the source code.

이것은 내가 가진 솔루션입니다 정확히 ._.
Esolanging 과일

2

TCL, 111 자

set c {set c {$c};puts [expr {[read stdin] eq [subst -noc \$c]}]};puts [expr {[read stdin] eq [subst -noc $c]}]

2

펄, 52 자

$_='$/=$\;$_="\$_=\47$_\47;eval";print<>eq$_|0';eval

2

파이썬, 187 바이트

import sys;code="import sys;code=!X!;print(sys.stdin.read()==code.replace(chr(33),chr(34)).replace(!X!,code,1))";print(sys.stdin.read()==code.replace(chr(33),chr(34)).replace("X",code,1))

끝에 줄 바꿈을 추가하지 않도록주의하십시오. 더 나은 Python-fu를 가진 사람은 그것을 단축시킬 수 있습니다.


2
C=chr여러 바이트를 삭제 하는 데 사용할 수 있습니다 . 또한 변수 이름을 줄이십시오 code.
Zach Gates

2
1 년 넘게 아무도 말하지 않았으므로 PPCG에 오신 것을 환영합니다!
Outgolfer Erik

2

껍질 , 11 바이트

=hS+s"=hS+s

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

설명

설명은 ¨읽을 수없는 이스케이프를 피하기 위해 문자열을 구분 하는 데 사용합니다.

     "=hS+s  -- string literal: ¨=hS+s¨
  S+         -- join itself with
    s        -- | itself "showed": ¨"=hS+s"¨
             -- : ¨=hS+s"=hS+s"¨
 h           -- init: ¨=hS+s"=hS+s¨
=            -- is the input equal?

기능 =을 제거하면 실제로 소스 자체와 만 일치 하는지 확인할 수 있습니다 .



2

젤리 , 10 바이트

“Ṿ;$⁼”Ṿ;$⁼

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

“Ṿ;$⁼”Ṿ;$⁼
“Ṿ;$⁼”      String literal: 'Ṿ;$⁼'
        $   Next two links act on the string literal
      Ṿ     Uneval: '“Ṿ;$⁼”'
       ;    Append string: '“Ṿ;$⁼”Ṿ;$⁼' (source code)
         ⁼  Is the string above equal to the input?

2

05AB1E , 15 바이트

0"D34çýQ"D34çýQ

다음 을 추가 하여 기본 0"D34çý"D34çý 을 수정합니다 Q(암시 적 입력과 동일한 지 확인)

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

설명:

0                # Push 0 to the stack
                 #  STACK: [0]
 "D34çýQ"        # Push the string 'D34çýQ' to the stack
                 #  STACK: [0, 'D34çýIå']
         D       # Duplicate this string
                 #  STACK: [0, 'D34çýIå', 'D34çýIå']
          34ç    # Push '"' to the stack
                 #  STACK: [0, 'D34çýIå', 'D34çýIå', '"']
             ý   # Join the stack by this '"' delimiter
                 #  STACK: ['0"D34çýIå"D34çýIå']
              Q  # Check if it's equal to the (implicit) input
                 # (and output the top of the stack implicitly as result)

@Grimy가 제공하는 멋진 15 바이트 대안 :

187745012D27BJQ

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

설명:

187745012        # Push integer 187745012 
                 #  STACK: [187745012]
         D       # Duplicate it
                 #  STACK: [187745012, 187745012]
          27     # Push integer 27
                 #  STACK: [187745012, 187745012, 27]
            B    # Convert 187745012 to base-27
                 #  STACK: [187745012, "D27BJQ"]
             J   # Join the values on the stack together
                 #  STACK: ["187745012D27BJQ"]
              Q  # Check if it's equal to the (implicit) input
                 # (and output the top of the stack implicitly as result)

3
187745012D27BJQ넥타이입니다.
그리미

1

C- 186176

짧막 한 농담:

 *a="*a=%c%s%c,b[999],c[999];main(){sprintf(b,a,34,a,34);gets(c);putchar(strcmp(b,c)?'0':'1');}",b[999],c[999];main(){sprintf(b,a,34,a,34);gets(c);putchar(strcmp(b,c)?'0':'1');}

공백이있는 경우 (이로 인해 프로그램이 중단됨)

*a="*a=%c%s%c,b[999],c[999];main(){sprintf(b,a,34,a,34);gets(c);putchar(strcmp(b,c)?'0':'1');}",b[999],c[999];
main() {
  sprintf(b,a,34,a,34);
  gets(c);
  putchar(strcmp(b,c)?'0':'1');
}



1

q, 8 바이트

{x~.z.s}

자기 참조 .zs 와 일치하는 입력에서 부울을 반환합니다.


1

룬 문자 , 11 바이트

"3X4+kSqi=@

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

TIO가 업데이트되었으며 더 이상 입력을 읽는 데 문제가 없으며 더 이상 후행 공백이 필요하지 않습니다.

설명

>                 Implicit entry
 "                Begin reading as string
  3X4+kSqi=@      Pushed to the stack as a string, loop around
 "                End reading as string
  3X4+            Push 3*10 and 4 to the stack, add them together
      k           Convert to character (")
       S          Swap the top two items on the stack
        q         Concatenate. This leaves only "3X4+kSqi=@ on the stack
         i        Read input
          =       Compare using .Equals, push 1 if equal, else 0
           @      Print and terminate

JoKing의 솔루션 :

"'<~qi=@|

설명

  <              Entry
 '               Read character (loop around)
"                Push "
         |       Mirror
"                Begin reading string (loop around)
 '<~ri=@|        Push the string '<~qi=@| (loop around)
"                End reading string
 '<~             Push the character < and then discard it
    q            Concatenate, stack contains only "'<~qi=@|
      i          Read input
       =         Compare
        @        Print and terminate


@ JoKing 매우 영리합니다.
Draco18s

실제로, 9 바이트r에버 제스트를 피합니다
Jo King

@ JoKing 아마 (10 바이트 솔루션에서) 나 자신에게 도착했을 수 있었지만 아직 cawfee 는 없었습니다 . 나는 어제 "다른 곳을 갖는 것이 사물을 복잡하게하기 때문에 왼쪽에있는 것이 실제로 갈 수있는 유일한 장소 라는 것을 어제 이미 해결했습니다 . (그러나 지금 막 나는 그것이 무엇을하고 있는지 알기 위해 디버거에서 그것을 실행해야했다 ...)
Draco18s

1

R , 54 바이트

f=function(s)s==paste0("f=function(s)s==", body(f)[3])

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

body(즉, 그래서 그것을 조금 분할 함수의 본문을 얻는다 body(f)[3]에서 전부입니다 paste0이후). 흥미롭게도 body코드를 다시 포맷하고 쉼표 뒤에 공백을 추가하는 등이 있습니다. 따라서 쉼표 뒤에 공백이있는 R 골프 응답은 드문 경우입니다.

body(f)유형의 객체 이기 때문에 작동 하며이 유형 language에 대한 as.character메소드 가 있습니다 . 반면에, f그리고 args(f)유형입니다 closure, 그리고 지금까지 내가 말할 수있는 문자 형식으로 변환 할 수 없습니다. 언어 유형이 무엇인지 묻지 마십시오.


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