Stampa un'immagine del tuo codice sorgente (non abbastanza-a-Quine)


29

Codice golf: stampa un'immagine del codice sorgente.

Requisiti

  1. Deve produrre l'immagine del codice sorgente stesso, non una versione memorizzata altrove e recuperata in fase di esecuzione.
  2. Il codice deve essere abbastanza leggibile per essere copiato a mano e riprodurre i risultati.

È applicabile qualsiasi formato di immagine.

bonus

  • -10% del tuo punteggio se consenti più di un formato di output.
  • -15% se il codice è anche un 'vero' Quine. cioè non legge il suo codice sorgente ma il codice sorgente è incorporato (vedi qui per un esempio)
  • -30% se il tuo codice è un quine rigoroso, ovvero l'immagine del codice è incorporata nel programma (soluzioni Piet, ti sto guardando.).

Deve essere leggibile?
Tim Seguine,

7
"Deve generare l'immagine del codice stesso, non una versione memorizzata da altrove." È consentito e / o richiesto leggere il file del codice sorgente?
Tim Seguine,

29
Ho appena implementato una soluzione negli spazi bianchi. L'immagine risultante sembra piuttosto noiosa.
Howard,

7
Ecco un'interessante quine di immagini scritta in Piet: mamememo.blogspot.be/2009/10/piet-quine.html
ProgramFOX

Risposte:


25

conchiglia

Con "Stampa un'immagine del codice sorgente", suppongo che la stampa di un'immagine su carta sarebbe accettabile.

#!/bin/sh
lpr $0

21

7
Potresti comunità wiki questa risposta? Questa è diventata la nostra politica standard per le risposte esterne. Questo è davvero fantastico, però!
Jonathan Van Matre,

@JonathanVanMatre Whoops, mi dispiace. Questo è quello che intendevo fare. Immagino che non dovrei provare a rispondere alle domande mentre partecipo a un'altra discussione .
The Guy with The Hat

È il più basso dei due. -30% e -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");

Se gli avvisi vanno bene: 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);

Fornisci la funzione di output da utilizzare come primo argomento della riga di comando:

php timwolla.php imagepng

Soluzione con avvertenze:


5
Penso che questo sia il primo quine effettivo e non solo uno script legge il proprio codice sorgente, o prende semplicemente uno screenshot di se stesso.
nitro2k01

Due domande, puoi usare una notazione diversa per i tuoi decimali? È leggermente confuso. Inoltre, perché l'immagine è così piccola? È difficile da leggere (devo ammettere che sono al telefono)
Pureferret

2
@Pureferret basta ingrandirlo. In realtà è abbastanza leggibile nonostante sia pixelizzato.
Ruslan,

1
@Pureferret Li ho appena cambiati, non ricordo mai che sia diverso in inglese ...
TimWolla

13

Spazio bianco, 125



















Emette un file di immagine nel formato pbm .

Se stai testando questo codice, copialo facendo clic su "Modifica" e copiando tutto tra i <pre>tag.

Produzione:

P1 1 1 0

7
copie a mano, socchiudendo gli occhi sullo schermo per vedere sottili differenze tra spazi e schede .... esegue il programma .... esplode il disco rigido
Jonathan Van Matre

17
Questa risposta non soddisfa il requisito 2. L'immagine non è abbastanza leggibile per riprodurre il codice sorgente.
user2357112 supporta Monica

2
@ user2357112 Ma non puoi provarlo. Questa è la scappatoia che sto sfruttando qui.
duci9y,

21
Sì, posso, usando la teoria dell'informazione. Una giustificazione pienamente rigorosa andrebbe oltre lo scopo di un commento di 600 caratteri, ma l'essenza di ciò è che la tua immagine è identica a un'immagine di codice che non funziona.
user2357112 supporta Monica

3
Perdonate il francese, ma BS! Le regole stabiliscono che il codice deve essere leggibile. Scrivere codice in Whitespace non lo nega. Questo è il programma mostrato in Sublime Text, quando selezionato: i.imgur.com/A2ZaQwI.png Questo è leggibile. Qualunque sia il risultato del tuo programma non lo è. Inoltre, non hai spiegato se l'output del tuo programma è in realtà il tuo codice sorgente o semplicemente un'immagine vuota.
nitro2k01

13

Mathematica, 37 31 caratteri

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

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

inserisci qui la descrizione dell'immagine

Ispirato da una risposta in mathematica.stackexchange.com .


Spiegalo ... a cosa servono i #n? Forse possiamo capirlo.
Pureferret

