Xuất hình ảnh của mã nguồn của bạn (không phải là khá-Quine)


29

Code golf: In một hình ảnh của mã nguồn.

Yêu cầu

  1. Phải xuất hình ảnh của mã nguồn, không phải là phiên bản được lưu trữ ở nơi khác và được truy xuất trong thời gian chạy.
  2. Mã phải đủ rõ ràng để sao chép bằng tay và sao chép kết quả.

Bất kỳ định dạng hình ảnh được áp dụng.

Tiền thưởng

  • -10% số điểm của bạn nếu bạn cho phép nhiều hơn một định dạng đầu ra.
  • -15% nếu mã của bạn cũng là một câu hỏi 'đúng'. tức là nó không đọc mã nguồn của nó nhưng mã nguồn được nhúng (xem ví dụ ở đây )
  • -30% nếu mã của bạn là một quy tắc nghiêm ngặt - tức là hình ảnh của mã được nhúng trong chương trình (Giải pháp của Piet, tôi đang nhìn bạn.).

Nó có phải dễ đọc không?
Tim Seguine

7
"Phải tự xuất hình ảnh mã, không phải là phiên bản được lưu trữ từ nơi khác." Được phép và / hoặc bắt buộc phải đọc tệp mã nguồn?
Tim Seguine

29
Tôi vừa thực hiện một giải pháp trong khoảng trắng. Hình ảnh thu được trông khá nhàm chán.
Howard

7
Dưới đây là một hình ảnh thú vị Quine viết bằng Piet: mamememo.blogspot.be/2009/10/piet-quine.html
ProgramFOX

3
Kaz

Câu trả lời:


25

vỏ

Bằng cách "In một hình ảnh của mã nguồn", tôi cho rằng thực sự in một hình ảnh trên giấy sẽ được chấp nhận.

#!/bin/sh
lpr $0

21

7
Bạn có thể cộng đồng wiki câu trả lời này? Điều đó đã trở thành chính sách tiêu chuẩn của chúng tôi cho các câu trả lời có nguồn gốc từ bên ngoài. Điều này thực sự mát mẻ, mặc dù!
Jonathan Van Matre

@JonathanVanMatre Rất tiếc, xin lỗi. Đó là những gì tôi muốn làm. Tôi đoán tôi không nên cố gắng trả lời các câu hỏi trong khi tham gia vào một cuộc thảo luận khác .
Chàng trai với chiếc mũ

Đó là thấp hơn của hai. -30% và -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");

Nếu cảnh báo là tốt: 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);

Bạn cung cấp hàm đầu ra để sử dụng làm đối số dòng lệnh đầu tiên:

php timwolla.php imagepng

Giải pháp với cảnh báo:


5
Tôi nghĩ rằng đây là câu hỏi thực tế đầu tiên và không chỉ là một tập lệnh đọc mã nguồn của chính nó, hoặc chỉ chụp ảnh màn hình của chính nó.
nitro2k01

Hai câu hỏi, bạn có thể sử dụng một ký hiệu khác nhau cho số thập phân của bạn? Thật khó hiểu. Ngoài ra tại sao hình ảnh rất nhỏ? Thật khó đọc (phải thừa nhận rằng tôi đang sử dụng điện thoại của mình)
Pureferret

2
@Pureferret chỉ cần phóng to nó. Nó thực sự khá dễ đọc mặc dù đã được pixel hóa.
Ruslan

1
@Pureferret Chỉ cần thay đổi chúng, tôi không bao giờ nhớ nó khác tiếng Anh
TimWolla

13

Khoảng trắng, 125



















Xuất ra một tệp hình ảnh ở định dạng pbm .

Nếu bạn đang kiểm tra mã này, vui lòng sao chép mã bằng cách nhấp vào "Chỉnh sửa" và sao chép mọi thứ giữa các <pre>thẻ.

Đầu ra:

P1 1 1 0

7
sao chép bằng tay, nheo mắt trên màn hình để thấy sự khác biệt tinh tế giữa không gian và tab .... chạy chương trình .... ổ cứng phát nổ
Jonathan Van Matre

17
Câu trả lời này không đáp ứng yêu cầu 2. Hình ảnh không thể đọc đủ để tái tạo mã nguồn.
user2357112 hỗ trợ Monica

