whage 2 years ago

Ken Thompson wrote in his famous paper [1] about quines:

> If you have never done this, I urge you to try it on your own. The discovery of how to do it is a revelation that far surpasses any benefit obtained by being told how to do it

Every once in a while I give them a try but I couldn't yet create one and it frustrates me very much. Afraid of being denied that "revelation" I never dared to read his paper past that point. I'm afraid I might never read it because of my ego.

1: https://www.cs.cmu.edu/~rdriley/487/papers/Thompson_1984_Ref...

  • 3pt14159 2 years ago

    It's easier in some languages than others.

    There is a delight in doing it, but don't overdo the anticipation. I've found greater delights in programming.

    • behnamoh 2 years ago

      > It's easier in some languages than others.

      Yes, it seems Lisp wouldn't be appropriate for this.

      • moomin 2 years ago

        I tried typing `1` into the REPL. Am I doing this right?

        • tash9 2 years ago

          Maybe. What sound did it make?

          • rinze 2 years ago

            It was blue.

      • kazinator 2 years ago

        I believe that solution is possible for the Lisp-modified task description:

        Write a cyclic quine that reproduces itself through 128 Lisp languages

        because we easily have that many, or more.

      • tmtvl 2 years ago

        I mean, isn't generating quines and twines one of the examples used to show of MiniKanren?

        William Byrds presentations of MK are absolutely delightful, by the way.

    • emmelaich 2 years ago

      Yes, it's quite easy in sh:

      [update: same program also works in python and ruby]

    • sixothree 2 years ago

      Like refactoring someone else's code? So much fun.

      • 3pt14159 2 years ago

        You're teasing, but I understand the question so I'll answer.

        I've had a good deal of joyous fun exploring quirky ideas with mathematics and software. It's old hat now, but back in 2011 I repurposed an algorithm primarily used for document classification by creating my own tokenization of features and stuffing it in there then running it through a ton of photographs, but forcing it to only 200 dimensions of freedom.

        Since the algorithm didn't have room to fully separate dimensions, it had to start grouping photos together along dimensions that had to account for multiple topics. I'll never forget bursting out laughing as I explored one particular dimension that was "motorcycles...... and photos of women taken from street level aimed at their scantily clad behinds."

        Collaborative filtering proved to me that some stereotypes really do have grounding in reality.

        As for the quine stuff? I actually had more fun repurposing[0] some of the ideas for a letter to my MP about the dangers of electronic voting back in 2011 when it seemed possible that Canada was going to allow it at the federal level. I chuckled more at literally sending self-eating code to a presumable less technical politician than I did at getting something to repeat itself.

        [0] https://github.com/zachaysan/darth_vader_wins_election

  • titzer 2 years ago

    I hadn't written one until ~30 mins ago [1]. I cheated and looked at a Java quine (not particularly elegant, but easy to see what is going on.), but I wrote one for Virgil. Just think string substitution; a string with a hole in it and you substitute a copy of the string, quoted into the hole. Just one substitution suffices.

    [1] https://github.com/titzer/virgil/blob/master/apps/Quine/Quin...

faitswulff 2 years ago

This issue imploring Yusuke Endoh to write a paper about it is amusing:

https://github.com/mame/quine-relay/issues/10

> p-e-w:

> This is more than a cool program – it's a computer science breakthrough! Apparently, you have discovered a method for constructing quines based on an arbitrary blueprint involving any amount of languages. > > Please write a technical paper describing your approach. I'm sure you'll have no trouble finding a CS journal that will publish it.

> mame:

> Okay I'll submit to the Journal of Universal Rejection.

Later:

> mame:

> I'll soon publish a book, "The world of obfuscated, esoteric, artistic programming". The book explains how to write a uroboros quine. Hence, I proudly close this issue.

> It also contains my almost all (about forty) works, including alphabet-only Ruby program, radiation-hardened quine, etc., and explains many techniques to write such programs.

> You can buy my book on amazon.co.jp. Unfortunately, it is written in Japanese, yet another esoteric language. I hope anyone can translate to English.

tromp 2 years ago

Some background: https://esoteric.codes/blog/the-128-language-quine-relay

Note that the author made the challenge even harder by sorting the languages in alphabetical order:

