6 ms·
A Quine Puzzle
- daveloyall 11y agoSpoiler: cmVwZWF0IDMgMgpwcmludCAyCnJlcGVhdCAzIDIKcHJpbnQgMgpyZXBlYXQgMyAyCg==
- superobserver 11y agoAnother similar to your idea: cmVwZWF0IDQgMw0KcHJpbnQgMg0KcmVwZWF0IDQgMw0KcHJpbnQgMg0KcmVwZWF0IDQgMw0KcHJpbnQgMg==
- JoshTriplett 11y agoVariant that doesn't rely on potentially undefined behavior of asking "repeat" to repeat before the beginning: cHJpbnQgMApwcmludCAyCnByaW50IDAKcHJpbnQgMgpwcmludCAwCnJlcGVhdCAzIDIKcHJpbnQgMgpyZXBlYXQgMyAyCnByaW50IDIKcmVwZWF0IDMgMgo=
- daveloyall 11y agoGood eye. Also, https://github.com/wgreenberg/quine.zip/blob/gh-pages/test/interpreterSpec.js#L151 https://github.com/wgreenberg/quine.zip/blob/gh-pages/test/i...
- JoshTriplett 11y agoSure, but LZ doesn't necessarily allow that.
- sevenfive 11y agoHow do you use these strings?
- JoshTriplett 11y agoThey're base64. Feed them to "base64 -d" on Linux, or one of the many base64 decoders on the web. See https://en.wikipedia.org/wiki/Base64 https://en.wikipedia.org/wiki/Base64
- mattdodge 11y agoThis is the shortest one of the solutions so far. Wonder if it's the shortest possible? (Other than empty = empty)
- daveloyall 11y agoHm. Well, it was the first quine I arrived at. No special effort was made to make it short.
- spacehome 11y agoYes. It is the unique shortest possible solution if you allow for a repeat at the beginning. OTOH if you disallow starting with a REPEAT, the shortest is length 10.
- personjerry 11y agoMy solution, featuring only 2 distinct commands, no NOPs, and not relying on `repeat` at the beginning: cHJpbnQgMg0KcHJpbnQgMg0KcHJpbnQgMg0KcHJpbnQgMg0KcHJpbnQgMg0KcHJpbnQgMg0KcHJpbnQgMg0KcHJpbnQgMg0KcHJpbnQgMg0KcmVwZWF0IDMgMg0KcHJpbnQgMg0KcmVwZWF0IDMgMg0KcHJpbnQgMg0KcmVwZWF0IDMgMg==
- Yen 11y agoMaybe it copy-pasted wrong, but this doesn't look like a solution to me. The output is shorter than the input, and contains commands in a different order.
- personjerry 11y agoI just tried it again, and then copy pasted from the output to the input; it still works. Did you select the full string and decode with base64?
- Yen 11y agohmm. Just tried it again, and it worked now. Nice job getting one that doesn't start with repeat!
- thrwwy457 11y agorepeat 4 2 print 2 repeat 4 2 print 2 repeat 4 2 print 2
- krajzeg 11y agoA variant featuring only one number: cmVwZWF0IDQgNA0KcHJpbnQgNA0KcmVwZWF0IDQgNA0KcHJpbnQgNA0KcmVwZWF0IDQgNA0KcHJpbnQgNA0KcmVwZWF0IDQgNA0KcHJpbnQgNA0K
- jameshart 11y agoThe 'repeat' command ("repeats the last M lines of output, starting N lines from the end") isn't very well described by the documentation, so some experimentation is required. 'repeat M N' will produce no output at all when the output is empty, but will always produce M lines of output, by repeatedly looping through the last (min(N, lines of output)) lines of the output, when the output is not. That's not very intuitive.
- wgreenberg 11y agoAgreed, the descriptions could use some work. That said, I tried to strike a balance between correctness and simplicity when describing the commands so people could quickly get to trying stuff out. I do show that particular edge case (along with "print 0") in the examples, though.
- jimmaswell 11y agoempty input gets empty output, solved
- daveloyall 11y agohttp://www0.us.ioccc.org/1994/smr.hint http://www0.us.ioccc.org/1994/smr.hint
- jimmaswell 11y agoThat's where I got the idea
- AaronFriel 11y agocHJpbnQgMQpwcmludCAxCnByaW50IDEKcHJpbnQgMQpwcmludCAxCnByaW50IDEKcmVwZWF0IDMg MgpwcmludCAyCnJlcGVhdCAzIDIKcHJpbnQgMgpyZXBlYXQgMyAyCgo= Wasn't terribly difficult, though not the shortest. What's the code golf answer?
- spacehome 11y agoI wrote an program to exhaustively search (in an intelligent way so that it terminates before the universe does). The minimal to do it without depending on undefined repeat behavior is 10 statements (and there's only one of this length). It's posted by JoshTriplett.
- TheLoneWolfling 11y agoA related idea: It should be possible to write a zip (rar?) file that encodes a PRNG, such that it contains one zip: itself with the PRNG stepped forward one. (Even a "PRNG" that just outputs 1, then 11, then 111, etc, would be sufficient in most cases) The hard part is making sure the checksum is consistent. This would wreak havoc with any file checker that checks for recursive archive files.
- matchu 11y agoDoes there exist a solution that doesn't rely on undefined repeat behavior? I finally gave in and looked at the answers, but it looks like they all use `repeat M N>M`, or `repeat M N>currentOutputSize`. I kinda assumed that the interpreter was just there for convenience, and that its implementation of undefined behavior was irrelevant. But is the interpreter's implementation critical to the solution? (Then again, I'm now reading the examples and realizing that the implementation of undefined behavior was front-and-center, so that's kinda my bad xP)
- justinpombrio 11y agoGot it! cHJpbnQgMg0KcHJpbnQgMg0KcHJpbnQgMg0KcHJpbnQgMg0KcHJpbnQgMg0KcHJpbnQgMg0KcHJpbnQgMg0KcHJpbnQgMg0KcHJpbnQgMg0KcHJpbnQgMg0KcHJpbnQgMg0KcHJpbnQgMg0KcHJpbnQgMg0KcHJpbnQgMg0KcHJpbnQgMg0KcmVwZWF0IDMgMw0KcmVwZWF0IDIgMg0KcHJpbnQgMg0KcmVwZWF0IDMgMw0KcmVwZWF0IDIgMg0KcmVwZWF0IDMgMw0KcmVwZWF0IDIgMg==
- wgreenberg 11y agoAlthough I may be mistaken, LZ77 defines the repeat behavior to do exactly that: https://en.wikipedia.org/wiki/LZ77_and_LZ78#Example https://en.wikipedia.org/wiki/LZ77_and_LZ78#Example
- brownbat 11y agocmVwZWF0IDQgNA0KcHJpbnQgMg0KcmVwZWF0IDQgNA0KcHJpbnQgMg0KcmVwZWF0IDQgNA0KcHJpbnQgMg==
- anderskaseorg 11y agoChallenge: find a solution with no undefined repeat behavior and no more than two consecutive print statements.
- 1arity 11y agoprint 2 print 2 print 2 print 2 print 2 print 2 print 2 print 2 print 2 repeat 3 2 print 2 repeat 3 2 print 2 repeat 3 2
- sirtel 11y agoIt seams there are more than one solutions. Can we generalize a theory of this phenomenon?
- ectoplasm 11y agoIt's probably a good chunk of a PhD thesis to come up with both the theory and an arbitrary generator for any language. However, you could probably brute force your way to the shortest solution in this particular language fairly easily.
- 1arity 11y agoIf you sum up the M for the active lines in a solution they equal the total number of lines. So in this one, 2 + 2 + 2 + 3 + 2 + 3 = 14. Take 1 active line and 1 inactive line as some minimum, this contradicts, because this can only produce 1 line. 1 active line and two inactive lines, contradicts, because it can either produce 2 lines ( and it took 3 ) or it can produce m lines if the final line is a repeat, and yet this repeat is not printed. The function of PRINT X thus becomes like a variable definition. Something needs to be "PRINTED" in order to be available for a back reference. So everything in the quine needs to itself be printed, so that it can be "printed in the quine" by back reference. This suggests that the set of different statements, being, different values of (M) and (M,N) will be conserved. So let's assume ( and we have evidence of this ) the minimum size of statement set for a solution is 2. What two statements can produce solutions ? At this point, considering the above observations, one can enter the area of solving constraints on the numbers M and N through logic. The weird thing is I wonder how you classify these languages ( of these statements such as the one given, being, a PRINT statement and a repeat statement ). It's not Turing complete. It's not a state machine. It's not a production grammar. It's not a read and say sequence. Interesting to consider what it is and what other types there are. It also seems like there are more solutions of the same pattern. Such as print 2 print 2 print 2 print 2 print 2 print 2 print 2 print 2 print 2 print 2 print 2 print 2 repeat 4 2 print 2 repeat 4 2 print 2 repeat 4 2 print 2 repeat 4 2 And One with 15 print 2 statements followed by 5 "repeat 5 2" statements delimited by "print 2" statements. And so on. The pattern is (3 * x) * "PRINT 2" + (x - 1) * "REPEAT X 2\nPRINT 2" + "REPEAT X 2" For the other type "repeat 3 2 print 2 repeat 3 2 print 2 repeat 3 2" ( of which the version with m = 4 contains a terminating "print 2", and m = 5 doesn't work since in that case the M's sum to 2 + 2 + 5 = 9 lines of output, and there are only 8 statements in the source. Changing the active repeat statement from "repeat 5 2" to "repeat 4 2" with 2 + 2 + 4 gives 8 statements in the output and the source, and we can then do this: repeat 4 2 print 2 repeat 4 2 print 2 repeat 4 2 print 2 print 123123123211231 repeat 12312312 123123123 And it always works to echo whatever the last two lines are, so in that sense, the above "code" is like a "PRINT" function. A "concat" function can be obtained like so : repeat 5 2 print 2 repeat 5 2 print 2 repeat 5 2 print 2 repeat XXX YYY ==> and the output is the source + "repeat 5 2" + "repeat XXX YYY" So this function concatenates "repeat 5 2" and "repeat XXX" Likely other "primitives" can be constructed. It's interesting to consider what the "product space" of these would be. What functionality could be derived from this simple language ?
- deleted 11y ago[deleted]
- spacehome 11y agoI made an Objective-C command-line tool that exhaustively searches for solutions. http://pastebin.com/H2nZ9Fxz http://pastebin.com/H2nZ9Fxz It found JoshTriplett's 10-line solution and shows that it's minimal if you don't allow undefined REPEAT behavior, and it found daveloyall's 5-line solution and shows that it's minimal of you do allow undefined REPEAT behavior.