Imprime una imagen de tu código fuente (no es un Quine)


29

Golf de código: imprima una imagen del código fuente.

Requisitos

  1. Debe generar la imagen del código fuente en sí, no una versión almacenada en otro lugar y recuperada en tiempo de ejecución.
  2. El código debe ser lo suficientemente legible como para copiarlo a mano y reproducir los resultados.

Cualquier formato de imagen es aplicable.

Bonos

  • -10% de su puntaje si permite más de un formato de salida.
  • -15% si su código también es una quine 'verdadera'. es decir, no lee su código fuente pero el código fuente está incrustado (vea aquí un ejemplo)
  • -30% si su código es una cantidad estricta, es decir, la imagen del código está incrustada en el programa (soluciones Piet, lo estoy mirando).

¿Tiene que ser legible?
Tim Seguine

77
"Debe generar la imagen del código en sí, no una versión almacenada de otro lugar". ¿Está permitido y / o requerido leer el archivo de código fuente?
Tim Seguine

29
Acabo de implementar una solución en espacios en blanco. La imagen resultante se ve bastante aburrida.
Howard

77
Aquí hay una imagen interesante escrita en Piet: mamememo.blogspot.be/2009/10/piet-quine.html
ProgramFOX

Respuestas:


25

cáscara

Al "Imprimir una imagen del código fuente", supongo que imprimir una imagen en papel sería aceptable.

#!/bin/sh
lpr $0

21

77
¿Podría la comunidad wiki esta respuesta? Esa se ha convertido en nuestra política estándar para respuestas de fuentes externas. ¡Esto es realmente genial!
Jonathan Van Matre

@JonathanVanMatre Vaya, lo siento. Eso es lo que quise hacer. Supongo que no debería tratar de responder preguntas mientras participo en otra discusión .
The Guy with The Hat

Es el más bajo de los dos. -30% y -15%
Pureferret

14

PHP - 487 × 0.9 × 0.85 = 372.555 (2000 × 99px)

<?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 las advertencias están bien: 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);

Proporciona la función de salida para usar como el primer argumento de línea de comando:

php timwolla.php imagepng

Solución con advertencias:


55
Creo que esta es la primera quine real y no solo un script lee su propio código fuente, o simplemente toma una captura de pantalla de sí mismo.
nitro2k01

Dos preguntas, ¿puedes usar una notación diferente para tus decimales? Es un poco confuso. Además, ¿por qué la imagen es tan pequeña? Es difícil de leer (ciertamente estoy en mi teléfono)
Pureferret

2
@Pureferret solo lo acerca. En realidad, es bastante legible a pesar de estar pixelado.
Ruslan

1
@Pureferret Acabo de cambiarlos, nunca recuerdo que fuera diferente en inglés ...
TimWolla

13

Espacio en blanco, 125



















Emite un archivo de imagen en formato pbm .

Si está probando este código, cópielo haciendo clic en "Editar" y copiando todo entre las <pre>etiquetas.

Salida:

P1 1 1 0

77
copias a mano, entrecerrando los ojos en la pantalla para ver diferencias sutiles entre espacios y pestañas ... ejecuta el programa ... explota el disco duro
Jonathan Van Matre

17
Esta respuesta no cumple con el requisito 2. La imagen no es lo suficientemente legible como para reproducir el código fuente.
user2357112 es compatible con Monica

2
@ user2357112 Pero no puedes probar eso. Esa es la escapatoria que estoy explotando aquí.
duci9y

21
Sí puedo, usando la teoría de la información. Una justificación completamente rigurosa estaría más allá del alcance de un comentario de 600 caracteres, pero lo esencial es que su imagen es idéntica a una imagen de código que no funciona.
user2357112 es compatible con Monica

3
Perdón por los franceses, pero BS! Las reglas establecen que el código debe ser legible. Escribir código en espacios en blanco no niega eso. Este es su programa que se muestra en Sublime Text, cuando se selecciona: i.imgur.com/A2ZaQwI.png Esto es legible. Lo que sea que salga de su programa no lo es. Además, no ha explicado si lo que genera su programa es en realidad su código fuente o simplemente una imagen vacía.
nitro2k01

13

Mathematica, 37 31 caracteres

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

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

ingrese la descripción de la imagen aquí

Inspirado por una respuesta en Mathica.stackexchange.com .


Explícalo ... ¿para qué son los #n? Tal vez podamos resolverlo.
Pureferret

Al menos funciona sin FrontEnd. (Probado Export["/tmp/out.png",%]después de ejecutar este comando)
Ruslan

