23
\$\begingroup\$

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.

\$\endgroup\$

11 Answers 11

6
\$\begingroup\$

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
| improve this answer | |
\$\endgroup\$
13
\$\begingroup\$

Python 3.8 (pre-release), 67 60 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!

| improve this answer | |
\$\endgroup\$
8
\$\begingroup\$

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
| improve this answer | |
\$\endgroup\$
  • 4
    \$\begingroup\$ What is the relationship between Jelly and GS? \$\endgroup\$ – RGS Jan 26 at 15:20
  • 1
    \$\begingroup\$ @RGS It's simply because Jelly is (indirectly) based on GS. \$\endgroup\$ – user85052 Jan 26 at 22:52
  • 1
    \$\begingroup\$ why did the GS port of a jelly answer get more votes than the answer it was porting? \$\endgroup\$ – Cruncher Jan 27 at 21:25
5
\$\begingroup\$

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
                    
| improve this answer | |
\$\endgroup\$
3
\$\begingroup\$

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
| improve this answer | |
\$\endgroup\$
2
\$\begingroup\$

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

| improve this answer | |
\$\endgroup\$
2
\$\begingroup\$

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!

| improve this answer | |
\$\endgroup\$
2
\$\begingroup\$

Funky, 36 bytes

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

Try it online!

| improve this answer | |
\$\endgroup\$
2
\$\begingroup\$

JavaScript (V8), 33 32 31 bytes

-1 byte thanks to Jo King

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

Try it online!

| improve this answer | |
\$\endgroup\$
  • \$\begingroup\$ 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 \$\endgroup\$ – Jo King Jan 30 at 13:04
  • \$\begingroup\$ @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 \$\endgroup\$ – Expired Data Jan 30 at 13:22
  • \$\begingroup\$ Another 33 f=x=>eval(`while(x!='f='+f);`)||x \$\endgroup\$ – Expired Data Jan 30 at 13:26
1
\$\begingroup\$

Perl 5, 50 bytes

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

Try it online!

| improve this answer | |
\$\endgroup\$
1
\$\begingroup\$

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
| improve this answer | |
\$\endgroup\$

Not the answer you're looking for? Browse other questions tagged or ask your own question.