画像内のコードを圧縮する


17

これは、バリエーション。

前書き

いくつかのあいまいな理由のため、私たちはすべて短いコードを記述しますが、何をするにしても、少なくとも144ピクセル/バイト(12pxフォント)を占有します。しかし、コードを画像にエンコードするとどうなりますか?これが今日のあなたの仕事です。

チャレンジ

あなたのタスクは、独自のソースコードを読み込み(非適切なクインは許可されます。たとえば、文字通りソースファイルを読み込みます)、ASCIIに基づいてピクセルの赤、緑、青のコンポーネントを設定することで、そこから画像を作成します文字の値。

例:

「Hello world!」という文字列があります。

Hello world!

これをASCII値に変換しましょう。

72 101 108 108 111 32 119 111 114 108 100 33

RGB値をそれにマップします(ソースコードの長さが3で割り切れない場合、残りの文字として0を使用します)。

 __________________________________________________
| R | G | B || R | G | B || R | G | B || R | G | B |
----------------------------------------------------
|72 |101|108||108|111|32 ||119|111|114||108|100|33 |
----------------------------------------------------

次に、その中から最小の領域で画像を作成します。4組のRGB値があるため、最小の画像は左上のピクセルから右に向かって2 * 2の画像になります。

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

そして、このひどく色付けされた画像を取得します(サイズ変更されたので、少なくとも目に見えるようになり、それがどれだけ小さいかを証明します)

ルール/追加情報

  • 入力がありません
  • 出力は、別のファイルとして、または別のウィンドウにある必要があります。
  • マルチバイト文字の場合、文字を2バイトに分割します。
  • ソースコードは少なくとも1バイトの長さが必要です
  • 画像は可能なサイズのもので、幅と高さの比が1に最も近いものでなければなりません。
  • 画像のピクセル数は正確にceil(byte count / 3)である必要があり、余分なピクセルは追加されません

得点

これはなので、バイト単位の最小の答えが勝ちです。


7
ピエトの提出を待っています...:P
Rɪᴋᴇʀ16年

3
「最小の画像」とは何ですか?最小面積?これは常に直線ではありませんか?画像は正方形である必要がありますか?その場合、正方形に収まらないピクセルをどのようにパディングしますか?サンプルソリューションを提供できますか?(必ずしもソースコードではなく、任意の文字列)
DJMcMayhem

2
まだ非常に明確ではありません。最も重要なのは、最小の面積、最小の幅と高さの比ですか?それが3、または他の素数のピクセルの場合はどうなりますか?1x3(最小面積)または2x2(ピクセル不足)(最小比)を実行する必要がありますか?その欠落しているピクセルはどうあるべきですか?
DJMcMayhem

3
これはサンドボックスにありましたか?そこにしばらく時間がかかったようです。
モーガンスラップ

1
技術的には、最小の幅と高さの比率は常にそうではheight = Nありwidth = 1ませんか?1に最も近い幅/高さを意味すると思います
-Suever

回答:


1

実際には、12バイト

Q"P6 4 1 255

オンラインでお試しください!

このプログラムはまじめに動作します。

このプログラムはPPMイメージを出力しますが、これはデフォルト受け入れられます

出力画像(50倍に拡大):

output

説明:

Q"P6 4 1 255 
Q             push source code
 "P6 4 1 255  push header for a 4x1 raw (type P6) 8-bit PPM image (the closing " is implicitly added at EOF)

2
OP:出力は別個のファイルとして作成する必要があります。これは単にファイルの内容をSTDOUTに出力しませんか?
アダム

8

MATLAB、81 72 69バイト

@()image(shiftdim(reshape(evalin('base','char(ans)'),3,1,23)/255,1.))

これにより、コマンドウィンドウに貼り付けてを使用して実行できる匿名関数が作成されますans()。実行すると、これにより23ピクセルの画像(素数)が作成されるため、最も正方形の表現はピクセルの単純な配列になります。

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

説明

コマンドウィンドウに貼り付けられると、匿名関数は自動的に変数に割り当てられますans。次に、匿名関数内から、次を使用します。

evalin('base', 'char(ans)')

これchar(ans)は、匿名関数のローカル名前空間内ではなく、コマンドウィンドウの名前空間内で評価されます。したがって、匿名関数自体を文字列表現に変換できます。

次に、より簡単な次の操作があります。

%// Reshape the result into a 3 x 1 x 23 matrix where the first dimension is RGB
%// due to column-major ordering of MATLAB
R = reshape(string, 3, 1, 23);

%// Divide the result by 255. This implicitly converts the char to a double
%// and in order for RGB interpreted properly by MATLAB, doubles must be
%// normalized between 0 and 1.
R = R / 255;

%// Shift the dimensions to the left 1 to move the RGB channel values into
%// the third dimension. Note the extra decimal point. This is because it
%// is far shorter to lengthen the code by one byte than to pad the string
%// to give us a length divisible by 3
R = shiftdim(R, 1.);

%// Display the RGB image
image(R);

1
ansアイデアのために+1 !
-flawr

