Sortie d'une image de votre code source (pas tout à fait une Quine)

29

Code golf: imprimer une image du code source.

Exigences

  1. Doit sortir l'image du code source lui-même, pas une version stockée ailleurs et récupérée au moment de l'exécution.
  2. Le code doit être suffisamment lisible pour être copié à la main et reproduire les résultats.

N'importe quel format d'image est applicable.

Bonus

  • -10% de votre score si vous autorisez plusieurs formats de sortie.
  • -15% si votre code est également un «vrai» quine. c'est-à-dire qu'il ne lit pas son code source mais le code source est intégré (voir ici pour un exemple)
  • -30% si votre code est un quine strict - c'est-à-dire que l'image du code est intégrée dans le programme (solutions Piet, je vous regarde.).
Pureferret
la source
Doit-il être lisible?
Tim Seguine
7
"Doit sortir l'image de code elle-même, pas une version stockée d'ailleurs." Est-il autorisé et / ou requis de lire le fichier de code source?
Tim Seguine
29
Je viens de mettre en place une solution en espace blanc. L'image résultante semble assez ennuyeuse.
Howard
7
Voici une image quine intéressante écrite en Piet: mamememo.blogspot.be/2009/10/piet-quine.html
ProgramFOX

Réponses:

25

coquille

Par "Imprimer une image du code source", je suppose que l'impression d'une image sur papier serait acceptable.

#!/bin/sh
lpr $0
Mark Plotnick
la source
21

Piet, 24399.76

entrez la description de l'image ici

Cela n'a pas été fait par moi.

Le gars avec le chapeau
la source
7
Pourriez-vous communauté wiki cette réponse? C'est devenu notre politique standard pour les réponses provenant de l'extérieur. C'est vraiment cool, cependant!
Jonathan Van Matre
@JonathanVanMatre Oups, désolé. Voilà ce que je voulais faire. Je suppose que je ne devrais pas essayer de répondre aux questions tout en participant à une autre discussion .
The Guy with The Hat
C'est le plus bas des deux. -30% et -15%
Pureferret
14

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

<?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");

Si les avertissements sont corrects: 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);

Vous fournissez la fonction de sortie à utiliser comme premier argument de ligne de commande:

php timwolla.php imagepng

Solution avec avertissements:

TimWolla
la source
5
Je pense que c'est le premier quine réel et pas seulement un script lit son propre code source, ou prend juste une capture d'écran de lui-même.
nitro2k01
Deux questions, pouvez-vous utiliser une notation différente pour vos décimales? C'est légèrement déroutant. Aussi pourquoi l'image est-elle si petite? C'est difficile à lire (certes je suis sur mon téléphone)
Pureferret
2
@Pureferret suffit de l'agrandir. Il est en fait assez lisible malgré sa pixelisation.
Ruslan
1
@Pureferret Je viens de les changer, je ne me souviens pas que c'était différent en anglais…
TimWolla
13

Espace, 125



















Génère un fichier image au format pbm .

Si vous testez ce code, veuillez le copier en cliquant sur "Modifier" et en copiant tout entre les <pre>balises.

Sortie:

P1 1 1 0
duci9y
la source
7
copies à la main, plissant les yeux à l'écran pour voir les différences subtiles entre les espaces et les tabulations .... exécute le programme .... le disque dur explose
Jonathan Van Matre
17
Cette réponse ne répond pas à l'exigence 2. L'image n'est pas suffisamment lisible pour reproduire le code source.
user2357112 prend en charge Monica
2
@ user2357112 Mais vous ne pouvez pas le prouver. C'est l'échappatoire que j'exploite ici.
duci9y
21
Oui, je peux, en utilisant la théorie de l'information. Une justification entièrement rigoureuse serait au-delà de la portée d'un commentaire de 600 caractères, mais l'essentiel est que votre image est identique à une image de code qui ne fonctionne pas.
user2357112 prend en charge Monica
3
Pardonnez les Français, mais BS! Les règles stipulent que le code doit être lisible. L'écriture de code dans un espace blanc ne nie pas cela. Voici votre programme affiché dans Sublime Text, lorsqu'il est sélectionné: i.imgur.com/A2ZaQwI.png Ceci est lisible. Quels que soient les résultats de votre programme, ce n'est pas le cas. Et d'ailleurs, vous n'avez pas expliqué si ce que votre programme produit est réellement votre code source ou simplement une image vide.
nitro2k01
13

Mathematica, 37 31 caractères

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

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

entrez la description de l'image ici

Inspiré d' une réponse dans mathematica.stackexchange.com .