2
@ user2357112 Nhưng bạn không thể chứng minh điều đó. Đó là kẽ hở tôi đang khai thác ở đây.
duci9y

21
Có tôi có thể, sử dụng lý thuyết thông tin. Một lời biện minh đầy đủ nghiêm ngặt sẽ vượt ra ngoài phạm vi của một nhận xét 600 ký tự, nhưng ý chính của nó là hình ảnh của bạn giống hệt với hình ảnh của mã không hoạt động.
user2357112 hỗ trợ Monica

3
Xin lỗi người Pháp, nhưng BS! Các quy tắc nói rằng mã phải dễ đọc. Viết mã trong Whitespace không phủ nhận điều đó. Đây là chương trình của bạn được hiển thị trong Sublime Text, khi được chọn: i.imgur.com/A2ZaQwI.png Điều này dễ đọc. Dù đầu ra chương trình của bạn là gì. Và bên cạnh đó, bạn chưa giải thích liệu những gì chương trình của bạn thực sự là mã nguồn của bạn hay chỉ là một hình ảnh trống rỗng.
nitro2k01

13

Toán học, 37 31 ký tự

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

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

nhập mô tả hình ảnh ở đây

Lấy cảm hứng từ một câu trả lời trong mathicala.stackexchange.com .


Giải thích cho nó ... #n để làm gì? Có lẽ chúng ta có thể tìm ra nó.
Pureferret

Ít nhất là nó hoạt động mà không có FrontEnd. (Đã thử với Export["/tmp/out.png",%]sau khi chạy lệnh này)
Ruslan

2
@Pureferret #ncó nghĩa là nđối số thứ của một hàm thuần túy (được tạo tại &điểm). Toàn bộ biểu thức mở rộng đến Rasterize[Defer[#0[Defer,Rasterize]]], nơi #0gọi đệ quy của hàm thuần túy ban đầu. Theo một cách nào đó, đây không phải là một vấn đề nghiêm ngặt, nhưng nó không cần bất kỳ lối vào nào để hoạt động và IMO là một giải pháp tốt.
Ruslan

Tôi ngưỡng mộ việc sử dụng Defer [] và Rasterize [] làm cả lệnh và đối tượng của lệnh. Tôi chưa bao giờ thấy đệ quy trình bày theo cách này trước đây.
Michael Stern

10

AppleScript, 68 37

Được rồi, nếu bạn có thể gọi ImageMagick trong zsh thì điều này cũng hợp lệ. Tôi vẫn đang hack một thứ gì đó thanh lịch và tinh tế hơn cho sự hài lòng của riêng tôi, nhưng đối với môn thể thao thuần túy, chúng ta ở đây:

Phiên bản mới

do shell script "screencapture q.jpg"

Phiên bản cũ

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

Tôi tưởng tượng điều này vẫn sẽ bị đánh bại, nhưng AppleScript cũ đã làm một sự bắt chước đáng ngưỡng mộ về sự cô đọng cho cái này.

dừng lại

do shell script "screencapture -c"

3
Tôi nghĩ rằng một quine, theo định nghĩa, tạo mã nguồn của nó như là đầu ra duy nhất của nó , nhưng không chắc chắn nếu điều đó nên áp dụng cho câu hỏi này. nyx.net/~gthompso/quine.htm
duci9y

Vâng, tôi thực sự đang cố gắng tìm ra cách để nó chỉ chọn vùng mã của cửa sổ riêng của mình, nhưng tôi đoán rằng tôi sẽ tiếp tục và ném nó lên để cắm cờ của mình trong lãnh thổ AppleScript.
Jonathan Van Matre

Tôi đang coi điều này là hợp lệ và đang mong đợi một cái gì đó thuộc loại này.
Pureferret

Không phải là một quine nghiêm ngặt. (Không lập trình tạo mã nguồn của riêng mình.)
nitro2k01

3
Về mặt kỹ thuật, không có ngôn ngữ nào trong số này có thể là các câu hỏi nghiêm ngặt ngoại trừ câu trả lời của Piet, bởi vì không có ngôn ngữ nào trong số này lấy hình ảnh làm mã nguồn. Nhưng tôi vẫn quyết tâm tạo ra một phiên bản chặt chẽ hơn của tôi. :)
Jonathan Van Matre

8

Toán học, 83

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

nhập mô tả hình ảnh ở đây


