소스 코드의 이미지를 출력합니다 (Quick Not a Quite).


29

코드 골프 : 소스 코드의 이미지를 인쇄합니다.

요구 사항

  1. 다른 곳에 저장되어 런타임에 검색된 버전이 아니라 소스 코드 자체의 이미지를 출력해야합니다.
  2. 코드는 손으로 직접 복사하여 결과를 재현 할 수있을 정도로 읽기 쉬워야합니다.

모든 이미지 형식이 적용 가능합니다.

보너스

  • 하나 이상의 출력 형식을 허용하는 경우 점수의 -10 %
  • 코드가있는 경우 15 % 는 '진정한'quine. 즉, 소스 코드를 읽지 않지만 소스 코드가 임베드됩니다 ( 예는 여기 참조 ).
  • 코드가 엄격한 quine 인 경우 -30 % – 즉, 코드 이미지가 프로그램에 포함됩니다 (Piet 솔루션,보고 있습니다).

읽을 수 있어야합니까?
Tim Seguine

7
"다른 곳에서 저장된 버전이 아니라 코드 이미지 자체를 출력해야합니다." 소스 코드 파일을 읽거나 읽을 수 있습니까?
Tim Seguine

29
방금 공백으로 솔루션을 구현했습니다. 결과 이미지는 매우 지루해 보입니다.
Howard

7
다음은 Piet로 작성된 흥미로운 이미지 quine입니다
ProgramFOX

답변:


25

껍질

"소스 코드의 이미지 인쇄"를 통해 실제로 종이에 이미지를 인쇄 할 수 있다고 가정합니다.

#!/bin/sh
lpr $0

21

7
이 답변에 커뮤니티 위키가 있습니까? 이는 외부에서 제공되는 답변에 대한 표준 정책이되었습니다. 그래도 정말 멋지다!
Jonathan Van Matre

@JonathanVanMatre Whoops, 죄송합니다. 그게 내가 의도 한 바야 다른 토론에 참여하는 동안 질문에 대답하려고하지 않아야한다고 생각합니다 .
모자와 사람

둘 중 낮은 쪽입니다. -30 % 및 -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");

경고가 적절할 경우 : 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);

첫 번째 명령 행 인수로 사용할 출력 함수를 제공하십시오.

php timwolla.php imagepng

경고가있는 솔루션 :


5
나는 이것이 최초의 실제 퀘인이라고 생각하고 스크립트가 자체 소스 코드를 읽거나 자체 스크린 샷을 얻는 것이 아닙니다.
nitro2k01

