Gib ein Bild deines Quellcodes aus (nicht ganz einfach)


29

Code Golf: Drucken Sie ein Bild des Quellcodes.

Bedarf

  1. Es muss das Image des Quellcodes selbst ausgegeben werden, keine Version, die an anderer Stelle gespeichert und zur Laufzeit abgerufen wurde.
  2. Der Code muss so lesbar sein, dass er von Hand kopiert und die Ergebnisse reproduziert werden können.

Jedes Bildformat ist anwendbar.

Boni

  • -10% Ihrer Punktzahl, wenn Sie mehr als ein Ausgabeformat zulassen.
  • -15%, wenn Ihr Code auch ein "wahrer" Quine ist. dh es liest seinen Quellcode nicht, aber der Quellcode ist eingebettet (siehe hier für ein Beispiel)
  • -30%, wenn Ihr Code eine strenge Quine ist - dh das Bild des Codes ist in das Programm eingebettet (Piet-Lösungen, ich sehe Sie an.).

Muss es lesbar sein?
Tim Seguine

7
Msgstr "Muss das Codebild selbst ausgeben, keine gespeicherte Version von anderswo." Darf und / oder muss die Quellcodedatei gelesen werden?
Tim Seguine

29
Ich habe gerade eine Lösung in Leerzeichen implementiert. Das resultierende Bild sieht ziemlich langweilig aus.
Howard

7
Hier ist ein interessantes Bild Quine in Piet geschrieben: mamememo.blogspot.be/2009/10/piet-quine.html
ProgramFOX

Antworten:


25

Schale

Mit "Ein Bild des Quellcodes drucken" gehe ich davon aus, dass das Drucken eines Bildes auf Papier akzeptabel wäre.

#!/bin/sh
lpr $0

21

7
Könnten Sie Community-Wiki diese Antwort? Dies ist zu unserer Standardrichtlinie für externe Antworten geworden. Das ist aber wirklich cool!
Jonathan Van Matre

@ JonathanVanMatre Hoppla, entschuldigung. Das wollte ich tun. Ich denke, ich sollte nicht versuchen, Fragen zu beantworten, während ich an einer anderen Diskussion teilnehme .
Der Kerl mit dem Hut

Es ist der niedrigere der beiden. -30% und -15%
Pureferret

14

PHP - 487 × 0,9 × 0,85 = 372,555 (2000 × 99 Pixel)

<?php $y="imagecolorallocate";$l=[
'<?php $y="imagecolorallocate";$l=[',
'];$i=imagecreate(2e3,99);$y($i,99,99,99);$w=$y($i,$j=0,0,0);$z=function($_)use(&$j,$i,$w){imagestring($i,4,9,$j+=15,$_,$w);};$z($l[0]);foreach($l as$m)$z(chr(39).$m.chr(39).",");$z($l[1]);$argv[1]($i,"o");',
];$i=imagecreate(2e3,99);$y($i,99,99,99);$w=$y($i,$j=0,0,0);$z=function($_)use(&$j,$i,$w){imagestring($i,4,9,$j+=15,$_,$w);};$z($l[0]);foreach($l as$m)$z(chr(39).$m.chr(39).",");$z($l[1]);$argv[1]($i,"o");

Wenn die Warnungen in Ordnung sind: PHP - 479 × 0,9 × 0,85 = 366,435

<?php $y=imagecolorallocate;$l=[
'<?php $y=imagecolorallocate;$l=[',
'];$i=imagecreate(2e3,99);$y($i,99,99,99);$w=$y($i,$j=0,0,0);$z=function($_)use(&$j,$i,$w){imagestring($i,4,9,$j+=15,$_,$w);};$z($l[0]);foreach($l as$m)$z(chr(39).$m.chr(39).",");$z($l[1]);$argv[1]($i,o);',
];$i=imagecreate(2e3,99);$y($i,99,99,99);$w=$y($i,$j=0,0,0);$z=function($_)use(&$j,$i,$w){imagestring($i,4,9,$j+=15,$_,$w);};$z($l[0]);foreach($l as$m)$z(chr(39).$m.chr(39).",");$z($l[1]);$argv[1]($i,o);