> According to Endoh, the most challenging transitions were Befunge to BLC8 to brainfuck, as all three are esoteric. It runs through languages strictly in alphabetical order, so there was no opportunity to group easier-to-work-with languages together.

bheadmaster 2 years ago

I am amazed. I have no idea how the hell could the author even do that.

Apparently, they have a book called "The world of obfuscated, esoteric, artistic programming", but it seems to be written in Japanese. I hope it will be translated to English someday, so I may learn this dark sorcery.

  • obfuscationeso 2 years ago
    • alrlroipsp 2 years ago

      I don't care if you share hollywood movies but I find it a bit appauling you just keep posting this crappy autotranslate of his in-print book.

      This guy deserves some sales, he's legend.

      • bheadmaster 2 years ago

        An argument could be made that, until he releases an English version, the crappy autotranslate version is better than nothing, and doesn't actually harm his sales, since the people who know Japanese will not care for the crappy autotranslate version, while people who don't will not care for the Japanese version.

        Though, I personally found the autotranslate version somewhat unreadable, so I'll probably wait for the author's translation.

      • obfuscationeso 2 years ago

        I doubt he is loosing any sales because of this. You can't even buy the book outside of japan. I would 100% buy the book if I was able, but at the moment the best that is available is this crappy google translate version.

drcabana 2 years ago

Last December I had the itch to do some blogging. As it happens, I wrote a four part series that explains in detail how to write quines and quine relays. The initial post can be found at https://drcabana.org/quine/

I am a longtime lurker and finally decided to join in order to comment on this thread. I hope that it is not inappropriate to post a link to my own take on this material. If it is, please accept my apologies and feel free to downvote/flag me out of existence.

  • feintruled 2 years ago

    Great write up, thanks for posting.

    • drcabana 2 years ago

      Thanks for the kind words. Now I know at least one person has read it.

kubb 2 years ago

Many programmers complain that they can't complete a hello world example in one or more of the languages featured here because they're too difficult.

This guy demonstrated enough understanding of 128 of them to make this work.

Is the difference in competence really so big between us?

  • lifthrasiir 2 years ago

    While this is amazing, I should point out that for most languages he only needs to understand enough syntax to print strings and possibly unquote them. If you actually run this program into the first language, Ruby, the actual code (meant to be a Rust code) is as follows:

        fn main(){print!("{}",("object QR extends App{print(\"(display \\\"printf(\\\\\\\"1d;s/.//;s/1/ the sum of a son and0/g;s/0/ twice/g;s/2/You are as bad as/g;s/3/ a son!Speak your mind!/g\\\\\\\\n#The Relay of Quine.\\\\\\\\n#Ajax, a man.\\\\\\\\n#Ford, a man.\\\\\\\\n#Act i: Quine.\\\\\\\\n#Scene i: Relay.\\\\\\\\n#[Enter Ajax and Ford]\\\\\\\\n#Ajax:\\\\\\\\n#\\\\\\\");function[]=f(s);for i=1:2:length(s),printf(\\\\\\\"2%s3\\\\\\\",part(dec2bin(hex2dec(part(s,i:i+1))),$:-1:2)),end;endfunction\\\\nf('[lots of hexdump]')\\\\nf('[lots of hexdump]')[snip]\\\\nprintf(\\\\\\\"\\\\\\\\n#[Exeunt]\\\\\\\");quit\\\")\");}"));}
    
    ...where `("object ... ;}")` part is a single string literal here. The actual quine stuff can be done in just one language at your choice, or can be assimilated into some other language where unquoting is a bit heavier. It is much easier than polyglots, where a single code should be interpreted in multiple languages.
    • jstanley 2 years ago

      Printing and unquoting strings is enough to write an ordinary quine (although getting it exactly right is still quite subtle).

      Making a quine relay is substantially more complicated, because you don't just print the quoted string, you have to print the quoted version of a string in a different language, but that unwraps to the same thing 128 applications later!

      If you still think it's easy, I reckon you should write us a quine relay of just 3 languages and then explain how simple it is.

      • lifthrasiir 2 years ago

        "Easier than polyglot" does not mean "easy". :-) But I took a bit of time to produce a three-language quine relay elsewhere in this thread [1], and it is relatively easy to follow. The quine stuff (and thus every necessary quoting) is done in Ruby here, Python and Java only prints an appropriately quoted string.

        Of course there should be several intermediate steps to keep the number of quotes reasonable (since it will be exponentially increasing in most languages), and that's probably why there are hexdumps after about 20ish languages.

        [1] https://news.ycombinator.com/item?id=33109200

        • jstanley 2 years ago

          Great job, respect!

      • ohwellhere 2 years ago

        He didn't say it was easy at all, he simply pointed out that the required knowledge of each language is a subset of the total available functionality of each language.

    • sirnicolaz 2 years ago

      In this video (where among the other things they explain huroboro), they show an example of code that prints out exactly the same output (itself) whether it's compiled/executed in c, python or ruby

      https://youtu.be/6avJHaC3C2U?t=1957

  • WindyLakeReturn 2 years ago

    What is meant by "can't complete"?

    Are we saying "can't do it in an interview without access to some resources", "can't do it in the amount of time I'm willing to learn the language", or truly a "I could never do this even if I dedicated time to it and had standard resources to work with"?

    For me, I 'can't' do the first one even in languages I commonly use as I almost never write the code for the initial entry point. Either I'm working on an existing project of the IDE generates it and I never look closely at it so I'll likely mess something up.

    If it is the second, it is more a of an 'I won't' do it in some languages. I don't doubt my ability to do it, I just don't have plans on learning many of these languages. I'll read an article on how BF works, but I don't plan to spend more time on it than that.

    If it is the third option, then I'm quite bothered by level of defeatism in it and would be surprised by a programmer saying it. It is something I hear from people who took a coding class, barely passed, and decided not to touch the topic again. Even then I would challenge those people as having the ability to do it but having (entirely valid) reasons not to spend time on the attempt. (I make such a challenge because I think it is beneficial for people to not put themselves down and to draw a distinction between something they can't do and something they do have the power to do but don't have enough reason to do.)

  • Bloedcoin 2 years ago

    Yes.

    I see this every single day.

    And it becomes more and more obvious the better you become.

