{"id":3895,"date":"2024-07-12T01:43:17","date_gmt":"2024-07-11T23:43:17","guid":{"rendered":"https:\/\/vielhuber.de\/?p=3895"},"modified":"2024-07-12T01:48:09","modified_gmt":"2024-07-11T23:48:09","slug":"quine","status":"publish","type":"post","link":"https:\/\/vielhuber.de\/blog\/quine\/","title":{"rendered":"Quine"},"content":{"rendered":"\n<p>Ein\u00a0<em>Quine-Programm<\/em>\u00a0oder\u00a0<em>Quine<\/em>\u00a0ist ein Programm, das beim Ausf\u00fchren seinen eigenen Quellcode ausgibt. Ein Quine darf nicht \u201eaus sich selbst heraustreten\u201c, indem es beispielsweise den Inhalt der Datei ausdruckt, in der es enthalten ist, oder introspektive F\u00e4higkeiten verwendet, um seine eigene Darstellung auszudrucken. Stattdessen muss es\u00a0seinen eigenen Quellcode\u00a0<em>berechnen.<\/em><\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Der klassische Weg zur Erstellung eines solchen Programms erfolgt in zwei Schritten:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Initialisiere eine Zeichenfolgevariable mit einem Platzhalter f\u00fcr die Interpolation.<\/li>\n\n\n\n<li>Drucke die Zeichenfolge und interpolieren Sie sie\u00a0<em>in sich selbst<\/em>.<\/li>\n<\/ol>\n\n\n\n<p>Der Trick besteht darin, die Zeichenfolge genau richtig zu w\u00e4hlen. Wie man das macht, ist von Sprache zu Sprache unterschiedlich und h\u00e4ngt von der Deklaration der Variablen, dem Bedarf an Semikolons und Zeilenumbr\u00fcchen, den erforderlichen Anf\u00fchrungszeichen usw. ab. Der Umgang mit Anf\u00fchrungszeichen ist interessant; Man muss einen Weg finden, anzugeben, dass ein Anf\u00fchrungszeichen gedruckt werden soll, ohne tats\u00e4chlich ein Anf\u00fchrungszeichen zu verwenden.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Bash<\/h3>\n\n\n\n<p>Wie die meisten Dinge in Bash verwendet auch dieses Programm eine interessante Eigenart. Obwohl einfache Anf\u00fchrungszeichen starke Anf\u00fchrungszeichen sind und nichts erweitern, interpretiert\u00a0<code>printf<\/code> oktale Escapezeichen als Zeichen mit dem angegebenen Codepunkt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>s='s=\\47%s\\47;printf \"$s\" \"$s\"';printf \"$s\" \"$s\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Python<\/h3>\n\n\n\n<p>In Python\u00a0liefert der Formatbezeichner <code>%r<\/code> automatisch einfache Anf\u00fchrungszeichen. Am einfachsten ist es, wenn der Code mit einem Zeilenumbruchzeichen endet:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>s='s=%r;print(s%%s)';print(s%s)<\/code><\/pre>\n\n\n\n<p>Wenn man den Code ohne Zeilenumbruch m\u00f6chte, muss man Folgendes schreiben:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>s='s=%r;print(s%%s,sep=\"\")';print(s%s,sep=\"\")<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">JavaScript<\/h3>\n\n\n\n<p>Die folgenden JavaScript-Quines laufen unter node.js. Sie verwenden\u00a0<code>console.log<\/code>, das immer eine neue Zeile anf\u00fcgt, sodass am Ende eines jedes Skripts eine neue Zeile ben\u00f6tigt wird:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>s=\"s=%j;console.log(s,s)\";console.log(s,s)<\/code><\/pre>\n\n\n\n<p>Das folgende Programm ist auch interessant: Es druckt nicht seine gesamte Darstellung, aber es verl\u00e4sst sich auf die Tatsache, dass Funktionen eine bestimmte Darstellung haben:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(function a(){console.log('('+a+')()')})()<\/code><\/pre>\n\n\n\n<p>Das n\u00e4chste Beispiel ist nah am Cheaten, da es <code>eval<\/code> verwendet:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>code='var q=unescape(\"%27\");console.log(\"code=\"+q+code+q+\";eval(code)\")';eval(code)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Rust<\/h3>\n\n\n\n<p>Rust bietet eine M\u00f6glichkeit, ein Argument in seinem formatierten Druckmakro in Anf\u00fchrungszeichen zu setzen. Dieses Makro erfordert jedoch, dass das erste Argument des Druckmakros ein Zeichenfolgenliteral ist! Am besten verwendet man daher den Positionsargumentbezeichner:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>fn main(){print!(\"fn main(){{print!({0:?},{0:?})}}\",\"fn main(){{print!({0:?},{0:?})}}\")}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">PHP<\/h3>\n\n\n\n<p>Dieses PHP-Programm funktioniert, indem es den Quellcode in einer Zeichenkette speichert und diese Zeichenkette dann mit <code>printf<\/code> ausgibt. Die <code>39<\/code> steht f\u00fcr das ASCII-Zeichen <code>'<\/code>, um die Anf\u00fchrungszeichen in der Zeichenkette korrekt zu behandeln:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n$code = '&lt;?php\n$code = %c%s%c;\nprintf($code, 39, $code, 39);\n';\nprintf($code, 39, $code, 39);<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">HQ9+<\/h3>\n\n\n\n<p>Zu guter Letzt folgt HQ9+, das von Cliff Biffle entwickelt wurde:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Q<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Ein\u00a0Quine-Programm\u00a0oder\u00a0Quine\u00a0ist ein Programm, das beim Ausf\u00fchren seinen eigenen Quellcode ausgibt. Ein Quine darf nicht \u201eaus sich selbst heraustreten\u201c, indem es beispielsweise den Inhalt der Datei ausdruckt, in der es enthalten ist, oder introspektive F\u00e4higkeiten verwendet, um seine eigene Darstellung auszudrucken. Stattdessen muss es\u00a0seinen eigenen Quellcode\u00a0berechnen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"gtbabel_prevent_lngs":"","gtbabel_alt_lng":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-3895","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-blog"},"acf":[],"yoast_head":"<title>Quine &#060; Vielhuber David<\/title>\n<meta name=\"description\" content=\"Ein\u00a0Quine-Programm\u00a0oder\u00a0Quine\u00a0ist ein Programm, das beim Ausf\u00fchren seinen eigenen Quellcode ausgibt. Ein Quine darf nicht \u201eaus sich selbst hera...\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vielhuber.de\/blog\/quine\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Quine &#060; Vielhuber David\" \/>\n<meta property=\"og:description\" content=\"Ein\u00a0Quine-Programm\u00a0oder\u00a0Quine\u00a0ist ein Programm, das beim Ausf\u00fchren seinen eigenen Quellcode ausgibt. Ein Quine darf nicht \u201eaus sich selbst heraustreten\u201c,\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vielhuber.de\/blog\/quine\/\" \/>\n<meta property=\"og:site_name\" content=\"Vielhuber David\" \/>\n<meta property=\"article:published_time\" content=\"2024-07-11T23:43:17+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-07-11T23:48:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vielhuber.de\/wp-content\/uploads\/about.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"700\" \/>\n\t<meta property=\"og:image:height\" content=\"552\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"David\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@vielhuber\" \/>\n<meta name=\"twitter:site\" content=\"@vielhuber\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"David\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"2\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/quine\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/quine\\\/\"},\"author\":{\"name\":\"David\",\"@id\":\"https:\\\/\\\/vielhuber.de\\\/#\\\/schema\\\/person\\\/64d4ff14713d413ea4d9b210d0c2c6ef\"},\"headline\":\"Quine\",\"datePublished\":\"2024-07-11T23:43:17+00:00\",\"dateModified\":\"2024-07-11T23:48:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/quine\\\/\"},\"wordCount\":372,\"publisher\":{\"@id\":\"https:\\\/\\\/vielhuber.de\\\/#\\\/schema\\\/person\\\/64d4ff14713d413ea4d9b210d0c2c6ef\"},\"articleSection\":[\"Blog\"],\"inLanguage\":\"de\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/quine\\\/\",\"url\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/quine\\\/\",\"name\":\"Quine &#060; Vielhuber David\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vielhuber.de\\\/#website\"},\"datePublished\":\"2024-07-11T23:43:17+00:00\",\"dateModified\":\"2024-07-11T23:48:09+00:00\",\"description\":\"Ein\u00a0Quine-Programm\u00a0oder\u00a0Quine\u00a0ist ein Programm, das beim Ausf\u00fchren seinen eigenen Quellcode ausgibt. Ein Quine darf nicht \u201eaus sich selbst heraustreten\u201c,\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/quine\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/vielhuber.de\\\/blog\\\/quine\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/quine\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/vielhuber.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Quine\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/vielhuber.de\\\/#website\",\"url\":\"https:\\\/\\\/vielhuber.de\\\/\",\"name\":\"Vielhuber David\",\"description\":\"Full-Stack Developer\",\"publisher\":{\"@id\":\"https:\\\/\\\/vielhuber.de\\\/#\\\/schema\\\/person\\\/64d4ff14713d413ea4d9b210d0c2c6ef\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/vielhuber.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/vielhuber.de\\\/#\\\/schema\\\/person\\\/64d4ff14713d413ea4d9b210d0c2c6ef\",\"name\":\"David\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/vielhuber.de\\\/wp-content\\\/uploads\\\/about.jpg\",\"url\":\"https:\\\/\\\/vielhuber.de\\\/wp-content\\\/uploads\\\/about.jpg\",\"contentUrl\":\"https:\\\/\\\/vielhuber.de\\\/wp-content\\\/uploads\\\/about.jpg\",\"width\":700,\"height\":552,\"caption\":\"David\"},\"logo\":{\"@id\":\"https:\\\/\\\/vielhuber.de\\\/wp-content\\\/uploads\\\/about.jpg\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/vielhuber\"]}]}<\/script>","yoast_head_json":{"title":"Quine &#060; Vielhuber David","description":"Ein\u00a0Quine-Programm\u00a0oder\u00a0Quine\u00a0ist ein Programm, das beim Ausf\u00fchren seinen eigenen Quellcode ausgibt. Ein Quine darf nicht \u201eaus sich selbst hera...","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vielhuber.de\/blog\/quine\/","og_locale":"de_DE","og_type":"article","og_title":"Quine &#060; Vielhuber David","og_description":"Ein\u00a0Quine-Programm\u00a0oder\u00a0Quine\u00a0ist ein Programm, das beim Ausf\u00fchren seinen eigenen Quellcode ausgibt. Ein Quine darf nicht \u201eaus sich selbst heraustreten\u201c,","og_url":"https:\/\/vielhuber.de\/blog\/quine\/","og_site_name":"Vielhuber David","article_published_time":"2024-07-11T23:43:17+00:00","article_modified_time":"2024-07-11T23:48:09+00:00","og_image":[{"width":700,"height":552,"url":"https:\/\/vielhuber.de\/wp-content\/uploads\/about.jpg","type":"image\/jpeg"}],"author":"David","twitter_card":"summary_large_image","twitter_creator":"@vielhuber","twitter_site":"@vielhuber","twitter_misc":{"Verfasst von":"David","Gesch\u00e4tzte Lesezeit":"2\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/vielhuber.de\/blog\/quine\/#article","isPartOf":{"@id":"https:\/\/vielhuber.de\/blog\/quine\/"},"author":{"name":"David","@id":"https:\/\/vielhuber.de\/#\/schema\/person\/64d4ff14713d413ea4d9b210d0c2c6ef"},"headline":"Quine","datePublished":"2024-07-11T23:43:17+00:00","dateModified":"2024-07-11T23:48:09+00:00","mainEntityOfPage":{"@id":"https:\/\/vielhuber.de\/blog\/quine\/"},"wordCount":372,"publisher":{"@id":"https:\/\/vielhuber.de\/#\/schema\/person\/64d4ff14713d413ea4d9b210d0c2c6ef"},"articleSection":["Blog"],"inLanguage":"de"},{"@type":"WebPage","@id":"https:\/\/vielhuber.de\/blog\/quine\/","url":"https:\/\/vielhuber.de\/blog\/quine\/","name":"Quine &#060; Vielhuber David","isPartOf":{"@id":"https:\/\/vielhuber.de\/#website"},"datePublished":"2024-07-11T23:43:17+00:00","dateModified":"2024-07-11T23:48:09+00:00","description":"Ein\u00a0Quine-Programm\u00a0oder\u00a0Quine\u00a0ist ein Programm, das beim Ausf\u00fchren seinen eigenen Quellcode ausgibt. Ein Quine darf nicht \u201eaus sich selbst heraustreten\u201c,","breadcrumb":{"@id":"https:\/\/vielhuber.de\/blog\/quine\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vielhuber.de\/blog\/quine\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/vielhuber.de\/blog\/quine\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/vielhuber.de\/"},{"@type":"ListItem","position":2,"name":"Quine"}]},{"@type":"WebSite","@id":"https:\/\/vielhuber.de\/#website","url":"https:\/\/vielhuber.de\/","name":"Vielhuber David","description":"Full-Stack Developer","publisher":{"@id":"https:\/\/vielhuber.de\/#\/schema\/person\/64d4ff14713d413ea4d9b210d0c2c6ef"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vielhuber.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":["Person","Organization"],"@id":"https:\/\/vielhuber.de\/#\/schema\/person\/64d4ff14713d413ea4d9b210d0c2c6ef","name":"David","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/vielhuber.de\/wp-content\/uploads\/about.jpg","url":"https:\/\/vielhuber.de\/wp-content\/uploads\/about.jpg","contentUrl":"https:\/\/vielhuber.de\/wp-content\/uploads\/about.jpg","width":700,"height":552,"caption":"David"},"logo":{"@id":"https:\/\/vielhuber.de\/wp-content\/uploads\/about.jpg"},"sameAs":["https:\/\/x.com\/vielhuber"]}]}},"_links":{"self":[{"href":"https:\/\/vielhuber.de\/ta\/wp-json\/wp\/v2\/posts\/3895","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vielhuber.de\/ta\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vielhuber.de\/ta\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vielhuber.de\/ta\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vielhuber.de\/ta\/wp-json\/wp\/v2\/comments?post=3895"}],"version-history":[{"count":6,"href":"https:\/\/vielhuber.de\/ta\/wp-json\/wp\/v2\/posts\/3895\/revisions"}],"predecessor-version":[{"id":3902,"href":"https:\/\/vielhuber.de\/ta\/wp-json\/wp\/v2\/posts\/3895\/revisions\/3902"}],"wp:attachment":[{"href":"https:\/\/vielhuber.de\/ta\/wp-json\/wp\/v2\/media?parent=3895"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vielhuber.de\/ta\/wp-json\/wp\/v2\/categories?post=3895"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vielhuber.de\/ta\/wp-json\/wp\/v2\/tags?post=3895"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}