Sie stellen die Ausgabefunktion bereit, die als erstes Befehlszeilenargument verwendet werden soll:

php timwolla.php imagepng

Lösung mit Warnungen:


5
Ich denke, dies ist die erste Quine und nicht nur ein Skript liest seinen eigenen Quellcode oder macht einfach einen Screenshot von sich.
Nitro2k01

Zwei Fragen, können Sie eine andere Schreibweise für Ihre Dezimalstellen verwenden? Es ist leicht verwirrend. Auch warum ist das Bild so klein? Es ist schwer zu lesen (zugegeben, ich bin auf meinem Handy)
Pureferret

2
@Pureferret zoomen Sie einfach hinein. Es ist eigentlich ziemlich lesbar, obwohl es pixelig ist.
Ruslan

1
@ Pureferret Nur geändert, ich erinnere mich nie, dass es anders in Englisch ist ...
TimWolla

13

Leerzeichen, 125



















Gibt eine Bilddatei im pbm- Format aus.

Wenn Sie diesen Code testen, kopieren Sie ihn bitte, indem Sie auf "Bearbeiten" klicken und alles zwischen den <pre>Tags kopieren .

Ausgabe:

P1 1 1 0

7
kopiert von Hand, blinzelt auf den Bildschirm, um subtile Unterschiede zwischen Leerzeichen und Tabulatoren zu sehen .... läuft Programm .... Festplatte explodiert
Jonathan Van Matre

17
Diese Antwort entspricht nicht der Anforderung 2. Das Bild ist nicht lesbar genug, um den Quellcode zu reproduzieren.
user2357112 unterstützt Monica

2
@ user2357112 Das kannst du aber nicht beweisen. Das ist die Lücke, die ich hier ausnütze.
duci9y

21
Ja kann ich, Informationstheorie verwendend. Eine strenge Begründung würde den Rahmen eines Kommentars mit 600 Zeichen sprengen, aber der Kern ist, dass Ihr Bild mit einem Code-Image identisch ist, das nicht funktioniert.
user2357112 unterstützt Monica

3
Verzeihen Sie die Franzosen, aber BS! Die Regeln besagen, dass der Code lesbar sein muss. Das Schreiben von Code in Whitespace negiert das nicht. Dies ist Ihr Programm, das bei Auswahl in Sublime Text angezeigt wird : i.imgur.com/A2ZaQwI.png Dies ist lesbar. Was auch immer Ihr Programm ausgibt, ist es nicht. Außerdem haben Sie nicht erklärt, ob das, was Ihr Programm ausgibt, Ihr Quellcode oder nur ein leeres Bild ist.
Nitro2k01

13

Mathematica, 37 31 Zeichen

