Saída de uma imagem do seu código-fonte (não muito a Quine)

29

Código golf: imprima uma imagem do código fonte.

Exigências

  1. Deve gerar a imagem do próprio código-fonte, não uma versão armazenada em outro local e recuperada em tempo de execução.
  2. O código deve ser legível o suficiente para copiar manualmente e reproduzir os resultados.

Qualquer formato de imagem é aplicável.

Bônus

  • -10% da sua pontuação, se você permitir mais de um formato de saída.
  • -15% se o seu código também for um quine 'verdadeiro'. isto é, ele não lê o código fonte, mas o código fonte está incorporado (veja aqui um exemplo)
  • -30% se o seu código for estritamente correto - ou seja, a imagem do código está incorporada no programa (soluções Piet, estou olhando para você).
Pureferret
fonte
Tem que ser legível?
Tim Seguine
7
"Deve gerar a própria imagem de código, não uma versão armazenada de outro lugar." É permitido e / ou necessário ler o arquivo de código-fonte?
Tim Seguine
29
Acabei de implementar uma solução em espaço em branco. A imagem resultante parece bastante chata.
Howard
7
Aqui está um Quine imagem interessante escrito em Piet: mamememo.blogspot.be/2009/10/piet-quine.html
ProgramFOX

Respostas:

25

Concha

Por "Imprimir uma imagem do código-fonte", presumo que seria realmente aceitável imprimir uma imagem em papel.

#!/bin/sh
lpr $0
Mark Plotnick
fonte
21

Piet, 24399.76

insira a descrição da imagem aqui

Isso não foi feito por mim.

O cara com o chapéu
fonte
7
Você poderia wiki da comunidade esta resposta? Essa se tornou nossa política padrão de respostas externas. Isso é muito legal!
Jonathan Van Matre
@JonathanVanMatre Opa, desculpe. Era isso que eu pretendia fazer. Acho que não deveria tentar responder a perguntas enquanto participava de outra discussão .
O cara com o chapéu
É o mais baixo dos dois. -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 os avisos forem bons: 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);

Você fornece a função de saída a ser usada como o primeiro argumento da linha de comandos:

php timwolla.php imagepng

Solução com avisos:

TimWolla
fonte
5
Eu acho que essa é a primeira coisa real e não apenas um script lê seu próprio código-fonte, ou apenas tira uma captura de tela de si mesmo.
Nitro2k01
Duas perguntas, você pode usar uma notação diferente para seus decimais? É levemente confuso. Por que a imagem é tão pequena? É difícil de ler (é certo que eu estou no meu telefone)
Pureferret
2
O @Pureferret apenas aumenta o zoom. Na verdade, é bastante legível, apesar de ser pixelizado.
Ruslan
11
@Pureferret apenas mudou-los, eu nunca lembro que seja diferente em Inglês ...
TimWolla
13

Espaço em branco, 125



















Produz um arquivo de imagem no formato pbm .

Se você estiver testando esse código, copie-o clicando em "Editar" e copiando tudo entre as <pre>tags.

Saída:

P1 1 1 0
duci9y
fonte
7
cópias à mão, apertando os olhos para a tela para ver diferenças sutis entre espaços e tabulações .... programa é executado .... explode disco rígido
Jonathan Van Matre
17
Esta resposta não atende ao requisito 2. A imagem não é legível o suficiente para reproduzir o código-fonte.
User2357112 suporta Monica
2
@ user2357112 Mas você não pode provar isso. Essa é a brecha que estou explorando aqui.
duci9y
21
Sim, posso, usando a teoria da informação. Uma justificativa totalmente rigorosa estaria além do escopo de um comentário de 600 caracteres, mas o essencial é que sua imagem é idêntica a uma imagem de código que não funciona.
User2357112 suporta Monica
3
Perdoe os franceses, mas BS! As regras indicam que o código deve ser legível. Escrever código no espaço em branco não nega isso. Este é o seu programa mostrado em Sublime Text, quando selecionado: i.imgur.com/A2ZaQwI.png Isso é legível. Quaisquer que sejam as saídas do seu programa, não é. Além disso, você não explicou se o que o seu programa produz é realmente o seu código fonte ou apenas literalmente uma imagem vazia.
Nitro2k01
13

Mathematica, 37 31 caracteres

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

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

insira a descrição da imagem aqui

Inspirado por uma resposta em mathematica.stackexchange.com .