2
@Pureferret #nsignifica el nargumento de una función pura (creada en el &punto). Toda la expresión se expande a Rasterize[Defer[#0[Defer,Rasterize]]], donde #0es llamada recursiva de la función pura original. En cierto modo, esta no es una cuestión estricta, pero no necesita ninguna interfaz para funcionar, y es una buena solución para IMO.
Ruslan

Admiro el uso de Defer [] y Rasterize [] como comandos y como objeto de los comandos. Nunca antes había visto una recursión así.
Michael Stern

10

AppleScript, 68 37

Bien, si puedes llamar a ImageMagick en zsh, entonces esto también es válido. Todavía estoy pirateando algo más elegante y del espíritu quine para mi propia satisfacción, pero por puro golfismo, aquí estamos:

Nueva versión

do shell script "screencapture q.jpg"

Versión antigua

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

Me imagino que esto aún será superado, pero el antiguo AppleScript detallado hace una imitación admirable de concisión para este.

deja tu quine

do shell script "screencapture -c"

3
Creo que una quine, por definición, produce su código fuente como su única salida, pero no estoy seguro de si eso debería aplicarse a esta pregunta. nyx.net/~gthompso/quine.htm
duci9y

Sí, en realidad estoy tratando de descubrir cómo hacer que seleccione solo el área de código de su propia ventana, pero pensé en seguir adelante y tirar esto para plantar mi bandera en territorio AppleScript.
Jonathan Van Matre

Estoy considerando esto como válido y esperaba algo de este tipo.
Pureferret

No es una quine estricta. (No genera programáticamente su propio código fuente).
nitro2k01

3
Técnicamente, ninguno de estos puede ser una cita estricta, excepto la respuesta de Piet, porque ninguno de estos idiomas toma imágenes como código fuente. Pero todavía estoy decidido a hacer una versión más estricta de la mía. :)
Jonathan Van Matre

8

Mathematica, 83

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

ingrese la descripción de la imagen aquí


1
No es una quine estricta. (No genera programáticamente su propio código fuente).
nitro2k01

