21
\$\begingroup\$

Your task is to give three different languages A, B, C, and write two different programs P and Q such that:

P is a quine in language A, but not a quine in B nor C;

Q is a quine in language B, but not a quine in A nor C; and

Q concatenated after P (without any new characters added in between) is a quine in language C, but not in B nor A.

This is codegolf, where your score is the length of the final, concatenated quine. Again, adhere to the rules of proper quines -- no reading your source code, no empty programs etc.

\$\endgroup\$
11
  • 2
    \$\begingroup\$ Rules on comments? \$\endgroup\$ Commented Nov 7, 2015 at 18:25
  • \$\begingroup\$ That's something that I didn't think of before. I'm inclined to let them slide because then you have to worry about printing that out AND having to make sure language C has the same comment syntax or something but I'm flexible. \$\endgroup\$ Commented Nov 7, 2015 at 18:26
  • \$\begingroup\$ Does "not a quine" mean "do anything" or "at least run"? \$\endgroup\$ Commented Nov 7, 2015 at 18:58
  • 1
    \$\begingroup\$ When put into a compiler it doesn't output its source code. It can run or throw an error or not compile or output something else or nothing, but as long as it doesn't output its source code. \$\endgroup\$ Commented Nov 7, 2015 at 19:02
  • \$\begingroup\$ Quine challenge inspiration, for anyone interested: "Print all those programs in <language>, and those only, which do not print themselves." \$\endgroup\$ Commented Nov 7, 2015 at 19:23

4 Answers 4

10
\$\begingroup\$

Fission + CJam + GolfScript, 38 36 bytes

Fission, 6 bytes

'!+OR"

This is one of Martin Büttner's Fission quines. Try it online!

CJam, 30 bytes

' {"''"@*" "+YX#<
\"0$~"N}0$~

The last byte is a linefeed. Try it online!

GolfScript, 36 bytes

'!+OR"' {"''"@*" "+YX#<
\"0$~"N}0$~

The last byte is a linefeed. Try it online!

Verification

$ wc -c P Q
 6 P
30 Q
36 total
$ cat P Q > P+Q
$ 
$ Fission P 2>&- | diff -qs - P
Files - and P are identical
$ cjam P 2>&- | diff -qs - P
Files - and P differ
$ golfscript P 2>&- | diff -qs - P
Files - and P differ
$ 
$ cjam Q 2>&- | diff -qs - Q
Files - and Q are identical
$ golfscript Q 2>&- | diff -qs - Q
Files - and Q differ
$ Fission Q 2>&- | diff -qs - Q
Files - and Q differ
$ 
$ golfscript P+Q 2>&- | diff -qs - P+Q
Files - and P+Q are identical
$ Fission P+Q 2>&- | diff -qs - P+Q
Files - and P+Q differ
$ cjam P+Q 2>&- | diff -qs - P+Q
Files - and P+Q differ

How it works

Fission

  • R spawns an atom that moves right, wrapping around at the edge.

  • " toggles printing mode. Everything up to the next " is printed.

  • '! sets the atom's to the code point of '!'.

  • + increments the atom's mass, setting it to the code point of ".

  • O prints the character whose code point is the atom's mass and destroys the atom.

CJam

'       e# Push a space character.
{       e# Push the following code block:
  "''"  e# Push that string.
  @*    e# Separate its characters by spaces.
  " "+  e# Append one more space.
  YX#   e# Raise 2 to the first power. Pushes 2.
  <     e# Discard all but the first two characters of the string, i.e., "' ".
  \     e# Swap the string "' " with the code block in execution.
  "0$~" e# Push that string.
  N     e# Push a linefeed.
}       e#
0$~     e# Push a copy of the code block and execute it.

GolfScript

'!+OR"' # Push that string.
{       # Push the following code block:
  "''"  # Push that string.
  @*    # Join its characters, separating them by the first string.
  " "+  # Append a space.
  YX    # Undefined token. Does nothing.
  #<    # Comment.
  \     # Swap the string with the code block in execution.
  "0$~" # Push that string.
  N     # Undefined token. Does nothing.
}       #
0$~     # Push a copy of the code block and execute it.
\$\endgroup\$
1
  • \$\begingroup\$ Found another Dennis! \$\endgroup\$ Commented Nov 8, 2015 at 0:21
6
\$\begingroup\$

Self-modifying Brainfuck + GolfScript + CJam, 29 27 bytes

Self-modifying Brainfuck, 12 bytes

 {<[<]>[.>]}

Note the leading space. Try it online!

GolfScript, 15 bytes

{So"0$~"N]}0$~

The last byte is a linefeed. Try it online!.

CJam, 27 bytes

 {<[<]>[.>]}{So"0$~"N]}0$~

Note the leading space. The last byte is a linefeed. Try it online!

Verification

$ wc -c P Q
12 P
15 Q
27 total
$ cat P Q > P+Q
$ 
$ timeout 10 smbf P | diff -sq - P
Files - and P are identical
$ golfscript P | diff -sq - P
Files - and P differ
$ cjam P | diff -sq - P
Files - and P differ
$ 
$ golfscript Q | diff -sq - Q
Files - and Q are identical
$ cjam Q | diff -sq - Q
Files - and Q differ
$ timeout 10 smbf Q | diff -sq - Q
Terminated
$ 
$ cjam P+Q | diff -sq - P+Q
Files - and P+Q are identical
$ golfscript P+Q | diff -sq - P+Q
Files - and P+Q differ
$ timeout 10 smbf P+Q | diff -sq - P+Q
Terminated