두 가지 질문, 소수점에 다른 표기법을 사용할 수 있습니까? 약간 혼란 스럽습니다. 또한 왜 이미지가 너무 작습니까? 읽기가 어렵습니다 (물론 저는 전화를
받고 있습니다

2
@Pureferret는 확대 만하면됩니다. 실제로 픽셀 화되어 있어도 읽을 수 있습니다.
Ruslan

1
@Pureferret 그냥 그들을 변경, 나는 영어에서 다른 것을 기억하지 않습니다…
TimWolla

13

공백, 125



















이미지 파일을 pbm 형식으로 출력 합니다.

이 코드를 테스트하는 경우 "편집"을 클릭하고 <pre>태그 사이의 모든 내용을 복사하여 복사하십시오 .

산출:

P1 1 1 0

7
공간과 탭 사이의 미묘한 차이를보기 위해 화면을 가늘게 뜨고 손으로 복사 .... 프로그램 실행 .... 하드 드라이브 폭발
Jonathan Van Matre

17
이 답변은 요구 사항 2를 충족하지 않습니다. 이미지를 읽을 수 없어 소스 코드를 재현 할 수 없습니다.
user2357112는

2
@ user2357112 그러나 당신은 그것을 증명할 수 없습니다. 그것이 내가 여기서 활용하고있는 허점입니다.
duci9y

21
예, 정보 이론을 사용하여 할 수 있습니다. 완전히 엄격한 근거는 600 자 주석의 범위를 벗어납니다. 그러나 그 핵심은 이미지가 작동하지 않는 코드 이미지와 동일하다는 것입니다.
user2357112는 18:41에 Monica

3
프랑스를 용서하지만 BS! 규칙에 따르면 코드를 읽을 수 있어야합니다. 공백으로 코드를 작성한다고해서 부정 할 수는 없습니다. 선택한 경우 Sublime Text로 표시되는 프로그램입니다. i.imgur.com/A2ZaQwI.png 읽기 쉽습니다 . 프로그램 출력이 무엇이든간에. 게다가 프로그램 출력이 실제로 소스 코드인지 아니면 문자 그대로 빈 이미지인지 설명하지 않았습니다.
nitro2k01

13

매스 매 티카, 37 31 문자

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

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

여기에 이미지 설명을 입력하십시오

mathematica.stackexchange.com의 답변에서 영감을 얻었습니다 .


설명하시오 ... #n은 무엇입니까? 어쩌면 우리는 알아낼 수 있습니다.
Pureferret

적어도 프론트 엔드없이 작동합니다. ( Export["/tmp/out.png",%]이 명령을 실행 한 후 시도 )
Ruslan

2
@Pureferret #nn순수 함수의 인수를 의미 합니다 (이 &시점 에서 생성됨 ). 전체 표현으로 확장 Rasterize[Defer[#0[Defer,Rasterize]]]경우, #0원래의 순수한 함수의 재귀 호출입니다. 어떤면에서 이것은 엄격한 quine은 아니지만 작동하기 위해 프런트 엔드가 필요하지 않으며 IMO는 훌륭한 솔루션입니다.
Ruslan

명령과 명령의 대상으로 Defer []와 Rasterize []를 사용하는 것에 감탄합니다. 나는 재귀가 이런 식으로 제시된 것을 본 적이 없다.
Michael Stern

10

애플 스크립트, 68 37

자, zsh에서 ImageMagick을 호출 할 수 있다면 이것도 유효합니다. 나는 여전히 내 자신의 만족을 위해 더 우아하고 순수한 정신으로 해킹하고 있지만 순수한 골프를 위해 여기 있습니다.

새로운 버전

do shell script "screencapture q.jpg"

구 버전

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

나는 이것이 여전히 이길 것이라고 생각하지만, 장황한 오래된 AppleScript는 이것에 대한 간결함을 모방합니다.

당신의 quine를 중지

do shell script "screencapture -c"

3
정의에 따르면 quine은 소스 코드를 유일한 출력 으로 생성하지만 이것이이 질문에 적용되는지 확실하지 않다고 생각합니다. nyx.net/~gthompso/quine.htm
duci9y

예, 실제로 자체 윈도우의 코드 영역 만 선택하는 방법을 알아 내려고 노력하고 있지만 AppleScript 영역에 깃발을 심기 위해 이것을 던질 것이라고 생각했습니다.
Jonathan Van Matre

나는 이것을 유효하다고 생각하고 이런 종류의 것을 기대하고있었습니다.
Pureferret

엄격한 징조가 아닙니다. (프로그래밍 방식으로 자체 소스 코드를 생성하지는 않습니다.)
nitro2k01

3
기술적으로, 이들 언어 중 어느 것도 이미지를 소스 코드로 사용하지 않기 때문에 Piet 답변을 제외하고 는 이들 중 어느 것도 엄격한 quine 이 될 수 없습니다. 그러나 나는 여전히 더 엄격한 내 버전을 만들기로 결심했습니다. :)
Jonathan Van Matre

8

매스 매 티카, 83

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

여기에 이미지 설명을 입력하십시오


1
엄격한 징조가 아닙니다. (프로그래밍 방식으로 자체 소스 코드를 생성하지는 않습니다.)
nitro2k01