動作するためにこれを2回実行する必要はありませんか?初めてans、最初の実行が完了するまで、持っている値に基づいてイメージを作成し、その結果ans関数自体になることを期待します。2回目は、「独自の」コードを使用しています(実際には、独立した同一の匿名関数のコードです)。そうは言っても、私はMATLABを知らないので、間違っているかもしれません。
アダム

2
@Nᴮᶻこれは、ベースワークスペースでevalin呼び出すために使用することの利点char(ans)です。evalinのみで評価され、実行時ので、たとえansあなたがコマンドウィンドウに貼り付けたときに呼び出すときに、定義されていないans()、この無名関数を実行するようにans されて定義されており、evalin匿名関数の内部呼び出しがそれにアクセスすることができます。したがって、2回実行する必要はありません。2回実行されることに頼ることができればevalin('base', 'char(ans)')、単純に置き換えられますchar(ans)
-Suever

4

Javascript(ES6)324 312 309バイト

私はこれが少しゴルフできると確信しています:

f=()=>{s="f="+f;l=s.length/3;c=document.createElement('canvas');for(i=0;++i<l/i;l%i?0:w=i,h=l/w);c.s=c.setAttribute;c.s("width",w);c.s("height",h);(i=(t=c.getContext('2d')).createImageData(w,h)).data.map((a,b)=>i.data[b]=b%4<3?s.charCodeAt(b-~~(b/4)):255);t.putImageData(i,0,0);open(c.toDataURL('image/png'))}
  • キャンバスを作成します
  • イメージを構築します
  • 新しいタブで画像のデータURLを開きます

読みやすくするための新しい行:

f=()=>{
    s="f="+f;l=s.length/3;
    c=document.createElement('canvas');
    for(i=0;++i<l/i;l%i?0:w=i,h=l/w);
    c.s=c.setAttribute;
    c.s("width",w);
    c.s("height",h);
    (i=(t=c.getContext('2d')).createImageData(w,h)).data.map((a,b)=>i.data[b]=b%4<3?s.charCodeAt(b-~~(b/4)):255);
    t.putImageData(i,0,0);
    open(c.toDataURL('image/png'))
}

出力

JavaScript


指定しなかったので、自動実行する必要はありません。
バリント

また、ちょうど空の段落を使用する代わりにダミー変数を挿入
バリント

空の段落ですか?どこ?
ショーンH

f=()=>{ここでは、ただやるf=_=>、-1バイトを、それを使用していない、Javascriptを緩く型付けされた
バリント

Ahパラメータ、現在の括弧からの脱出は、3で割り切れない処理よりも安価です。
Shaun H

3

Javascript ES6-216バイト

f=(  )=>((d=(x=(v=document.createElement`canvas`).getContext`2d`).createImageData(v.width=9,v.height=8)).data.set([..."f="+f].reduce((p,c,i)=>(c=c.charCodeAt(0),[...p,...i%3<2?[c]:[c,255]]))),x.putImageData(d,0,0),v)

ゴルフをしていない:

f=(  )=>(                                           // define function f (extra spaces to account for missing pixel + alpha channel calculation)
 (d=(x=(v=document.createElement`canvas`).          // assign html5 canvas to v
          getContext`2d`).                          // assign graphics context to x
          createImageData(v.width=9,v.height=8)).   // create & assign ImageData to d
                                                    //   set width and height of both d and v
 data.set([..."f="+f].                              // get f's source, convert to array of chars
   reduce((p,c,i)=>(c=c.charCodeAt(0),              // convert char array to int array
                    [...p,...i%3<2?[c]:[c,255]]))), // insert alpha values 255
 x.putImageData(d,0,0),                             // draw source RGBA array to canvas
 v)                                                 // return canvas

注:fキャンバスを返します。

実行例(<body>追加するaがあると仮定):

document.body.appendChild(f())

次の画像をページにダンプする必要があります(拡大):

QuineImage


最後のピクセルは完全に空です、あなたはそれを作ることができますので、それは合計で71ピクセルですか?
バリント

@Bálintおっと、空のピクセル部分が見えませんでした。興味深いことに、画像71x1を作成しようとすると、バイトカウントが214に増加し、ピクセルカウントが72に増加し、9x8になります。これにより、バイトカウントが213に戻ります。 。すべてREQSを満たしている現在のクリーンなソリューションを溶液に3つの冗長文字を追加することです...
デンドロビウム

2

PowerShell v4、64バイト

"P6 11 2 255"+[char[]](gc $MyInvocation.MyCommand.Name)|sc a.ppm

独自のファイル名のコンテンツを取得し、文字列をchar配列としてキャストし、PPMヘッダーを追加して、コンテンツを出力としてa.ppmに設定します。64バイトで11x2ピクセルになります:

画像としてエンコードされたPowerShellソース


1

Node.js、63バイト

(F=x=>require('fs').writeFile('P6','P6 7 3 255 (F='+F+')()'))()

名前のファイルに出力した画像P6であるPPM(P6)形式。

これがPNGレンディションです(7x3ピクセル):

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


1

PHP、226バイト

ゴルフ

<?$b=strlen($w=join(file('p.php')));$z=imagecreatetruecolor(5,15);for($c--;++$c<$b+1|$i%3;$i%3?:$a=!imagesetpixel($z,$x%5,(int)$x++/5,$a))$a+=($c<$b?ord($w[$c]):0)*256**(2-$i++%3);header("Content-Type:image/png");imagepng($z);

ゴルフされていないバージョン

<?
// Read the file into an array and join it together. Store the length of the resulting string.
$b=strlen($w=join(file('p.php')));

// Create the image. Our file is 226 bytes, 226/3 = 75 = 5 * 15
$z=imagecreatetruecolor(5,15);

// Loop through the script string, converting each character into a pixel.
// Once three characters have been converted, draw the pixel with the converted RGB value and reset the color to 0.
for($c--;++$c<$b+1|$i%3;$i%3?:$a=!imagesetpixel($z,$x%5,(int)$x++/5,$a))$a+=($c<$b?ord($w[$c]):0)*256**(2-$i++%3);

// Tell the program we're sending an image
header("Content-Type:image/png");

// And send it!
imagepng($z);

このスクリプトを「p.php」という名前のファイルに入力して実行します。これはローカルファイルから読み取るため、PHPスクリプトを実行する独自の方法が必要です。

出力画像:

色分け


0

Java 511文字

ソリューションの長さは、これらの写真が本当に素晴らしいので、素晴らしい写真になります。

import java.awt.image.*;import java.io.*;import java.nio.file.*;import javax.imageio.*; public class Q{public static void main(String[]a)throws Throwable{int w=19,h=9;byte[]e=Files.readAllBytes(Paths.get("Q.java"));String t=new String(e);while(t.length()%3!=0)t+='\0';BufferedImage I=new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);int r,c=r=0;for(int i=0;i<t.length();i++){I.setRGB(c,r,255<<24|t.charAt(i)<< 16|t.charAt(++i)<< 8|t.charAt(++i));if(++c==w){c=0;r++;}}ImageIO.write(I,"png",new File("Q.png"));}}

