ソースコードの画像を出力します(Quine-a-Quineではありません)


29

コードゴルフ:ソースコードの画像を印刷します。

必要条件

  1. 他の場所に保存され、実行時に取得されるバージョンではなく、ソースコード自体のイメージを出力する必要があります。
  2. コードは、手でコピーして結果を再現できるほど読みやすいものでなければなりません。

任意の画像形式が適用可能です。

ボーナス

  • 複数の出力形式を許可する場合、スコアの-10%。
  • コードが「真の」馬である場合、-15%。すなわち、ソースコードは読み込まれませんが、ソースコードは埋め込まれています(例についてはこちらをご覧ください)
  • コードが厳密なクインの場合は-30%-つまり、コードの画像がプログラムに埋め込まれています(Pietソリューション、私はあなたを見ています)。

読みやすくする必要がありますか?
ティムセギーン

7
「他の場所から保存されたバージョンではなく、コードイメージ自体を出力する必要があります。」ソースコードファイルの読み取りは許可されていますか、または要求されていますか?
ティムセギーン14年

29
ホワイトスペースにソリューションを実装しました。結果の画像は非常に退屈に見えます。
ハワード14年

7
以下は、Pietで書かれた興味深い画像の例です。mamememo.blogspot.be
ProgramFOX

回答:


25

シェル

「ソースコードの画像を印刷する」とは、実際に紙に画像を印刷することが許容されることを意味します。

#!/bin/sh
lpr $0

21

7
この回答をコミュニティwikiにできますか?これが、外部からの回答に対する当社の標準ポリシーになりました。しかし、これは本当にクールです!
ジョナサンヴァンマトレ14年

@JonathanVanMatreおっと、すみません。それが私がやろうとしていたことです。別の議論に参加中に質問に答えようとするべきではないと思います。
帽子を持つ男14

2つのうち低い方です。-30%および-15%
Pureferret 14年

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つの質問、小数に異なる表記を使用できますか?少しわかりにくいです。また、なぜ画像がこんなに小さいのですか?読むのは難しいです(確かに私は自分の携帯電話を
使っています

2
@Pureferretはズームインするだけです。ピクセル化されているにもかかわらず、実際には非常に読みやすくなっています。
ルスラン14年

1
@Pureferretだけは...私はそれが英語で異なったことを覚えていません、それらを変更
TimWolla

13

空白、125



















画像ファイルをpbm形式で出力します。

このコードをテストする場合は、[編集]をクリックしてコピーし、<pre>タグ間のすべてをコピーしてください。

出力:

P1 1 1 0

7
スペースやタブ間の微妙な違いを見るために、画面に目を細め手でコピー、 .... プログラム実行します .... ハードドライブの爆発を
ジョナサン・ヴァンMatre

17
この答えは要件2を満たしていません。画像は、ソースコードを再現するのに十分に読み取り可能ではありません。
user2357112は

2
@ user2357112しかし、それを証明することはできません。これが私がここで悪用している抜け穴です。
duci9y 14年

21
はい、できます。情報理論を使用して。完全に厳密な正当化は600文字のコメントの範囲を超えますが、その要点は、イメージが機能しないコードのイメージと同一であることです。
user2357112は

3
フランス語はご容赦ください、しかしBS!ルールでは、コードは判読可能でなければならないことが明記されています。空白でコードを記述しても、それは否定されません。これは、選択時にSublime Textに表示されるプログラムです。i.imgur.com / A2ZaQwI.pngこれは判読可能です。プログラムの出力は何でもありません。また、プログラムが実際に出力するのがソースコードなのか、文字通り空のイメージなのかについても説明していません。
nitro2k01 14年

13

Mathematica、37 31文字

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

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

ここに画像の説明を入力してください

mathematica.stackexchange.comの回答に触発されまし


説明してください...#nの目的は何ですか?たぶん私たちはそれを理解できるでしょう。
Pureferret 14年

少なくとも、フロントエンドがなくても機能します。(Export["/tmp/out.png",%]このコマンドを実行した後に試してみました)
Ruslan 14年

2
@Pureferret #nn、(その&時点で作成された)純粋関数のth引数を意味します。式全体がに展開されますRasterize[Defer[#0[Defer,Rasterize]]]。ここ#0で、元の純粋な関数の再帰呼び出しです。ある意味では、これは厳密なクインではありませんが、動作するためにフロントエンドを必要とせず、IMOは素晴らしいソリューションです。
ルスラン14年

コマンドとコマンドのオブジェクトの両方としてDefer []とRasterize []の使用を賞賛します。このように再帰が提示されるのを見たことがありません。
マイケルスターン14年

10

AppleScript、68 37

さて、zshでImageMagickを呼び出すことができれば、これも有効です。私はまだ自分の満足のためにもっとエレガントで風変わりなものをハッキングしていますが、純粋なゴルフのように、ここにあります:

新しいバージョン

do shell script "screencapture q.jpg"

古いバージョン

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

これはまだ打ち負かされると思いますが、冗長な古いAppleScriptは、これを簡潔に見事に模倣しています。

馬を止める

do shell script "screencapture -c"

3
定義上、クインはソースコードを唯一の出力として生成しますが、それがこの質問に当てはまるかどうかはわかりません。nyx.net/~gthompso/quine.htm
duci9y

ええ、私は実際に独自のウィンドウのコード領域のみを選択する方法を見つけようとしていますが、AppleScriptの領土にフラグを立てるためにこれを投げるだろうと思いました。
ジョナサンヴァンマトレ14年

私はこれを有効であると考えており、この種のものを期待していました。
Pureferret

厳密な馬ではありません。(プログラムで独自のソースコードを生成しません。)
nitro2k01 14年

3
技術的には、これらの言語はいずれもソースコードとして画像を使用しないため、Pietの回答を除き、これらのいずれも厳密なクインになることはできません。しかし、私はもっと厳密なバージョンを作成することをまだ決心しています。:)
ジョナサンヴァンマトレ14年