jmartin2683 2 years ago

It’s amazing what people can do with stuff like this. Such a beautiful language (Ruby) made so ugly yet beautiful when viewed from a higher altitude.. there’s a metaphor there somewhere

pushedx 2 years ago

One of the languages is Piet. Now that’s insane.

bilekas 2 years ago

This is insane.. I remember when it was only 50 and I was blown away.

enviclash 2 years ago

Code that writes code that writes code... my limited experience combining AWK and GAMS gave me impressively powerful feelings about my limited code. This surely belongs to the next level, I'll go for more!

benj111 2 years ago

If it's a 128 language loop is it fair to describe it as ruby?

The other 127 languages presumably have all the information so you should be able to start and end at any language?

I guess in its current implementation the ruby code is the code that ends the loop? But that is optional?

  • rdlw 2 years ago

    > I guess in its current implementation the ruby code is the code that ends the loop

    I don't think so. It looks like the rc code generates the REXX code, which generates the Ruby code, which generates the Rust code....

    The only thing that separates Ruby is that it's formatted into ASCII art, although it's not clear if the REXX output is similarly formatted. I can't say I've run through the cycle.

mmohtasim 2 years ago

Is there any 2 or 3 language version of this? Like ruby to python to java to ruby?

  • lifthrasiir 2 years ago

    Here it is:

        a='print("""class q{public static void main(String[]a){System.out.println("a=#;a[35.chr]=39.chr+a.gsub(34.chr,92.chr*3+34.chr)+39.chr;puts a");}}""")';a[35.chr]=39.chr+a.gsub(34.chr,92.chr*3+34.chr)+39.chr;puts a
    
    Run with `ruby q.rb | python - > q.java && javac q.java && java q`. Pretty sure that you can shorten this, I didn't take much time to do that.
raydiatian 2 years ago

How exactly does this work? Does one language invoke another and another in a chain, or ruby at the top calling A, then B, then C..

And is that an Ouroboros snake, or something else

avg_dev 2 years ago

I never zoom out on GitHub, but this one time it was kind of neat.

sixothree 2 years ago

The real difficulty is getting 128 languages to compile.

RektBoy 2 years ago

Of course author is from Japan, of course.

ramigb 2 years ago

Now this is how you market a book. cool.

neilwilson 2 years ago

Disappointed there is no Eiffel