目に見えない末尾の改行があることに注意してください!「Q.java」である必要があるソースファイルを読み取り、次のような画像「Q.png」を作成します。

コードによって生成された画像

またはスケーリング100x ここに画像の説明を入力してください


0

APL(Dyalog)、33 バイト

⎕IO←0多くのシステムでデフォルトである必要があります。また、与えられたとおりにプログラムを保存するには、オートフォーマットをオフにする必要があります。

(⊂⎕NPUT⊃)'P',⍕⎕AV⍳'␍ɫ␉⍣',⊃⌽⎕NR'f'  

Hex B9 BA FD 4E 50 55 54 BB F8 0D 50 0D C2 CD FD 41 56 B2 0D 03 0B 01 FF 0D C2 BB C8 FD 4E 52 0D 16 0D
Unicode 28 2282 2395 4E 50 55 54 2283 29 27 50 27 2C 2355 2395 41 56 2373 27 0D 026B 08 2363 27 2C 2283 233D 2395 4E 52 27 66 27

作成PP3 11 1 255 185 186 253 78 80 85 84 187 248 13 80 13 194 205 253 65 86 178 13 3 11 1 255 13 194 187 200 253 78 82 13 22 13
あなたが保存して、ドロップここで見ることは:コード画像

⎕NR'f'N ested Rのプログラムのepresentation F

⊃⌽ 最後の(反転した最初の)要素を選択します(行)

'␍ɫ␉⍣', 4文字(ファイルタイプ、幅、高さ、最大)を付加します

⎕AV⍳A tomic V  で対応するインデックスを見つける(文字セットで

 テキストとしてフォーマット

'P', 手紙を追加する

()  次の暗黙関数を適用します。

 引数全体を取ります[そしてaに]

⎕NPUTN ative [ファイル] のPut [it、からなるファイル名]

 最初の文字(「P」)


これはどのコードページを想定していますか?
バリント

@Bálint編集を参照してください。
アダム

結果の画像が14ではなく42ピクセルになるのはなぜですか?これは、「バイト」がマルチバイト文字に対応しているためですか?
-Suever

@Suever修正済み。ありがとう。
アダム

ところで、私は、バージョンがチャレンジの前にコンパイラーを持っていたなら、それは正当なものだと思います。
バリント

-1

Python、81バイト

q=open(__file__).read()
print'P3\n9 3 256 '+' '.join(map(lambda x:str(ord(x)),q))

出力はPPM形式です。

これは画像がどのように見えるかです:

画像

スケールアップ:

スケールアップ


再利用されていないq
-Maltysen

このP6形式を使用する場合、序数に変換する必要はありません。さらに、8ビットRGBの場合は、の255代わりに使用する必要があり256ます。
メゴ

使用しqているように1度しか使用しない場合は、割り当てを取り除き、直接代入してください。3バイト節約できます。
ファンドモニカの訴訟

ファイルの内容を印刷しているように見えますが、OPは「出力は個別のファイルである必要があります」と言いました
アダム

こんにちは、@ QPaysTaxesは言いましたprint'P3\n9 3 256 '+' '.join(map(lambda x:str(ord(x)),open(__file__).read()))。-4バイトです。
エリックアウトゴルファー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.