Multiple program Quinecatenate!

22

2

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.

Faraz Masroor

Posted 2015-11-07T18:18:42.667

Reputation: 405

2Rules on comments? – Addison Crump – 2015-11-07T18:25:47.083

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. – Faraz Masroor – 2015-11-07T18:26:55.727

Does "not a quine" mean "do anything" or "at least run"? – LegionMammal978 – 2015-11-07T18:58:09.900

1When 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. – Faraz Masroor – 2015-11-07T19:02:40.930

Quine challenge inspiration, for anyone interested: "Print all those programs in <language>, and those only, which do not print themselves."

– ETHproductions – 2015-11-07T19:23:07.340

@ETHproductions what if we used "Print all those programs in <language>, and those only, which do not exclusively print themselves." That would avoid Russell's paradox. Though I suppose it would still run into problems with the Halting Problem, depending on your choice of language. – SuperJedi224 – 2015-11-07T21:19:38.543

The program's don't have to even be valid in the other languages, as long as they're quines in the correct labguage! – Faraz Masroor – 2015-11-07T21:27:58.287

Even after reading the meta discussion you linked to, I am unsure what exactly is acceptable as quine. For example, would using SMBF (which starts with its source code in the data array) be acceptable?

– Dennis – 2015-11-08T04:34:09.327

@Dennis let's let the community decide with votes. – Faraz Masroor – 2015-11-08T04:56:24.803

I'd rather have a final decision before I post my answer. There's no point in writing it up if it'll just get downvoted. (I am sitting on a 29-byte solution using SMBF.) – Dennis – 2015-11-08T05:01:07.423

@Dennis well I'm not really the guy to make a decision like this but I would love to see what you have. – Faraz Masroor – 2015-11-08T05:06:37.630

Answers

11

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.

Dennis

Posted 2015-11-07T18:18:42.667

Reputation: 196 637

Found another Dennis! – Faraz Masroor – 2015-11-08T00:21:32.940

8

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.

Dennis

Posted 2015-11-07T18:18:42.667

Reputation: 196 637

5

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

jimmy23013

Posted 2015-11-07T18:18:42.667

Reputation: 34 042

How does this work? I've never heard of tcl – Faraz Masroor – 2015-11-07T20:14:58.690

@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. – jimmy23013 – 2015-11-07T23:19:08.017

3

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.

Dennis

Posted 2015-11-07T18:18:42.667

Reputation: 196 637

2I found myself a wild Dennis! – Faraz Masroor – 2015-11-08T00:04:00.357