alephalpha
la source
Expliquez-le ... à quoi servent les #n? Peut-être que nous pouvons le découvrir.
Pureferret
Au moins, cela fonctionne sans FrontEnd. (Essayé Export["/tmp/out.png",%]après avoir exécuté cette commande)
Ruslan
2
@Pureferret #nsignifie l' nargument d'une fonction pure (créée au &point). L'expression entière se développe en Rasterize[Defer[#0[Defer,Rasterize]]], où #0est l'appel récursif de la fonction pure d'origine. D'une certaine manière, ce n'est pas un quine strict, mais il n'a besoin d'aucune interface pour fonctionner, et l'OMI est une bonne solution.
Ruslan
J'admire l'utilisation de Defer [] et Rasterize [] à la fois comme commandes et comme objet des commandes. Je n'ai jamais vu de récursion présentée de cette façon auparavant.
Michael Stern
10

AppleScript, 68 37

D'accord, si vous pouvez appeler ImageMagick en zsh, cela est également valide. Je suis toujours en train de pirater quelque chose de plus élégant et d'esprit quine pour ma propre satisfaction, mais pour le golfe pur, nous voici:

Nouvelle version

do shell script "screencapture q.jpg"

Ancienne version

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

J'imagine que ce sera toujours battu, mais le vieux AppleScript verbeux fait une admirable imitation de concision pour celui-ci.

arrêtez votre quine

do shell script "screencapture -c"
Jonathan Van Matre
la source
3
Je pense qu'un quine, par définition, produit son code source comme sa seule sortie, mais je ne sais pas si cela devrait s'appliquer à cette question. nyx.net/~gthompso/quine.htm
duci9y
Oui, j'essaie en fait de comprendre comment l'obtenir pour sélectionner uniquement la zone de code de sa propre fenêtre, mais j'ai pensé que j'irais de l'avant et lancerais cela pour planter mon drapeau dans le territoire AppleScript.
Jonathan Van Matre
Je considère cela comme valide et je m'attendais à quelque chose de ce genre.
Pureferret
Pas une quine stricte. (Ne génère pas par programme son propre code source.)
nitro2k01
3
Techniquement, aucun de ceux-ci ne peut être une quines stricte à l'exception de la réponse Piet, car aucun de ces langages ne prend des images comme code source. Mais je suis toujours déterminé à faire une version plus stricte de la mienne. :)
Jonathan Van Matre
8

Mathematica, 83

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

entrez la description de l'image ici

