19
\$\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\$
  • 1
    \$\begingroup\$ @PostRockGarfHunter Strengthened the requirements. Now this challenge differs from a cat program. \$\endgroup\$ – Dannyu NDos Jan 26 at 4:54
  • 7
    \$\begingroup\$ This is why we sandbox. \$\endgroup\$ – Post Rock Garf Hunter Jan 26 at 5:00
  • \$\begingroup\$ Here's a similar question, hopefully the answers can provide inspiration for others! codegolf.stackexchange.com/questions/11370 \$\endgroup\$ – Josh Jan 27 at 21:53
5
\$\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
\$\endgroup\$
12
\$\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!

\$\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
\$\endgroup\$
  • 3
    \$\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
\$\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

\$\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!

\$\endgroup\$
2
\$\begingroup\$

Funky, 36 bytes

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

Try it online!

\$\endgroup\$
2
\$\begingroup\$

JavaScript (V8), 33 32 bytes

-1 byte thanks to Jo King

f=x=>{while(x!='f='+f);return x}

Try it online!

\$\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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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