1
가져온 경우에도 프론트 엔드 (in math또는 MathKernel)가 없으면 작동하지 않습니다 <<JavaGraphics`.
Ruslan

8

Sh, X 및 ImageMagick 18.9 :

 import -window root a.jpg

ImageMagick이있는 모든 쉘에서 작동합니다.

코드 접두사 만 인쇄하려면 clear &&26.1에 나옵니다.

clear && import -window root a.jpg

샘플 출력 :

여기에 이미지 설명을 입력하십시오


내 컴퓨터에서 테스트했는데 작동합니다.
pastebin.com 슬래시 0mr8spkT

4
Linux 콘솔 에서 작동하지 않았습니다 . 요구 사항 에 X 를 추가 할 수 있습니다 .
Ilmari Karonen

2
엄격한 징조가 아닙니다. (프로그래밍 방식으로 자체 소스 코드를 생성하지는 않습니다.)
nitro2k01

1
@nitro 'Quine'이라는 용어를 잘못 사용했을 수도 있지만 내 게시물의 첫 번째 줄은 소스 코드의 이미지 출력 만 언급합니다. 나는 원래 의도를 분명히하고 진실 / 엄격한 퀴인을 위해 편집하고 있습니다.
Pureferret

1
궁금한 점은 비트 코인과 리테 코인 지갑입니다. 3 년이 지난 지금, 심각한 이익이 있습니까? : D
Albert Renshaw

5

HTML5 / 자바 스크립트 : 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>

데모 : http://jsfiddle.net/E2738/2/

이미지를 마우스 오른쪽 버튼으로 클릭하고 PNG로 저장할 수 있습니다


2
그것은 끝나지 <//script>
않습니다

1
바이올린 변경의 11 번 줄 끝 +wrapText+"<//script>";에서+wrapText+"<\/script>";
Luke

@Charles 지적 해 주셔서 감사합니다. 결정된.
Clyde Lobo

4

자바, 570-10 %-15 % = 427.5

= 415.5 (포함되지 않음 "파일 경로") 15 % - ( "파일 경로"포함), 554~10%
제거 안드레아스 덕분 BufferedImagejava.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"));}}

산출:여기에 이미지 설명을 입력하십시오

제대로 보려면 다음 링크를 참조하십시오 : http://i.stack.imgur.com/RRSDw.png

이것은 이미지로 출력되는 것을 제외하고는 일반 퀴인처럼 작동합니다. 현재 형식은입니다 pngpng프로그램 의 모든 인스턴스 를 원하는 형식 으로 바꾸면 형식을 쉽게 변경할 수 있습니다 .

여기에 몇 가지 답변과는 달리, 이것은 진정한 소란입니다. 프로그램 파일을 읽지 않습니다.


"java.awt.image.BufferedImage"를 "java.awt.image. *"로 교체하면 다른 24자를 제거 할 수 있습니다.
Andreas

4

자바 스크립트 JQuery와 + 153 148

정규병

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

골프

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
엄격한 징조가 아닙니다. (프로그래밍 방식으로 자체 소스 코드를 생성하지는 않습니다.)
nitro2k01

$? jQuery도 사용하고 있습니까?
Clyde Lobo

@ClydeLobo Yup, 그는 보인다. JQuery없이 Javascript를 수행 할 수 있습니까? 누가 생각 했을까!
Pierre Arlaud

@ClydeLobo 그렇습니다. 그러나 라이브러리는 허용되어야합니다. stdio.hxD를 사용하는 C 프로그램과 다르지 않습니다 . jQuery없이 프로그램을 작성하는 것은 쉽다. 그냥 교체 $('<canvas/>')[0]document.createElement('canvas')$('body').append함께 document.write. jQuery가 바이트를 절약했습니다.
aebabis

3

zsh, 57 × 0.9 = 51.3

출력 파일 이름을 인수로 전달하십시오.

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

생산 :

출력 예


1
zsh 또는 imagemagick입니까?
Kaya

@Kaya : 글쎄요. 언어는 zsh (또는 bash이지만 Posix는 아님)이며 라이브러리 / 도구는 ImageMagick (또는 원하는 경우 GraphicsMagick)입니다. GD가있는 PHP 또는 RMagick이있는 Ruby와 같습니다.
Ry-

1
@Pureferret : 추가되었습니다.
Ry-

엄격한 징조가 아닙니다. (프로그래밍 방식으로 자체 소스 코드를 생성하지는 않습니다.)
nitro2k01

3

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

더 많은 줄 바꿈이 없으면 추악하지만 불행히도 결석해야합니다. 텍스트 렌더링 기능은 제어 문자를 전혀 사용하지 않으므로 코드에서 줄 바꿈을 출력에서 ​​수동으로 렌더링해야합니다.

다음은 동일한 코드이지만 가독성을 위해 줄 바꿈이 추가되었습니다.

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

슬프게도 이것은 그래픽 출력에 줄 바꿈을 추가하지 않습니다.

산출

출력은 여전히 ​​읽을 수 있지만 9 포인트 출력과 빨간색 글꼴 색상은 약간 흠집입니다. 당신은 대체하여 캐릭터의 비용을 개선 할 수 있습니다 912. (결과 이미지의 크기는 2048x80으로 하드 코딩됩니다. 다양한 글꼴의 차이점을 수용하기 위해 오른쪽 여백과 선행 부분에 상당한 양의 초과 부분이 추가되어 크기 12 글꼴이 여전히 편안하게 맞습니다. 그러나 더 늘리려면 치수도 변경해야합니다.)

프로그램을 빌드하는 명령은 다음과 같습니다.

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

프로그램은 q.ttf실행될 때 현재 디렉토리에 호출 된 글꼴 파일이 있다고 가정 합니다. 다음 명령을 실행하여 미리 처리했습니다 (대부분의 최신 Linux에서 작동해야 함).

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

(자신이 선호하는 트루 타입 글꼴을 가져 오십시오.)

프로그램을 실행 한 후 이미지 출력은 현재 디렉토리의 파일에 작성됩니다 q.bmp. 불행히도 Windows 비트 맵 파일은이 프로그램이 제공하는 유일한 출력 형식입니다. 더 많은 출력 형식을 추가하려면 더 많은 라이브러리에서 링크해야합니다.

이 프로그램은 단순하지 않은 리터럴 값을 도입하기 위해 C99의 구문을 활용하므로 정의해야 할 변수의 수를 크게 줄입니다. 이것은 더 많은 C 골퍼들이 이용해야 할 것입니다.


2

C # -498-15 % = 423.3

이것은 아마도 더 골프를 칠 수 있습니다. 전에 C #에서 quines 또는 이런 종류의 그래픽을 한 적이 없습니다.

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

산출: 여기에 이미지 설명을 입력하십시오

다른 형식 지원을 추가하는 것은 쉽습니다. 그래도 그만한 가치가 있는지 확실하지 않습니다.


2

루비, 104 자

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

요청 당 출력 예 : i.imgur.com/jMC594C.png


예제 출력이 있습니까?
Pureferret

@Pureferret 편집 참조
Shelvacu

1
엄격한 징조가 아닙니다. (프로그래밍 방식으로 자체 소스 코드를 생성하지는 않습니다.)
nitro2k01

1

파이썬 : 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])

용법:

python imgquine.py quine.jpg

이것은 명령 행에 지정된 파일로 출력을 가져 오는 진정한 quine입니다. 파일 형식은 파일 이름 확장자 (예 : quine.jpgJPEG 및 quine.pngPNG) 를 변경하여 간단히 설정됩니다 .

출력 예 (2000x20 이미지) :

퀸 출력


2e3대신을 사용하여 일부 문자를 저장할 수 2000있습니다.
Kaya

@ 카야 : 아뇨, 불행히도 : 2e3float이며 s를 Image.new요구 int합니다.
nneonneo

귀찮게, 나는 그것이 강제 될 것이라고 생각했다.
Kaya
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.