Almeno funziona senza FrontEnd. (Provato Export["/tmp/out.png",%]dopo aver eseguito questo comando)
Ruslan

2
@Pureferret #nsignifica nl'argomento di una funzione pura (creata nel &punto). L'intera espressione si espande a Rasterize[Defer[#0[Defer,Rasterize]]], dove #0è la chiamata ricorsiva della funzione pura originale. In un certo senso, questa non è una questione rigorosa, ma non ha bisogno di alcun frontend per funzionare, ed è IMO una buona soluzione.
Ruslan,

Ammiro l'uso di Defer [] e Rasterize [] sia come comandi che come oggetto dei comandi. Non ho mai visto la ricorsione presentata in questo modo prima.
Michael Stern,

10

AppleScript, 68 37

Bene, se puoi chiamare ImageMagick in zsh, anche questo è valido. Sto ancora hackerando qualcosa di più elegante e di spirito per la mia soddisfazione, ma per pura golfismo, eccoci qui:

Nuova versione

do shell script "screencapture q.jpg"

Vecchia versione

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

Immagino che questo sarà ancora battuto, ma la vecchia AppleScript dettagliata fa un'ammirevole imitazione di succinta per questo.

ferma la tua quine

do shell script "screencapture -c"

3
Penso che un quine, per definizione, produca il suo codice sorgente come unico output, ma non sono sicuro che si debba applicare a questa domanda. nyx.net/~gthompso/quine.htm
duci9y

Sì, in realtà sto cercando di capire come ottenerlo per selezionare solo l'area del codice della sua finestra, ma ho pensato di andare avanti e lanciarlo per piantare la mia bandiera nel territorio AppleScript.
Jonathan Van Matre,

Lo considero valido e mi aspettavo qualcosa del genere.
Pureferret,

Non un rigore. (Non genera a livello di codice il proprio codice sorgente.)
nitro2k01

3
Tecnicamente, nessuna di queste può essere stringhe rigorose tranne la risposta di Piet, poiché nessuna di queste lingue prende le immagini come codice sorgente. Ma sono ancora determinato a creare una mia versione più rigorosa. :)
Jonathan Van Matre,

8

Mathematica, 83

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

inserisci qui la descrizione dell'immagine


1
Non un rigore. (Non genera a livello di codice il proprio codice sorgente.)
nitro2k01