alefalpha
fonte
Explique ... para que servem? Talvez possamos descobrir isso.
Pureferret
Pelo menos, funciona sem o FrontEnd. (Tentei com Export["/tmp/out.png",%]depois de executar este comando)
Ruslan
2
@Pureferret #nsignifica o nargumento de uma função pura (criada no &momento). A expressão inteira se expande para Rasterize[Defer[#0[Defer,Rasterize]]], onde #0é chamada recursiva da função pura original. De certa forma, isso não é uma solução estrita, mas não precisa de nenhum front-end para funcionar, e é uma solução agradável para a IMO.
Ruslan
Admiro o uso de Adiar [] e Rasterizar [] como os comandos e o objeto dos comandos. Eu nunca vi recursão apresentada dessa maneira antes.
Michael Stern
10

AppleScript, 68 37

Tudo bem, se você pode chamar o ImageMagick no zsh, isso também é válido. Ainda estou tentando criar algo mais elegante e sofisticado para minha própria satisfação, mas, por pura golfe, aqui estamos:

Nova versão

do shell script "screencapture q.jpg"

Versão antiga

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

Eu imagino que isso ainda será derrotado, mas o velho AppleScript verboso faz uma imitação admirável de sucessão para este.

pare com sua quine

do shell script "screencapture -c"
Jonathan Van Matre
fonte
3
Eu acho que um quine, por definição, produz seu código-fonte como sua única saída, mas não tenho certeza se isso deve se aplicar a essa pergunta. nyx.net/~gthompso/quine.htm
duci9y
Sim, na verdade estou tentando descobrir como fazê-lo selecionar apenas a área de código de sua própria janela, mas achei que iria adiante e jogaria isso para plantar minha bandeira no território AppleScript.
Jonathan Van Matre
Estou considerando isso como válido e estava esperando algo desse tipo.
Pureferret
Não é uma pergunta estrita. (Não se programaticamente gerar seu próprio código-fonte.)
nitro2k01
3
Tecnicamente, nenhum deles pode ser rigoroso, exceto a resposta de Piet, porque nenhum desses idiomas obtém imagens como código-fonte. Mas ainda estou determinado a criar uma versão mais rígida da minha. :)
Jonathan Van Matre
8

Mathematica, 83

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

insira a descrição da imagem aqui