How it works

Self-modifying Brainfuck

SMBF starts with its source code on the left of the data pointer.

<space>        (ignored)
{              (ignored)
<              Move the data pointer left.
[<]            Move the data pointer left to the next null byte.
>              Move the data pointer right.
[.>]           Print and move the data pointer right until null byte.
}              (ignored)

GolfScript

{            # Push the following code block:
  So         # Undefined token. Does nothing.
  "0$~"      # Push that string.
  N          # Undefined token. Does nothing.
  ]          # Wrap the stack in a array. Does not affect output.
}            #
0$~          # Push a copy of the code block and execute it.


### CJam

{<[<]>[.>]} e# Push that code block.
{           e# Push the following code block:
  So        e# Print a space. Since it is printed explicitly,
            e# it will appear at the beginning of the output.
  "0$~"     e# Push that string.
  N         e# Push a linefeed.
  ]         e# Wrap the stack in a array. Does not affect output.
            e# This makes the program an infinite, empty  loop
            e# in SMBF; it would be a quine otherwise.
}           e#
0$~         e# Push a copy of the code block and execute it.
\$\endgroup\$
5
\$\begingroup\$

Tcl, CJam, GolfScript, 60 + 26 = 86 112 bytes

Not golfed well.

Tcl, 60 bytes

{puts} [{join} {{} \{ \}\]} {{puts} [{join} {{} \{ \}\]} }]

Based on the quine on this page. It has a trailing newline.

CJam, 26 bytes

{"' '@`+n@0"L~;"0$~"N}0$~

It has a trailing newline.

GolfScript, 86 bytes

{puts} [{join} {{} \{ \}\]} {{puts} [{join} {{} \{ \}\]} }]
{"' '@`+n@0"L~;"0$~"N}0$~
\$\endgroup\$
2
  • \$\begingroup\$ How does this work? I've never heard of tcl \$\endgroup\$ Commented Nov 7, 2015 at 20:14
  • \$\begingroup\$ @FarazMasroor Strings in Tcl can be surrounded by braces, and command names are also strings. And things in braces are considered blocks in GolfScript, which can be printed as is. CJam is similar to GolfScript but different enough to make a quine in one language not work in the other. With these choices of languages these are just normal quines with some extra code to output in the right format, which isn't golfed yet. \$\endgroup\$
    – jimmy23013
    Commented Nov 7, 2015 at 23:19
2
\$\begingroup\$

ShapeScript + CJam + GolfScript, 96 95 62 bytes

ShapeScript, 16 bytes

'"%r"@%"0?!"'0?!

This is the standard ShapeScript quine. Try it online!

CJam, 46 bytes

];{"'\"%r\"@%\"0?!\"'0?!];"SS#~(>
\"0$~"N}0$~

The last byte is a linefeed. Try it online!

GolfScript, 62 bytes

'"%r"@%"0?!"'0?!];{"'\"%r\"@%\"0?!\"'0?!];"SS#~(>
\"0$~"N}0$~

The last byte is a linefeed. Try it online on Web GolfScript.

Verification

$ wc -c P Q
16 P
46 Q
62 total
$ cat P Q > P+Q
$ 
$ shapescript P 2>&- | diff -qs - P
Files - and P are identical
$ cjam P 2>&- | diff -qs - P
Files - and P differ
$ golfscript P 2>&- | diff -qs - P
Files - and P differ
$ 
$ cjam Q 2>&- | diff -qs - Q
Files - and Q are identical
$ golfscript Q 2>&- | diff -qs - Q
Files - and Q differ
$ shapescript Q 2>&- | diff -qs - Q
Files - and Q differ
$ 
$ golfscript P+Q 2>&- | diff -qs - P+Q
Files - and P+Q are identical
$ shapescript P+Q 2>&- | diff -qs - P+Q
Files - and P+Q differ
$ cjam P+Q 2>&- | diff -qs - P+Q
Files - and P+Q differ

How it works

ShapeScript

'       Push a string that, when evaluated, does the following.
  "%r"  Push this formatting string. %r gets replaced by a string
        representation of the corresponding argument.
  @     Swap the string that is being evaluated on top of the stack.
  %     Apply formatting to the string on top of the stack.
  "0?!" Push that string.
'
0?!     Push a copy of the previous string and evaluate it.

CJam

];      e# Clear the stack. Stack is already clear. Does nothing.
{       e# Push the following code block:

  "'\"%r\"@%\"0?!\"'0?!];"

  SS#   e# Find the index of " " in " ". Pushes 0.
  ~(    e# Apply logical NOT and decrement. Pushes -2.
  >     e# Discard all but the two rightmost characters from the string,
        e# i.e., reduce it to "];".
  \     e# Swap the string "];" with the code block in execution.
  "0$~" e# Push that string.
  N     e# Push a linefeed.
}       e#
0$~     e# Push a copy of the code block and execute it.

GolfScript

'"%r"@%"0?!"'

0?!     # Find the index of the number 0 in the string and apply logical NOT.
];      # Clear the stack.
{       # Push the following code block:

  "'\"%r\"@%\"0?!\"'0?!];"

  SS    # Undefined token. Does nothing.
  #~(>  # Comment.
  \     # Swap the string with the code block in execution.
  "0$~" # Push that string.
  N     # Undefined token. Does nothing.
}       #
0$~     # Push a copy of the code block and execute it.
\$\endgroup\$
1
  • 2
    \$\begingroup\$ I found myself a wild Dennis! \$\endgroup\$ Commented Nov 8, 2015 at 0:04

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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