1
Không phải là một quine nghiêm ngặt. (Không lập trình tạo mã nguồn của riêng mình.)
nitro2k01

1
Không hoạt động mà không có frontend (trong mathhoặc MathKernel), ngay cả với <<JavaGraphics`nhập khẩu.
Ruslan

8

Sh, X & ImageMagick 18.9:

 import -window root a.jpg

Điều này sẽ hoạt động trong bất kỳ shell nào có ImageMagick.

Để chỉ in mã, clear &&điều này xuất hiện ở 26.1

clear && import -window root a.jpg

Đầu ra mẫu:

nhập mô tả hình ảnh ở đây


Đã thử nghiệm trên máy tính của tôi, nó hoạt động.
dùng12205

4
Không làm việc cho tôi trên bảng điều khiển Linux . Bạn có thể muốn thêm X vào các yêu cầu.
Ilmari Karonen

2
Không phải là một quine nghiêm ngặt. (Không lập trình tạo mã nguồn của riêng mình.)
nitro2k01

1
@nitro Tôi có thể đã sử dụng sai thuật ngữ 'Quine' nhưng dòng đầu tiên của bài viết của tôi chỉ đề cập đến việc xuất ra một hình ảnh của mã nguồn. Bây giờ tôi đang chỉnh sửa để làm rõ ý định ban đầu của mình và cũng để mang lại lợi ích thực sự / nghiêm ngặt.
Pureferret

1
Chỉ tò mò, tôi thấy ví bitcoin và litecoin; Bây giờ là ~ 3 năm sau, bất kỳ lợi ích nghiêm trọng nào? : 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>

Bản trình diễn: http://jsfiddle.net/E2738/2/

Người ta có thể nhấp chuột phải vào hình ảnh và lưu nó dưới dạng PNG


2
nó kết thúc bằng<//script>
Không phải Charles

1
ở cuối dòng 11 trong phần thay đổi +wrapText+"<//script>";thành+wrapText+"<\/script>";
Luke

@Charles Cảm ơn bạn đã chỉ ra rằng. Đã sửa.
Clyde Lobo

4

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

( "filepath" bao gồm), 554 - 10% - 15% = 415,5 ( "filepath" không bao gồm)
Nhờ Andreas để loại bỏ BufferedImagetrongjava.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"));}}

Đầu ra:nhập mô tả hình ảnh ở đây

Để xem đúng, xem liên kết này: http://i.stack.imgur.com/RRSDw.png

Điều này hoạt động giống như một quine thông thường, ngoại trừ nó xuất ra hình ảnh. Định dạng hiện tại là png, nhưng định dạng có thể dễ dàng thay đổi bằng cách thay thế tất cả các phiên bản pngtrong chương trình bằng bất kỳ định dạng nào bạn muốn.

Không giống như một vài câu trả lời ở đây, đây là một câu hỏi thực sự; không đọc tệp chương trình.


bạn có thể thoát khỏi 24 ký tự khác nếu thay thế cả "java.awt.image.BufferedImage" bằng "java.awt.image. *"
Andreas

4

Javascript + JQuery 153 148

Đều đặn

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

Chơi gôn

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
Không phải là một quine nghiêm ngặt. (Không lập trình tạo mã nguồn của riêng mình.)
nitro2k01

$? bạn có đang sử dụng jQuery không ??
Clyde Lobo

@ClydeLobo Yup, có vẻ như anh ấy. Đợi đã, bạn có thể làm Javascript mà không cần JQuery không? Ai đã nghĩ!
Pierre Arlaud

@ClydeLobo Vâng, tôi đây. Nhưng thư viện nên được cho phép. Nó thực sự không khác với một chương trình C sử dụng stdio.hxD. Viết chương trình mà không có jQuery là dễ dàng mặc dù. Chỉ cần thay thế $('<canvas/>')[0]bằng document.createElement('canvas')$('body').appendvới document.write. jQuery tiết kiệm cho tôi byte.
aebabis

3

zsh, 57 × 0,9 = 51,3

Truyền cho nó tên tệp đầu ra như một đối số.

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

Sản xuất:

Ví dụ đầu ra


1
đó là zsh hay fantemagick?
Kaya

@Kaya: Vâng, cả hai. Ngôn ngữ là zsh (hoặc bash, nhưng không phải là Posix) và thư viện / công cụ là ImageMagick (hoặc GraphicsMagick, nếu bạn thích) - như PHP với GD hoặc Ruby với RMagick.
Ry-

1
@Pureferret: Đã thêm.
Ry-

Không phải là một quine nghiêm ngặt. (Không lập trình tạo mã nguồn của riêng mình.)
nitro2k01

3

C99 (sử dụng 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});}
)

Điều này là khá xấu xí mà không có nhiều ngắt dòng, nhưng tiếc là họ cần phải vắng mặt. Hàm kết xuất văn bản hoàn toàn không điều khiển các ký tự điều khiển, do đó, bất kỳ ngắt dòng nào trong mã phải được hiển thị thủ công ở đầu ra.

Đây là cùng một mã nhưng với một số ngắt dòng bổ sung được ném vào cho mức độ dễ đọc:

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

Đáng buồn thay, điều này cũng không thêm ngắt dòng vào đầu ra đồ họa:

đầu ra

Đầu ra vẫn rõ ràng, mặc dù với đầu ra 9 điểm và màu phông chữ đỏ, nó hơi khó nhìn. Bạn có thể cải thiện nó với chi phí của một nhân vật bằng cách thay thế 9bằng 12. (Lưu ý rằng kích thước của hình ảnh thu được được mã hóa thành 2048x80. Để phù hợp với sự khác biệt về các phông chữ khác nhau, một chút dư thừa đã được thêm vào lề phải và hàng đầu, đủ để phông chữ cỡ 12 vẫn phù hợp thoải mái Tuy nhiên, nếu bạn muốn tăng thêm, tuy nhiên, kích thước có thể cũng sẽ cần phải được thay đổi.)

Lệnh để xây dựng chương trình là:

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

Chương trình giả định rằng có một tệp phông chữ được gọi q.ttftrong thư mục hiện tại khi chạy. Tôi đã xử lý vấn đề này trước bằng cách chạy lệnh sau (sẽ hoạt động trên hầu hết các Linux hiện đại):

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

(Thay vào đó, vui lòng nhập phông chữ TrueType yêu thích của bạn.)

Sau khi chạy chương trình, đầu ra hình ảnh sẽ được tạo trong thư mục hiện tại, trong một tệp có tên q.bmp. Thật không may, các tệp bitmap của Windows là định dạng đầu ra duy nhất mà chương trình này cung cấp. Thêm nhiều định dạng đầu ra sẽ yêu cầu liên kết trong nhiều thư viện hơn.

Lưu ý rằng chương trình này tận dụng cú pháp của C99 để giới thiệu các giá trị theo nghĩa đen không đơn giản, do đó giảm đáng kể số lượng biến cần xác định. Đây là điều mà nhiều người chơi golf C nên tận dụng.


2

C # - 498 - 15% = 423.3

Điều này có thể có thể được chơi golf nhiều hơn. Tôi chưa bao giờ thực hiện quines hoặc loại đồ họa này trong C # trước đây:

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

Đầu ra: nhập mô tả hình ảnh ở đây

Thêm một hỗ trợ định dạng khác nhau sẽ dễ dàng. Không chắc chắn nếu nó có giá trị, mặc dù.


2

Ruby, 104 ký tự

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

Ví dụ đầu ra, mỗi yêu cầu: i.imgur.com/jMC594C.png


Bạn có một đầu ra ví dụ?
Pureferret

@Pureferret xem chỉnh sửa
Shelvacu

1
Không phải là một quine nghiêm ngặt. (Không lập trình tạo mã nguồn của riêng mình.)
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])

Sử dụng:

python imgquine.py quine.jpg

Đây là một quine thực sự rút ra đầu ra cho tệp được chỉ định trên dòng lệnh. Định dạng tệp được đặt đơn giản bằng cách thay đổi phần mở rộng tên tệp (ví dụ: quine.jpgcho JPEG và quine.pngcho PNG).

Ví dụ đầu ra (hình ảnh 2000x20):

Sản lượng quine


Bạn có thể lưu một số ký tự bằng cách sử dụng 2e3thay vì 2000.
Kaya

@Kaya: Không, tôi không thể, thật không may: 2e3là một float, và Image.newyêu cầu ints.
nneonneo

oh làm phiền, tôi cho rằng nó sẽ bị ép buộc.
Kaya
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.