8

Mathematica、83

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

ここに画像の説明を入力してください


1
厳密な馬ではありません。(プログラムで独自のソースコードを生成しません。)
nitro2k01 14年

1
インポートされた場合でも、フロントエンドなし(mathまたはMathKernel)では機能しません<<JavaGraphics`
ルスラン14年

8

Sh、X、ImageMagick 18.9:

 import -window root a.jpg

これは、ImageMagickがあるすべてのシェルで機能するはずです。

コードの前に追加するだけで印刷clear &&するには、26.1になります。

clear && import -window root a.jpg

サンプル出力:

ここに画像の説明を入力してください


私のコンピューターでテストしたところ、動作します。
user12205 14年

4
Linuxコンソールで動作しませんでした。要件にXを追加できます。
イルマリカロネン14年

2
厳密な馬ではありません。(プログラムで独自のソースコードを生成しません。)
nitro2k01 14年

1
@nitro「Quine」という用語を誤って使用した可能性がありますが、私の投稿の最初の行では、ソースコードのイメージの出力についてのみ言及しています。元の意図を明確にするために、また真/厳格なクインのために編集しています。
Pureferret

1
好奇心が強い、ビットコインとライトコインの財布が見えます。3年後、深刻な利益がありますか?:D
アルバートレンショー

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>

デモ:http : //jsfiddle.net/E2738/2/

画像を右クリックしてPNGとして保存できます


2
で終わる<//script>
チャールズのチャールズ14年

1
フィドルの11行目の終わりに変更+wrapText+"<//script>";します+wrapText+"<\/script>";
ルーク14年

@Charlesそれを指摘してくれてありがとう。一定。
クライドロボ14年

4

Java、570-10%-15%= 427.5

(「ファイルパス」を含む)、554-10%-15%= 415.5(「ファイルパス」を含まない)
削除BufferedImageしてくれたAndreasに感謝java.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文字を取り除くことができます
アンドレアス14年

4

Javascript + 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 14年

$?jQueryも使用していますか?
クライドロボ14年

@ClydeLoboうん、そうです。待ってください、JQueryなしでJavascriptを実行できますか?誰が考えたでしょう!
ピエールArlaud

@ClydeLoboはい、そうです。ただし、ライブラリは許可する必要があります。stdio.hxD を使用するCプログラムと実際には違いはありません。ただし、jQueryを使用せずにプログラムを作成するのは簡単です。ただ、交換する$('<canvas/>')[0]document.createElement('canvas')して$('body').appenddocument.write。jQueryはバイトを節約してくれました。
aebabis 14年

3

zsh、57×0.9 = 51.3

出力ファイル名を引数として渡します。

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

生産物:

出力例


1
それはzshまたはimagemagickですか?
カヤ14年

@カヤ:まあ、両方。言語はzsh(またはbash、ただしPosixではありません)、ライブラリ/ツールはImageMagick(または、必要に応じてGraphicsMagick)です。GDを使用するPHPまたはRMagickを使用するRubyなどです。
Ry- 14年

1
@Pureferret:追加されました。
Ry- 14年

厳密な馬ではありません。(プログラムで独自のソースコードを生成しません。)
nitro2k01 14年

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

これは改行なしでかなりugいですが、残念ながらそれらは存在しない必要があります。テキストレンダリング関数は制御文字をまったく理解しないため、コード内の改行は出力で手動でレンダリングする必要があります。

同じコードですが、読みやすくするためにいくつかの改行が追加されています。

#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にハードコードされていることに注意してください。さまざまなフォントの違いに対応するために、右マージンと先頭にかなりの超過分を追加しました。ただし、さらに大きくしたい場合は、おそらく寸法も変更する必要があります。)

プログラムをビルドするコマンドは次のとおりです。

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

プログラムは、q.ttf実行時に現在のディレクトリに呼び出されるフォントファイルがあると想定します。次のコマンドを実行することにより、事前にこれを処理しました(ほとんどの最新のLinuxで動作するはずです)。

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

(代わりに、お気に入りのTrueTypeフォントを自由にインポートしてください。)

プログラムの実行後、イメージ出力は、という名前のファイルの現在のディレクトリに作成されますq.bmp。残念ながら、このプログラムが提供する出力形式はWindowsビットマップファイルのみです。さらに出力形式を追加するには、より多くのライブラリでリンクする必要があります。

このプログラムは、非単純なリテラル値を導入するためにC99の構文を利用するため、定義する必要のある変数の数を大幅に削減することに注意してください。これは、より多くのCゴルファーが活用すべきものです。


2

C#-498-15%= 423.3

これはおそらくもっとゴルフできるでしょう。これまでにC#でクインやこの種のグラフィックを作成したことはありません。

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

出力: ここに画像の説明を入力してください

別の形式のサポートを追加するのは簡単です。しかし、それが価値があるかどうかはわかりません。



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])

使用法:

python imgquine.py quine.jpg

これは、コマンドラインで指定されたファイルに出力を描画する真のクインです。ファイル形式は、ファイル名の拡張子を変更するだけで設定されます(quine.jpgJPEGやquine.pngPNGなど)。

出力例(2000x20画像):

クイン出力


2e3代わりにを使用して、いくつかの文字を保存できます2000
カヤ14年

@カヤ:いいえ、残念ながらできません:2e3はでありfloat、s をImage.new要求しintます。
nneonneo 14年

わざわざ、強制されると思いました。
カヤ14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.