1
Non funziona senza frontend (in matho MathKernel), anche con <<JavaGraphics`importati.
Ruslan

8

Sh, X e ImageMagick 18.9:

 import -window root a.jpg

Questo dovrebbe funzionare in qualsiasi shell che abbia ImageMagick.

Per stampare solo il codice anteposto, clear &&questo viene visualizzato in 26.1

clear && import -window root a.jpg

Uscita campione:

inserisci qui la descrizione dell'immagine


Testato sul mio computer, funziona.
user12205

4
Non ha funzionato per me sulla console Linux . Potresti voler aggiungere X ai requisiti.
Ilmari Karonen,

2
Non un rigore. (Non genera a livello di codice il proprio codice sorgente.)
nitro2k01

1
@nitro Potrei aver abusato del termine "Quine", ma la prima riga del mio post menziona solo l'output di un'immagine del codice sorgente. Sto modificando ora per chiarire il mio intento originale e anche per beneficiare di quines vere / rigorose.
Pureferret,

1
Solo curioso, vedo i portafogli bitcoin e litecoin; Sono passati ~ 3 anni dopo, qualche guadagno serio? : 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/

Si può fare clic con il tasto destro sull'immagine e salvarla come PNG


2
termina con<//script>
Non che Charles

1
alla fine della linea 11 nel violino cambia +wrapText+"<//script>";in+wrapText+"<\/script>";
Luca

@Charles Grazie per averlo sottolineato. Fisso.
Clyde Lobo

4

Java, 570 - 10% - 15% = 427.5

( "percorsofile" incluso), 554-10% - 15% = 415,5 ( "filepath" non incluso)
Grazie ad Andreas per la rimozione 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"));}}

Produzione:inserisci qui la descrizione dell'immagine

Per visualizzare correttamente, vedere questo link: http://i.stack.imgur.com/RRSDw.png

Funziona proprio come un normale quine, tranne per l'output su un'immagine. Il formato corrente è png, ma il formato può essere facilmente modificato sostituendo tutte le istanze del pngprogramma con qualsiasi formato desiderato.

A differenza di alcune risposte qui, questo è un vero quine; nessuna lettura del file di programma.


puoi sbarazzarti di altri 24 caratteri se sostituisci entrambi "java.awt.image.BufferedImage" con "java.awt.image. *"
Andreas

4

Javascript + JQuery 153 148

Regolare

(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
Non un rigore. (Non genera a livello di codice il proprio codice sorgente.)
nitro2k01

$? stai usando anche jQuery ??
Clyde Lobo

@ClydeLobo Sì, sembra che lo sia. Aspetta, puoi fare Javascript senza JQuery? Chi avrebbe mai pensato!
Pierre Arlaud,

@ClydeLobo Sì, lo sono. Ma le biblioteche dovrebbero essere consentite. Non è davvero diverso da un programma C che usa stdio.hxD. Scrivere il programma senza jQuery è comunque semplice. Basta sostituire $('<canvas/>')[0]con document.createElement('canvas')e $('body').appendcon document.write. jQuery mi ha salvato byte.
aebabis

3

zsh, 57 × 0.9 = 51.3

Passa il nome del file di output come argomento.

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

produce:

Esempio di output


1
è quello zsh o imagemagick?
Kaya

@Kaya: Bene, entrambi. Il linguaggio è zsh (o bash, ma non è Posix) e la libreria / strumento è ImageMagick (o GraphicsMagick, se preferisci) - come PHP con GD o Ruby con RMagick.
Ry,

1
@Pureferret: aggiunto.
Ry,

Non un rigore. (Non genera a livello di codice il proprio codice sorgente.)
nitro2k01

3

C99 (utilizzando SDL e 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});}
)

Questo è piuttosto brutto senza più interruzioni di riga, ma purtroppo devono essere assenti. La funzione di rendering del testo non controlla affatto i caratteri di controllo, quindi qualsiasi interruzione di riga nel codice deve essere renderizzata manualmente nell'output.

Ecco lo stesso codice ma con alcune interruzioni di riga in più per la leggibilità:

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

Purtroppo, questo non aggiunge anche interruzioni di linea all'output grafico:

produzione

L'output è ancora leggibile, anche se con un output a 9 punti e il colore del carattere rosso, è un po 'squilibrato. Puoi migliorarlo al costo di un personaggio sostituendo il 9con 12. (Si noti che la dimensione dell'immagine risultante è hardcoded a 2048x80. Per compensare le differenze nei vari tipi di carattere, è stato aggiunto un bel po 'di eccesso al margine destro e all'inizio, abbastanza in modo che un carattere di dimensione 12 dovrebbe comunque adattarsi comodamente Se desideri aumentarlo ulteriormente, tuttavia, probabilmente anche le dimensioni dovranno essere modificate.)

Il comando per compilare il programma è:

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

Il programma presuppone che ci sia un file di font chiamato q.ttfnella directory corrente quando eseguito. Mi sono occupato in anticipo di questo eseguendo il seguente comando (che dovrebbe funzionare sulla maggior parte dei Linux moderni):

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

(Sentiti libero di importare invece il tuo font TrueType preferito.)

Dopo aver eseguito il programma, l'output dell'immagine verrà creato nella directory corrente, in un file denominato q.bmp. Purtroppo i file bitmap di Windows sono l'unico formato di output fornito da questo programma. L'aggiunta di più formati di output richiederebbe il collegamento in più librerie.

Si noti che questo programma sfrutta la sintassi di C99 per l'introduzione di valori letterali non semplici, riducendo così in modo significativo il numero di variabili che devono essere definite. Questo è qualcosa di cui molti golfisti C dovrebbero trarre vantaggio.


2

C # - 498-15% = 423.3

Questo probabilmente può essere giocato a golf di più. Non ho mai fatto quines o questo tipo di grafica in C # prima:

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

Produzione: inserisci qui la descrizione dell'immagine

Aggiungere un supporto di formato diverso sarebbe facile. Non sono sicuro se ne valga la pena, però.


2

Rubino, 104 caratteri

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

Esempio di output, per richiesta: i.imgur.com/jMC594C.png


Hai un output di esempio?
Pureferret,

@Pureferret vedi modifica
Shelvacu

1
Non un rigore. (Non genera a livello di codice il proprio codice sorgente.)
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

Questo è un vero quine che disegna l'output nel file specificato sulla riga di comando. Il formato del file viene impostato semplicemente modificando l'estensione del file (ad es. quine.jpgPer un JPEG e quine.pngper un PNG).

Esempio di output (immagine 2000x20):

Quine output


È possibile salvare alcuni caratteri utilizzando 2e3invece di 2000.
Kaya,

@Kaya: No, purtroppo non posso: 2e3è un floate Image.newrichiede ints.
nneonneo,

oh fastidio, ho pensato che sarebbe stato costretto.
Kaya,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.