# Narcissistic Quine [duplicate]

Write a program/method that:

• Becomes a quine when the input matches the source code;
• Doesn't halt otherwise.

This is code-golf, so shortest solution wins. Avoid any standard loopholes.

# Jelly, 14 bytes

“Ṿ;⁾v¹⁻³$¿”v  Try it online! A program taking a single string argument and either printing its source if the string matches its source, or looping indefinitely if not. ## Explanation “ ”v | Evaluate the following string as Jelly code, using the string itself as argument: Ṿ | - Uneval (effectively wrap the string in “” ;⁾v | - Append v ⁻³$¿    | - While not equal to the original program argument:
¹        |   - Call the identity function


# Python 3.8 (pre-release), 6760 56 bytes

exec(a:='print(s:=input())\nwhile s!="exec(a:=%r)"%a:1')


Try it online!

# Python 2, 56 bytes

a='s=input();print s\nwhile s!="a=%r;exec a"%a:1';exec a


Try it online!

• Is there anything in 3.8 that this answer relies on? – Cruncher Jan 27 at 21:24
• – Aaron Jan 27 at 22:07

# GolfScript, 20 bytes

{".~"+{.2$=}do\;}.~  Try it online! ## Explanation { }.~ # Evaluate the following string as GolfScript code, using the string itself as argument:  # - Uneval (effectively wrap the string in "" ".~"+ # - Append .~ {.2$=}do      # - Do While not equal to the original program argument:
#   - (Basically do nothing)
\;    # - If this loop ends, discard the extra copy of the input

• What is the relationship between Jelly and GS? – RGS Jan 26 at 15:20
• @RGS It's simply because Jelly is (indirectly) based on GS. – user85052 Jan 26 at 22:52
• why did the GS port of a jelly answer get more votes than the answer it was porting? – Cruncher Jan 27 at 21:25

# 05AB1E, 20 bytes

"34çìD«Êi["34çìD«Êi[


Try it online!

# Explanation

"34çìD«Êi["           - string literal
34ç        - push the character "
ì       - prepend to the string literal
D«     - duplicate the string (producing the code)
Êi[  - loop if it's not the same as the input
- else implicitly output



# Pyth, 15 bytes

QWnjN B"QWnjN B


Try it online!

## Explanation

QWnjN B"QWnjN B
Q                 implicit print input
B"QWnjN B   evaluates to ["QWnjN B", "QWnjN B"]
jN             join elements in list with '"' as separator (will be source code)
Wn               keep looping while input does not equal source code


# PHP, 89 bytes

eval($s='$a=chr(39);$b="eval(\$s=$a";$c="$a);";$b.$s.$c!=$argn?:die($b.$s.$c);for(;;);');


Try it online!

This is the best I have found so far, at the beginning it wasn't a port of @Mukundan's answer, but it pretty much ends like it. I will try to improve it later..

EDIT: saved a byte with != instead of == so I can remove the 1

EDIT2: saved 16 bytes using vars for repeated strings

# RProgN 2, 17 bytes

«•.x=xe²xw³1#1:?


# Explanation

«•.x=xe²xw³1#1:?<SPACE> #
«                       # Push the following function to the stack and execute
•.                     # Append a space (A non-function character) and stringify
x=                   # Assign the stringified function to x
xe                 # Is x equal to the top of the stack?
²                # "Double Function" to execute if true
x               # Push x to the stack
w              # Output
³             # "Tripple Function" to execute if false
1            # Push a truthy value to the stack
#1          # A function that just repeatedly pushes true
:         # While the top of the stack is true. Thus, loop forever
?        # If a, than b, else c
<SPACE> # Used to ensure the function qualifies as a quine.


Try it online!

# Funky, 36 bytes

f=s=>{x=f=[f]ifx==s x elsewhile1z}


Try it online!

# JavaScript (V8), 3332 31 bytes

-1 byte thanks to Jo King

f=x=>eval(while(x!='f='+f);x)


Try it online!

• 20 bytes, though I'm not sure if exceeding the recursion limit counts as infinite. At the very least, you can get rid of the trailing semicolon – Jo King Jan 30 at 13:04
• @JoKing Yeah I thought about that but I don't think that really counts, since it's bounded by the size of the stack, thanks for the -1, I did think about something similar with f=x=>x=='f='+f?x:eval("for(;;);") but it's 33 bytes – Expired Data Jan 30 at 13:22
• Another 33 f=x=>eval(while(x!='f='+f);)||x – Expired Data Jan 30 at 13:26

# Perl 5, 50 bytes

$_=q($_='$'."_=q($_);eval";<>eq\$_?print:eval);eval


Try it online!

# Japt, 29 21 bytes

OvA="Us@¶OvA=+Q+A}a


Try it online!

## Explanation

OvA="Us@¶OvA=+Q+A}a
A="Us@¶OvA=+Q+A}a // Set A to string literal
Ov                    // Evaluate A as japt code
@              // Function
¶OvA=+Q+A   //   Check if input equals "OvA" + '"' + A (Q is '"')
}  // End Function
a // Call function repeatedly until it returns a truthy value
Us               // Slice off first 0 chars of input
// Implicit Output
`