1
No funciona sin frontend (en matho MathKernel), incluso con <<JavaGraphics`importados.
Ruslan

8

Sh, X e ImageMagick 18.9:

 import -window root a.jpg

Esto debería funcionar en cualquier shell que tenga ImageMagick.

Para imprimir solo el prefijo del código, clear &&esto aparece en 26.1

clear && import -window root a.jpg

Salida de muestra:

ingrese la descripción de la imagen aquí


Probado en mi computadora, funciona.
user12205

44
No funcionó para mí en la consola de Linux . Es posible que desee agregar X a los requisitos.
Ilmari Karonen

2
No es una quine estricta. (No genera programáticamente su propio código fuente).
nitro2k01

1
@nitro Puede que haya usado mal el término 'Quine', pero la primera línea de mi publicación solo menciona la salida de una imagen del código fuente. Estoy editando ahora para aclarar mi intención original y también para beneficiar las cotas verdaderas / estrictas.
Pureferret

1
Por curiosidad, veo billeteras bitcoin y litecoin; Es ~ 3 años más tarde ahora, ¿hay ganancias serias? : 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>

Demostración: http://jsfiddle.net/E2738/2/

Uno puede hacer clic derecho en la imagen y guardarla como PNG


2
termina con<//script>
No es que Charles

1
al final de la línea 11 en el cambio de violín +wrapText+"<//script>";a+wrapText+"<\/script>";
Luke

@ Charles Gracias por señalar eso. Fijo.
Clyde Lobo

4

Java, 570 - 10% - 15% = 427.5

( "ruta de archivo" incluido) 554 - 10% - 15% = 415,5 ( "ruta de archivo" no incluido)
Gracias a Andreas para retirar 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"));}}

Salida:ingrese la descripción de la imagen aquí

Para ver correctamente, vea este enlace: http://i.stack.imgur.com/RRSDw.png

Esto funciona igual que una quine normal, excepto que da salida a una imagen. El formato actual es png, pero el formato se puede cambiar fácilmente reemplazando todas las instancias del pngprograma con el formato que desee.

A diferencia de algunas respuestas aquí, esta es una verdadera quine; sin lectura del archivo del programa.


puede deshacerse de otros 24 caracteres si reemplaza ambos "java.awt.image.BufferedImage" por "java.awt.image. *"
Andreas

4

Javascript jQuery + 153 148

Regular

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

Golfed

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
No es una quine estricta. (No genera programáticamente su propio código fuente).
nitro2k01

$? ¿estás usando jQuery también?
Clyde Lobo

@ClydeLobo Sí, parece que lo es. Espera, ¿puedes hacer Javascript sin JQuery? ¡Quién lo hubiera pensado!
Pierre Arlaud

@ClydeLobo Sí, lo estoy. Pero las bibliotecas deberían estar permitidas. Realmente no es diferente de un programa en C que usa stdio.hxD. Sin embargo, escribir el programa sin jQuery es fácil. Simplemente reemplace $('<canvas/>')[0]con document.createElement('canvas')y $('body').appendcon document.write. jQuery me ahorró bytes.
aebabis

3

zsh, 57 × 0.9 = 51.3

Pásalo como nombre de archivo de salida como argumento.

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

Produce:

Salida de ejemplo


1
¿Es eso zsh o imagemagick?
Kaya

@Kaya: Bueno, ambos. El lenguaje es zsh (o bash, pero no es Posix), y la biblioteca / herramienta es ImageMagick (o GraphicsMagick, si lo prefiere), como PHP con GD o Ruby con RMagick.
Ry-

1
@Pureferret: agregado.
Ry-

No es una quine estricta. (No genera programáticamente su propio código fuente).
nitro2k01

3

C99 (usando SDL y SDL_ttf), 414 354 346 - 15% de = 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});}
)

Esto es bastante feo sin más saltos de línea, pero desafortunadamente necesitan estar ausentes. La función de representación de texto no incluye caracteres de control, por lo que cualquier salto de línea en el código debe representarse manualmente en la salida.

Aquí está el mismo código, pero con algunos saltos de línea adicionales para mayor legibilidad:

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

Lamentablemente, esto tampoco agrega saltos de línea a la salida gráfica:

salida

La salida sigue siendo legible, aunque con una salida de 9 puntos y el color de fuente rojo, es un poco entrecortada. Puedes mejorarlo a costa de un personaje reemplazando el 9con 12. (Tenga en cuenta que la dimensión de la imagen resultante está codificada a 2048x80. Para acomodar las diferencias en varias fuentes, se ha agregado un poco de exceso al margen derecho y al inicio, lo suficiente como para que una fuente de tamaño 12 aún se ajuste cómodamente Sin embargo, si desea aumentarlo aún más, es probable que también sea necesario modificar las dimensiones).

El comando para construir el programa es:

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

El programa asume que hay un archivo de fuente llamado q.ttfen el directorio actual cuando se ejecuta. Me ocupé de esto de antemano ejecutando el siguiente comando (que debería funcionar en la mayoría de los Linux modernos):

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

(No dude en importar su propia fuente TrueType favorita).

Después de ejecutar el programa, la salida de la imagen se creará en el directorio actual, en un archivo llamado q.bmp. Lamentablemente, los archivos de mapa de bits de Windows son el único formato de salida que proporciona este programa. Agregar más formatos de salida requeriría vincular en más bibliotecas.

Tenga en cuenta que este programa aprovecha la sintaxis de C99 para introducir valores literales no simples, reduciendo así significativamente el número de variables que deben definirse. Esto es algo que más golfistas C deberían aprovechar.


2

C # - 498 - 15% = 423.3

Esto probablemente se puede jugar más al golf. Nunca he hecho quines o este tipo de gráficos en C # antes:

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

Salida: ingrese la descripción de la imagen aquí

Agregar un soporte de formato diferente sería fácil. Sin embargo, no estoy seguro de si vale la pena.


2

Ruby, 104 caracteres

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

Ejemplo de salida, por solicitud: i.imgur.com/jMC594C.png


¿Tienes un ejemplo de salida?
Pureferret

@Pureferret ver edición
Shelvacu

1
No es una quine estricta. (No genera programáticamente su propio código fuente).
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])

Uso:

python imgquine.py quine.jpg

Esta es una verdadera quine que dibuja el resultado en el archivo especificado en la línea de comandos. El formato de archivo se establece simplemente cambiando la extensión del nombre de archivo (por ejemplo, quine.jpgpara un JPEG y quine.pngpara un PNG).

Ejemplo de salida (imagen 2000x20):

Salida de Quine


Puede guardar algunos caracteres utilizando en 2e3lugar de 2000.
Kaya

@Kaya: No, no puedo, desafortunadamente: 2e3es una floaty Image.newexige ints.
nneonneo

Oh, molesta, supuse que sería forzado.
Kaya
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.