[HN Gopher] A Ruby program that generates itself through a 128-l...
___________________________________________________________________
A Ruby program that generates itself through a 128-language quine
loop
Author : sirnicolaz
Score : 325 points
Date : 2022-10-06 08:03 UTC (14 hours ago)
(HTM) web link (github.com)
(TXT) w3m dump (github.com)
| kirjavascript wrote:
| I wrote a new page describing how to write quines recently[1],
| but the quine-relay is really above and beyond
|
| 1: https://github.com/kirjavascript/quine-howto
| RektBoy wrote:
| Of course author is from Japan, of course.
| whage wrote:
| 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 wrote:
| 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 wrote:
| > It's easier in some languages than others.
|
| Yes, it seems Lisp wouldn't be appropriate for this.
| moomin wrote:
| I tried typing `1` into the REPL. Am I doing this right?
| tash9 wrote:
| Maybe. What sound did it make?
| kazinator wrote:
| 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 wrote:
| 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.
| sixothree wrote:
| Like refactoring someone else's code? So much fun.
| titzer wrote:
| 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...
| _wldu wrote:
| Nice, this Go version satisfies gofmt:
|
| https://github.com/62726164/quine
| thomasahle wrote:
| You should put SPOILER tags on that.
| jmartin2683 wrote:
| 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
| neilwilson wrote:
| Disappointed there is no Eiffel
| drcabana wrote:
| 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 wrote:
| Great write up, thanks for posting.
| drcabana wrote:
| Thanks for the kind words. Now I know at least one person has
| read it.
| kubb wrote:
| 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?
| Bloedcoin wrote:
| Yes.
|
| I see this every single day.
|
| And it becomes more and more obvious the better you become.
| WindyLakeReturn wrote:
| 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.)
| lifthrasiir wrote:
| 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(p
| art(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 wrote:
| 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 wrote:
| "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 wrote:
| Great job, respect!
| ohwellhere wrote:
| 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 wrote:
| 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
| siraben wrote:
| There is an ongoing issue in Nixpkgs[0] to package this quine,
| more help would be appreciated!
|
| [0] https://github.com/NixOS/nixpkgs/issues/131492
| debdut wrote:
| for anybody willing to learn the art of quine, thanks to
| obfuscationeso, here's "The world of Bbfuscated, Esoteric,
| Artistic Programming" book translated from Japanese
|
| https://web.archive.org/web/20220309061204/https://obfuscati...
| raydiatian wrote:
| 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
| viraptor wrote:
| The top of the repo explains it: https://github.com/mame/quine-
| relay
| faitswulff wrote:
| 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.
| obfuscationeso wrote:
| https://web.archive.org/web/20220309061204/https://obfuscati...
| belter wrote:
| I like the Radiation-hardened Quine:
| https://github.com/mame/radiation-hardened-quine
| jvanderbot wrote:
| I don't even understand how this is possible. My mind runs to
| CRC or error correcting codes, but how you'd use it is beyond
| me.
| avg_dev wrote:
| I never zoom out on GitHub, but this one time it was kind of
| neat.
| pushedx wrote:
| One of the languages is Piet. Now that's insane.
| Liquix wrote:
| A work of art :)
|
| Previous discussion: https://news.ycombinator.com/item?id=6048761
| (177 comments) (2013)
| polycaster wrote:
| But does it run Doom?
| mmohtasim wrote:
| Is there any 2 or 3 language version of this? Like ruby to python
| to java to ruby?
| lifthrasiir wrote:
| 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.
| dwheeler wrote:
| This article explains the basic idea:
|
| David Bertoldi's "How to write your first Quine program"
| https://towardsdatascience.com/how-to-write-your-first-quine...
|
| However, that article is a basic introduction. This 128-language
| quine loop is beyond expert, bordering on magic.
| bilekas wrote:
| This is insane.. I remember when it was only 50 and I was blown
| away.
| daptaq wrote:
| This was written by Yusuke Endoh, who also wrote this submission
| to the IOCCC that I remember being arguably more astonished when
| I saw it for the first time:
| https://www.youtube.com/watch?v=QMYfkOtYYlg (ASCII fluid
| dynamics).
| sixstringtheory wrote:
| Wow, that was cool, never found that one when I went on a deep
| dive after discovering their quine relay. The other amazing
| ASCII program of theirs that I love is the Qlobe:
| http://mamememo.blogspot.com/2010/09/qlobe.html?m=1
| bheadmaster wrote:
| 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 wrote:
| You are in luck! I threw the book into google translate a while
| ago cause I wanted to read it. I took it offline cause I got an
| email from the publisher saying to take it down cause it was
| copyrighted material, however it is still archived on the
| wayback machine:
| https://web.archive.org/web/20220309061204/https://obfuscati...
| tromp wrote:
| 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.
| enviclash wrote:
| 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!
| ramigb wrote:
| Now this is how you market a book. cool.
___________________________________________________________________
(page generated 2022-10-06 23:00 UTC)