chuy
fonte
11
Não é uma pergunta estrita. (Não se programaticamente gerar seu próprio código-fonte.)
nitro2k01
11
Não funciona sem frontend (in mathou MathKernel), mesmo com <<JavaGraphics`importados.
Ruslan
8

Sh, X e ImageMagick 18.9:

 import -window root a.jpg

Isso deve funcionar em qualquer shell que tenha o ImageMagick.

Para imprimir apenas o código anexado, clear &&sai em 26.1

clear && import -window root a.jpg

Saída de amostra:

insira a descrição da imagem aqui

Pureferret
fonte
Testado no meu computador, ele funciona.
user12205
4
Não funcionou para mim no console do Linux . Você pode querer adicionar X aos requisitos.
Ilmari Karonen
2
Não é uma pergunta estrita. (Não se programaticamente gerar seu próprio código-fonte.)
nitro2k01
11
@ nitro Eu posso ter usado mal o termo 'Quine', mas a primeira linha do meu post menciona apenas a saída de uma imagem do código-fonte. Estou editando agora para esclarecer minha intenção original e também para beneficiar quines verdadeiros / estritos.
Pureferret
11
Apenas curioso, vejo carteiras de bitcoin e litecoin; Já se passaram 3 anos, algum ganho sério? : 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>

Demonstração: http://jsfiddle.net/E2738/2/

Pode-se clicar com o botão direito na imagem e salvá-la como PNG

Clyde Lobo
fonte
2
termina com<//script>
Não que Charles
11
no final da linha 11, no violino, mude +wrapText+"<//script>";para+wrapText+"<\/script>";
Luke
@ Charles Obrigado por apontar isso. Fixo.
Clyde Lobo
4

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

( "caminhoficheiro" incluído), 554-10% - 15% = 415,5 ( "caminhoficheiro" não incluído)
Graças a Andreas para a remoção BufferedImagedejava.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"));}}

Saída:insira a descrição da imagem aqui

Para visualizar corretamente, consulte este link: http://i.stack.imgur.com/RRSDw.png

Isso funciona exatamente como um quine normal, exceto que gera uma imagem. O formato atual é png, mas o formato pode ser facilmente alterado, substituindo todas as instâncias do pngprograma pelo formato que você desejar.

Ao contrário de algumas respostas aqui, este é um verdadeiro quine; nenhuma leitura do arquivo do programa.

Justin
fonte
você pode se livrar de outros 24 caracteres se substituir "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>

Golfe

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
fonte
11
Não é uma pergunta estrita. (Não se programaticamente gerar seu próprio código-fonte.)
nitro2k01
$? você está usando jQuery também?
Clyde Lobo
@ClydeLobo Yup, parece que ele é. Espere, você pode fazer Javascript sem JQuery? Quem teria pensado!
23416 Pierre Arlaud
@ClydeLobo Sim, eu sou. Mas bibliotecas devem ser permitidas. Não é realmente diferente de um programa em C usando stdio.hxD. Escrever o programa sem o jQuery é fácil. Basta substituir $('<canvas/>')[0]por document.createElement('canvas')e $('body').appendcom document.write. O jQuery me salvou em bytes.
aebabis
3

zsh, 57 × 0,9 = 51,3

Passe o nome do arquivo de saída como argumento.

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

Produz:

Saída de exemplo

Ry-
fonte
11
isso é zsh ou imagemagick?
Kaya
@Kaya: Bem, ambos. A linguagem é zsh (ou bash, mas não é Posix), e a biblioteca / ferramenta é ImageMagick (ou GraphicsMagick, se você preferir) - como PHP com GD ou Ruby com RMagick.
Ry-
11
@Pureferret: adicionado.
Ry-
Não é uma pergunta estrita. (Não se programaticamente gerar seu próprio código-fonte.)
nitro2k01
3

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

Isso é muito feio sem mais quebras de linha, mas infelizmente elas precisam estar ausentes. A função de renderização de texto não agrega caracteres de controle, portanto, qualquer quebra de linha no código deve ser renderizada manualmente na saída.

Aqui está o mesmo código, mas com algumas quebras de linha extras para legibilidade:

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

Infelizmente, isso também não adiciona quebras de linha à saída gráfica:

saída

A saída ainda é legível, embora com saída de 9 pontos e a cor vermelha da fonte, seja um pouco estridente. Você pode melhorá-lo à custa de um personagem substituindo o 9por 12. (Observe que a dimensão da imagem resultante é codificada para 2048x80. Para acomodar as diferenças em várias fontes, um pouco de excesso foi adicionado à margem direita e à esquerda, o suficiente para que uma fonte de tamanho 12 ainda caiba confortavelmente Se você deseja aumentar ainda mais, as dimensões provavelmente precisarão ser alteradas também.)

O comando para criar o programa é:

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

O programa assume que existe um arquivo de fonte chamado q.ttfno diretório atual quando executado. Eu cuidei disso de antemão executando o seguinte comando (que deve funcionar nos mais modernos Linuxes):

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

Lembre-se de importar sua própria fonte TrueType favorita.

Após a execução do programa, a saída da imagem será criada no diretório atual, em um arquivo chamado q.bmp. Infelizmente, os arquivos de bitmap do Windows são o único formato de saída que este programa fornece. Adicionar mais formatos de saída exigiria vinculação em mais bibliotecas.

Observe que este programa tira proveito da sintaxe do C99 para a introdução de valores literais não simples, reduzindo significativamente o número de variáveis ​​que precisam ser definidas. Isso é algo que mais jogadores C devem aproveitar.

caixa de pão
fonte
2

C # - 498 - 15% = 423,3

Provavelmente isso pode ser jogado mais. Eu nunca fiz quines ou esse tipo de gráfico em 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);}}

Saída: insira a descrição da imagem aqui

Adicionar um suporte de formato diferente seria fácil. Não tenho certeza se vale a pena, no entanto.

Ray Poward
fonte
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

Exemplo de saída, por solicitação: i.imgur.com/jMC594C.png

Shelvacu
fonte
Você tem um exemplo de saída?
Pureferret
@Pureferret see edit #
Shelvacu
11
Não é uma pergunta estrita. (Não se programaticamente gerar seu próprio código-fonte.)
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

Este é um verdadeiro quine que desenha a saída para o arquivo especificado na linha de comando. O formato do arquivo é definido simplesmente alterando a extensão do nome do arquivo (por exemplo, quine.jpgpara JPEG e quine.pngPNG).

Exemplo de saída (imagem de 2000 x 20):

Saída Quine

nneonneo
fonte
Você pode salvar alguns caracteres usando em 2e3vez de 2000.
Kaya
@Kaya: Não, infelizmente não posso: 2e3é um floate Image.newexige ints.
Nneonneo 23/03
Oh, meu Deus, eu presumi que seria coagido.
Kaya