(#2[#1[#0[#1,#2]]]&)[Defer,Rasterize]

(Rasterize[#1[#0[#1]]]&)[Defer]

Bildbeschreibung hier eingeben

Inspiriert von einer Antwort in mathematica.stackexchange.com .


Erkläre es ... wofür sind die #n? Vielleicht können wir es herausfinden.
Pureferret

Zumindest funktioniert es ohne FrontEnd. (Versucht mit Export["/tmp/out.png",%]nach Ausführen dieses Befehls)
Ruslan

2
@Pureferret #nbedeutet das nArgument einer reinen Funktion (erstellt am &Punkt). Der gesamte Ausdruck erweitert sich zu Rasterize[Defer[#0[Defer,Rasterize]]], wobei der #0rekursive Aufruf der ursprünglichen reinen Funktion erfolgt. In gewisser Weise ist dies keine strenge Quine, aber es braucht kein Frontend, um zu funktionieren, und ist IMO eine nette Lösung.
Ruslan

Ich bewundere die Verwendung von Defer [] und Rasterize [] sowohl als Befehle als auch als Objekt der Befehle. Ich habe noch nie eine Rekursion gesehen, die so dargestellt wurde.
Michael Stern

10

AppleScript, 68 37

Okay, wenn Sie ImageMagick in zsh aufrufen können, ist dies auch gültig. Ich hacke immer noch nach etwas Eleganterem und Eleganterem, um mich selbst zu befriedigen, aber um Golf zu spielen, hier sind wir:

Neue Version

do shell script "screencapture q.jpg"

Alte Version

tell application "System Events" to keystroke "#" using command down

Ich stelle mir vor, dass dies immer noch übertroffen wird, aber das ausführliche alte AppleScript macht eine bewundernswerte Nachahmung der Prägnanz für dieses.

Stoppen Sie Ihre quine

do shell script "screencapture -c"

3
Ich denke, dass ein Quine per Definition seinen Quellcode als einzige Ausgabe erzeugt, aber nicht sicher ist, ob dies auf diese Frage zutreffen sollte. nyx.net/~gthompso/quine.htm
duci9y

Ja, ich versuche tatsächlich herauszufinden, wie ich es dazu bringen kann, nur den Codebereich seines eigenen Fensters auszuwählen, aber ich dachte mir, ich würde dies tun, um meine Flagge in AppleScript-Gebiet zu platzieren.
Jonathan Van Matre

Ich betrachte dies als gültig und habe etwas in dieser Art erwartet.
Pureferret

Keine strenge Quine. (Erzeugt keinen eigenen Quellcode programmgesteuert.)
nitro2k01

3
Technisch gesehen kann keine dieser Sprachen eine strenge Formel sein, mit Ausnahme der Piet-Antwort, da keine dieser Sprachen Bilder als Quellcode verwendet. Aber ich bin immer noch entschlossen, eine strengere Version von mir zu machen. :)
Jonathan Van Matre

8

Mathematica, 83

SelectionMove[InputNotebook[],Previous,Cell];Rasterize@NotebookRead@SelectedCells[]

Bildbeschreibung hier eingeben


1
Keine strenge Quine. (Erzeugt keinen eigenen Quellcode programmgesteuert.)
nitro2k01

1
Funktioniert nicht ohne Frontend (in mathoder MathKernel), auch nicht mit <<JavaGraphics`importierten.
Ruslan

8

Sh, X & ImageMagick 18.9:

 import -window root a.jpg

Dies sollte in jeder Shell funktionieren, die ImageMagick enthält.

Wenn Sie nur den vorangestellten Code drucken möchten, wird clear &&dies unter 26.1 beschrieben

clear && import -window root a.jpg

Beispielausgabe:

Bildbeschreibung hier eingeben


Auf meinem Computer getestet, funktioniert es.
pastebin.com Schrägstrich 0mr8spkT

4
Funktionierte bei mir nicht auf der Linux-Konsole . Möglicherweise möchten Sie den Anforderungen ein X hinzufügen .
Ilmari Karonen

2
Keine strenge Quine. (Erzeugt keinen eigenen Quellcode programmgesteuert.)
nitro2k01

1
@nitro Ich habe möglicherweise den Begriff "Quine" missbraucht, aber in der ersten Zeile meines Posts wird nur die Ausgabe eines Bilds des Quellcodes erwähnt. Ich bearbeite jetzt, um meine ursprüngliche Absicht zu verdeutlichen und um echten / strengen Quines zu helfen.
Pureferret

1
Nur neugierig, ich sehe Bitcoin- und Litecoin-Brieftaschen; Es ist ungefähr 3 Jahre später, irgendwelche ernsthaften Gewinne? : D
Albert Renshaw

5

HTML5 / Javascript: 615

<canvas id='i' width=500 height=5000></canvas><script>function d(){var e=document.getElementById("i");var t=e.getContext("2d");t.font="20px Arial";var n=400;var r=25;var i=(e.width-n)/2;var s=60;str="<canvas id='i' width=5000 height=500></canvas>\n<script>"+d+"d();"+wrapText+"<\/script>";wrapText(t,str,i,s,n,r)}function wrapText(e,t,n,r,i,s){var o=t.split(" ");var u="";for(var a=0;a<o.length;a++){var f=u+o[a]+" ";var l=e.measureText(f);var c=l.width;if(c>i&&a>0){e.lineWidth=1;e.strokeStyle="blue";e.strokeText(u,n,r);u=o[a]+" ";r+=s}else{u=f}}e.lineWidth=1;e.strokeStyle="blue";e.strokeText(u,n,r)}d()</script>

Demo: http://jsfiddle.net/E2738/2/

Man kann mit der rechten Maustaste auf das Bild klicken und es als PNG speichern


2
es endet mit<//script>
Nicht, dass Charles

1
Am Ende von Zeile 11 in der Geige wechseln Sie +wrapText+"<//script>";zu+wrapText+"<\/script>";
Luke

@ Charles Danke für den Hinweis. Fest.
Clyde Lobo

4

Java, 570 - 10% - 15% = 427,5

("Dateipfad" enthalten), 554 - 10% - 15% = 415,5 ("Dateipfad" nicht enthalten)
Vielen Dank an Andreas für das Entfernen BufferedImageinjava.awt.image.BufferedImage

import java.awt.image.*;class Q{public static void main(String[]a)throws Exception{BufferedImage i=new BufferedImage(3500,12,1);String s="import java.awt.image.*;class Q{public static void main(String[]a)throws Exception{BufferedImage i=new BufferedImage(3500,12,1);String s=%s%s%s;char q=34;i.getGraphics().drawString(String.format(s,q,s,q,q,q,q,q),0,9);javax.imageio.ImageIO.write(i,%spng%s,new java.io.File(%sfilepath%s));}}";char q=34;i.getGraphics().drawString(String.format(s,q,s,q,q,q,q,q),0,9);javax.imageio.ImageIO.write(i,"png",new java.io.File("filepath"));}}

Ausgabe:Bildbeschreibung hier eingeben

Weitere Informationen finden Sie unter diesem Link: Anzeige finden Sie unter folgendem http://i.stack.imgur.com/RRSDw.png

Dies funktioniert genau wie ein normales Quine, abgesehen davon, dass es als Bild ausgegeben wird. Das aktuelle Format ist png, aber das Format kann leicht geändert werden, indem alle Instanzen von pngim Programm durch das gewünschte Format ersetzt werden.

Im Gegensatz zu ein paar Antworten hier ist dies eine echte Quine; kein lesen der programmdatei.


Sie können weitere 24 Zeichen loswerden, wenn Sie beide "java.awt.image.BufferedImage" durch "java.awt.image. *" ersetzen
Andreas

4

Javascript + JQuery 153 148

Regulär

(function f(){
  c=$('<canvas/>')[0];
  a=c.getContext('2d');
  l=('('+f+')()').split('\n');
  for(i=0;i<l.length;i++)
    a.fillText(l[i],5,12*(i+1));
  $('body').append('<img src="'
      +c.toDataURL("image/png")+'"/>')
})()
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Golf gespielt

function f(){c=$('<canvas>')[0];c.width=750;a=c.getContext('2d');a.fillText(f+'f()',5,9);$('body').append('<img src="'+c.toDataURL("png")+'"/>')}f()
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


1
Keine strenge Quine. (Erzeugt keinen eigenen Quellcode programmgesteuert.)
nitro2k01

$? Verwenden Sie auch jQuery?
Clyde Lobo

@ClydeLobo Yup, scheint er zu sein. Warten Sie, Sie können Javascript ohne JQuery tun? Wer hätte das gedacht!
Pierre Arlaud

@ ClydeLobo Ja, das bin ich. Bibliotheken sollten aber erlaubt sein. Es ist wirklich nicht anders als ein C-Programm mit stdio.hxD. Das Programm ohne jQuery zu schreiben ist jedoch einfach. Ersetzen Sie einfach $('<canvas/>')[0]mit document.createElement('canvas')und $('body').appendmit document.write. jQuery hat mir Bytes gerettet.
Aebabis

3

zsh, 57 × 0,9 = 51,3

Übergeben Sie den Ausgabedateinamen als Argument.

convert -annotate +0+10 "$(<$0)" -size 320x14 xc:white $1

Produziert:

Beispielausgabe


1
ist das zsh oder imagemagick?
Kaya

@ Kaya: Nun, beide. Die Sprache ist zsh (oder bash, aber nicht Posix) und die Bibliothek / das Tool ist ImageMagick (oder GraphicsMagick, wenn Sie es vorziehen) - wie PHP mit GD oder Ruby mit RMagick.
Ry

1
@ Pureferret: Hinzugefügt.
Ry

Keine strenge Quine. (Erzeugt keinen eigenen Quellcode programmgesteuert.)
nitro2k01

3

C99 (unter Verwendung von SDL & SDL_ttf), 414 354 346 - 15% = 294,1

#include<SDL_ttf.h>
#define Q(P)char*q=#P;P
Q(
i=5;main(){for(SDL_Surface*s=SDL_SetVideoMode(2048,80,SDL_Init(SDL_INIT_VIDEO),TTF_Init());i--;SDL_SaveBMP(s,"q.bmp"))SDL_BlitSurface(TTF_RenderText_Blended(TTF_OpenFont("q.ttf",9),(char*[]){"#include<SDL_ttf.h>","#define Q(P)char*q=#P;P","Q(",q,")"}[i],(SDL_Color){~0}),0,s,&(SDL_Rect){0,16*i});}
)

Das ist ziemlich hässlich ohne weitere Zeilenumbrüche, aber leider müssen sie fehlen. Die Text-Rendering-Funktion blockiert keine Steuerzeichen, sodass Zeilenumbrüche im Code in der Ausgabe manuell gerendert werden müssen.

Hier ist derselbe Code, jedoch mit einigen zusätzlichen Zeilenumbrüchen zur besseren Lesbarkeit:

#include<SDL_ttf.h>
#define Q(P)char*q=#P;P
Q(
i=5;main(){for(SDL_Surface*s=SDL_SetVideoMode(2048,80,
SDL_Init(SDL_INIT_VIDEO),TTF_Init());i--;SDL_SaveBMP(s,"q.bmp"))
SDL_BlitSurface(TTF_RenderText_Blended(TTF_OpenFont("q.ttf",9),
(char*[]){"#include<SDL_ttf.h>","#define Q(P)char*q=#P;P","Q(",q,")"}[i],
(SDL_Color){~0}),0,s,&(SDL_Rect){0,16*i});}
)

Leider werden der grafischen Ausgabe dadurch keine Zeilenumbrüche hinzugefügt:

Ausgabe

Die Ausgabe ist immer noch lesbar, aber mit 9-Punkt-Ausgabe und der roten Schriftfarbe ist es ein bisschen schärfer. Sie können es auf Kosten eines Charakters verbessern durch Ersetzen der 9mit12 . (Beachten Sie, dass die Abmessung des resultierenden Bildes auf 2048 x 80 fest codiert ist. Um den Unterschieden bei den verschiedenen Schriftarten Rechnung zu tragen, wurde am rechten Rand und am Zeilenabstand einiges an Übermaß hinzugefügt, sodass eine Schrift der Größe 12 immer noch bequem passen sollte Wenn Sie den Wert jedoch weiter erhöhen möchten, müssen wahrscheinlich auch die Abmessungen geändert werden.)

Der Befehl zum Erstellen des Programms lautet:

gcc -Wall -o imgquine imgquine.c -lSDL_ttf `sdl-config --cflags --libs`

Das Programm geht davon aus, dass sich q.ttfim aktuellen Verzeichnis eine Schriftdatei befindet, die beim Ausführen aufgerufen wird. Ich habe mich zuvor darum gekümmert, indem ich den folgenden Befehl ausgeführt habe (der auf den meisten modernen Linuxen funktionieren sollte):

ln -s `fc-match --format='%{file}' sans` ./q.ttf

(Sie können stattdessen auch Ihre eigene TrueType-Lieblingsschriftart importieren.)

Nach dem Ausführen des Programms wird die Bildausgabe im aktuellen Verzeichnis in einer Datei mit dem Namen erstellt q.bmp. Leider sind Windows-Bitmap-Dateien das einzige Ausgabeformat, das dieses Programm bietet. Das Hinzufügen weiterer Ausgabeformate würde das Verknüpfen weiterer Bibliotheken erfordern.

Beachten Sie, dass dieses Programm die Syntax von C99 nutzt, um nicht einfache Literalwerte einzufügen, wodurch die Anzahl der zu definierenden Variablen erheblich reduziert wird. Dies ist etwas, das mehr C-Golfer ausnutzen sollten.


2

C # - 498 - 15% = 423,3

Damit kann wohl mehr golfen werden. Ich habe noch nie Quines oder solche Grafiken in C # gemacht:

using System;using System.Drawing;class Q{static void Main(){var b = new Bitmap(3050, 20);var g=Graphics.FromImage(b);string f="using System;using System.Drawing;class Q{{static void Main(){{var b = new Bitmap(3050, 20);var g=Graphics.FromImage(b);string f={0}{1}{0},e={3}{0}{2}{0};g.DrawString(String.Format(f,(char)34,f,e,'@'),SystemFonts.MenuFont,Brushes.Black,0,0);b.Save(e);}}}}",e=@"D:\p.png";g.DrawString(String.Format(f,(char)34,f,e,'@'),SystemFonts.MenuFont,Brushes.Black,0,0);b.Save(e);}}

Ausgabe: Bildbeschreibung hier eingeben

Das Hinzufügen eines anderen Formats wäre einfach. Ich bin mir nicht sicher, ob es sich lohnt.


2

Ruby, 104 Zeichen

require "RMagick"
include Magick
Draw.new.annotate(i=Image.new(999,99),0,0,0,9,File.read($0))
i.display

Beispielausgabe auf Anfrage: i.imgur.com/jMC594C.png


Haben Sie eine Beispielausgabe?
Pureferret

@ Pureferret siehe Bearbeiten
Shelvacu

1
Keine strenge Quine. (Erzeugt keinen eigenen Quellcode programmgesteuert.)
nitro2k01

1

Python: 255 238 -10% -15% = 195,075 182,07

import sys,PIL.ImageDraw as D;i=D.Image.new('L',(2000,20));r="import sys,PIL.ImageDraw as D;i=D.Image.new('L',(2000,20));r=%r;D.Draw(i).text((0,0),r%%r,fill=255);i.save(sys.argv[1])";D.Draw(i).text((0,0),r%r,fill=255);i.save(sys.argv[1])

Verwendung:

python imgquine.py quine.jpg

Dies ist eine echte Quine, die die Ausgabe in die in der Befehlszeile angegebene Datei zeichnet. Das Dateiformat wird einfach durch Ändern der Dateinamenerweiterung eingestellt (z. B. quine.jpgfür ein JPEG und quine.pngfür ein PNG).

Beispielausgabe (2000x20 Bild):

Quine-Ausgabe


Sie können Zeichen sparen, indem Sie 2e3anstelle von verwenden 2000.
Kaya

@Kaya: Nein, ich kann leider nicht: 2e3ist ein floatund Image.newverlangt ints.
Nneonneo

Oh, ich nahm an, es würde erzwungen werden.
Kaya
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.