chuy
la source
1
Pas une quine stricte. (Ne génère pas par programme son propre code source.)
nitro2k01
1
Ne fonctionne pas sans interface (dans mathou MathKernel), même avec <<JavaGraphics`importé.
Ruslan
8

Sh, X et ImageMagick 18.9:

 import -window root a.jpg

Cela devrait fonctionner dans n'importe quel shell doté d'ImageMagick.

Pour imprimer uniquement le code pré clear &&- ajouté, cela revient à 26,1

clear && import -window root a.jpg

Exemple de sortie:

entrez la description de l'image ici

Pureferret
la source
Testé sur mon ordinateur, ça marche.
user12205
4
N'a pas fonctionné pour moi sur la console Linux . Vous voudrez peut-être ajouter X aux exigences.
Ilmari Karonen
2
Pas une quine stricte. (Ne génère pas par programme son propre code source.)
nitro2k01
1
@nitro J'ai peut-être mal utilisé le terme 'Quine' mais la première ligne de mon article mentionne uniquement la sortie d'une image du code source. J'édite maintenant pour clarifier mon intention d'origine, et aussi pour bénéficier de quines vrais / stricts.
Pureferret
1
Juste curieux, je vois des portefeuilles bitcoin et litecoin; C'est ~ 3 ans plus tard maintenant, des gains sérieux? : 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>

Démo: http://jsfiddle.net/E2738/2/

On peut faire un clic droit sur l'image et l'enregistrer au format PNG

Clyde Lobo
la source
2
ça se termine par<//script>
Pas que Charles
1
à la fin de la ligne 11 dans le violon changer +wrapText+"<//script>";pour+wrapText+"<\/script>";
Luke
@Charles Merci d'avoir signalé cela. Fixé.
Clyde Lobo
4

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

( "filepath" inclus) 554 - 10% - 15% = 415,5 ( "filepath" non inclus)
Merci à Andreas pour enlever BufferedImageenjava.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"));}}

Sortie:entrez la description de l'image ici

Pour afficher correctement, consultez ce lien: http://i.stack.imgur.com/RRSDw.png

Cela fonctionne exactement comme un quine normal, sauf qu'il génère une image. Le format actuel est png, mais le format peut facilement être changé en remplaçant toutes les instances de pngdans le programme par le format que vous voulez.

Contrairement à quelques réponses ici, c'est une vraie quine; pas de lecture du fichier programme.

Justin
la source
vous pouvez vous débarrasser de 24 autres caractères si vous remplacez les deux "java.awt.image.BufferedImage" par "java.awt.image. *"
Andreas
4

Javascript + JQuery 153 148

Ordinaire

(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é

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>

aebabis
la source
1
Pas une quine stricte. (Ne génère pas par programme son propre code source.)
nitro2k01
$? utilisez-vous également jQuery ??
Clyde Lobo
@ClydeLobo Yup, semble-t-il. Attendez, vous pouvez faire Javascript sans JQuery? Qui aurait pensé!
Pierre Arlaud
@ClydeLobo Oui, je le suis. Mais les bibliothèques devraient être autorisées. Ce n'est vraiment pas différent d'un programme C utilisant stdio.hxD. L'écriture du programme sans jQuery est cependant facile. Remplacez simplement $('<canvas/>')[0]par document.createElement('canvas')et $('body').appendpar document.write. jQuery m'a sauvé des octets.
aebabis
3

zsh, 57 × 0,9 = 51,3

Passez-lui le nom du fichier de sortie comme argument.

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

Produit:

Exemple de sortie

Ry-
la source
1
est-ce zsh ou imagemagick?
Kaya
@Kaya: Eh bien, les deux. Le langage est zsh (ou bash, mais ce n'est pas Posix), et la bibliothèque / l'outil est ImageMagick (ou GraphicsMagick, si vous préférez) - comme PHP avec GD ou Ruby avec RMagick.
Ry-
1
@Pureferret: ajouté.
Ry-
Pas une quine stricte. (Ne génère pas par programme son propre code source.)
nitro2k01
3

C99 ( en utilisant 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});}
)

C'est assez moche sans plus de sauts de ligne, mais malheureusement, ils doivent être absents. La fonction de rendu de texte ne bloque pas du tout les caractères de contrôle, donc tout saut de ligne dans le code doit être rendu manuellement dans la sortie.

Voici le même code mais avec quelques sauts de ligne supplémentaires pour plus de lisibilité:

#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});}
)

Malheureusement, cela n'ajoute pas non plus de sauts de ligne à la sortie graphique:

sortie

La sortie est toujours lisible, mais avec une sortie à 9 points et la couleur de police rouge, c'est un peu loufoque. Vous pouvez l'améliorer au détriment d'un personnage en remplaçant le 9par 12. (Notez que la dimension de l'image résultante est codée en dur à 2048x80. Pour tenir compte des différences dans les différentes polices, un peu d'excès a été ajouté à la marge de droite et à l'interlignage, suffisamment pour qu'une police de taille 12 soit toujours confortable. Cependant, si vous souhaitez l'augmenter encore, les dimensions devront probablement être également modifiées.)

La commande pour construire le programme est:

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

Le programme suppose qu'il existe un fichier de police appelé q.ttfdans le répertoire en cours lors de l'exécution. J'ai pris soin de cela au préalable en exécutant la commande suivante (qui devrait fonctionner sur la plupart des Linux modernes):

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

(N'hésitez pas à importer votre propre police TrueType préférée à la place.)

Après avoir exécuté le programme, la sortie d'image sera créée dans le répertoire courant, dans un fichier nommé q.bmp. Malheureusement, les fichiers bitmap Windows sont le seul format de sortie fourni par ce programme. L'ajout de formats de sortie supplémentaires nécessiterait une liaison dans davantage de bibliothèques.

Notez que ce programme tire parti de la syntaxe de C99 pour introduire des valeurs littérales non simples, réduisant ainsi considérablement le nombre de variables à définir. C'est quelque chose dont plus de golfeurs C devraient profiter.

boite à pain
la source
2

C # - 498 - 15% = 423,3

Cela peut probablement être joué plus. Je n'ai jamais fait de quines ou ce genre de graphiques en C # auparavant:

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);}}

Sortie: entrez la description de l'image ici

L'ajout d'un support de format différent serait facile. Je ne sais pas si ça vaut le coup, cependant.

Ray Poward
la source
2

Ruby, 104 caractères

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

Exemple de sortie, par demande: i.imgur.com/jMC594C.png

Shelvacu
la source
Avez-vous un exemple de sortie?
Pureferret
@Pureferret voir l'édition
Shelvacu
1
Pas une quine stricte. (Ne génère pas par programme son propre code source.)
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])

Usage:

python imgquine.py quine.jpg

Il s'agit d'un vrai quine qui dessine la sortie dans le fichier spécifié sur la ligne de commande. Le format de fichier est défini simplement en changeant l'extension du nom de fichier (par exemple quine.jpgpour un JPEG et quine.pngpour un PNG).

Exemple de sortie (image 2000x20):

Sortie Quine

nneonneo
la source
Vous pouvez enregistrer certains caractères en utilisant 2e3au lieu de 2000.
Kaya
@Kaya: Non, je ne peux pas, malheureusement: 2e3est un float, et Image.newexige l' intart.
nneonneo
oh dérange, je pensais que ce serait contraint.
Kaya