이미지에서 코드 압축


17

이것은이다 변화.

소개

모호한 이유가 있기 때문에 우리는 모두 짧은 코드를 작성 하지만, 우리가 무엇을하든 최소 144 픽셀 / 바이트 (12px 글꼴)를 차지합니다. 그러나 코드를 이미지로 인코딩하면 어떻게 될까요? 이것이 오늘 당신의 임무입니다.

도전

작업은 자체 소스 코드를 읽고 (예를 들어 문자 파일을 읽는 등의 적절하지 않은 quines가 허용됨) 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
Piet 제출을 기다리는 중 ... : P
Rɪᴋᴇʀ

3
"가장 작은 이미지"는 무엇입니까? 가장 작은 지역? 이것이 항상 직선이 아닐까요? 이미지가 정사각형이어야합니까? 그렇다면 사각형에 맞지 않는 픽셀을 어떻게 채우는가? 샘플 솔루션을 제공해 주시겠습니까? (소스 코드가 아닌 문자열 만 가능)
DJMcMayhem

2
여전히 명확하지 않습니다. 가장 중요하거나 가장 작은 영역 또는 가장 작은 너비 대 높이 비율은 어느 것입니까? 세 개 또는 다른 소수의 픽셀이면 어떻게 되나요? 1x3 (가장 작은 영역) 또는 2x2 (픽셀이없는 상태 (가장 작은 비율))를 수행해야합니까? 누락 된 픽셀은 무엇입니까?
DJMcMayhem

3
샌드 박스에 있었습니까? 그곳에서 얼마 동안 사용했을 것 같습니다.
Morgan Thrapp 2016 년

1
기술적으로 항상가는 작은 너비 / 높이 비율이 아닌가요 height = Nwidth = 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으로 출력하지 않습니까?
Adám

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

이 작업을 두 번 실행하지 않아도됩니까? 처음으로, 나는 ans첫 번째 실행이 완료 될 때까지의 값 을 기반으로 이미지를 생성 ans하여 함수 자체가 될 것으로 기대 합니다. 두 번째로, "자체"코드를 사용하고 있습니다 (실제로는 별개의이지만 동일한 익명 함수의 코드 임). 그렇기 때문에 MATLAB을 모르므로 잘못되었을 수 있습니다.
Adám

2
@ Nᴮᶻ 기본 작업 공간에서 evalin호출 하는 데 사용 하는 것의 아름다움입니다 char(ans). 는 evalin단지에서 평가 런타임 그래서 비록 ans당신이 명령 창에 붙여 넣을 때 호출 할 때, 정의되지 않은 ans()이 익명 함수를 실행하도록 ans 되어 정의와 evalin익명 함수 내에서 호출에 액세스 할 수 있습니다. 따라서 두 번 실행할 필요가 없습니다. 내가 두 번 달리는 것에 의지 할 수 있다면 evalin('base', 'char(ans)')간단하게 대체 될 것입니다char(ans)
Suever

4

자바 스크립트 (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'))
}

산출

자바 스크립트


내가 지정하지 않았으므로 자동으로 실행할 필요가 없습니다.
Bálint

또한 빈 단락을 사용하는 대신 더미 변수를 삽입하십시오
Bálint

빈 단락? 어디?
Shaun H

f=()=>{여기, 그냥 f=_=>-1 바이트, 그냥 사용하지 마십시오, 자바 스크립트가 느슨하게 입력되었습니다
Bálint

아파치, 파 렌스를 떠나는 전류는 3으로 균등하게 나눌 수없는 처리보다 저렴하다
Shaun H

3

자바 스크립트 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>추가 할 것으로 가정 ) :

document.body.appendChild(f())

다음 이미지를 페이지에 덤프해야합니다 (확대).

QuineImage


마지막 픽셀이 완전히 비어 있습니다. 총 71 픽셀입니까?
Bálint

@ Bálint Whoops, 빈 픽셀 부분을 보지 못했습니다. 흥미롭게도, 이미지를 71x1로 만들려고하면 바이트 수가 214로 증가하고 결국 픽셀 수는 9x8로 72로 증가하여 바이트 수가 다시 213으로 돌아갑니다. 알파 채널 계산을 망칩니다. . 모든 요구 사항을 충족하는 현재 가장 깨끗한 솔루션은 솔루션에 3 개의 중복 문자를 추가하는 것입니다.
Dendrobium

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

자바 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"를 작성합니다.

코드에 의해 생성 된 이미지

또는 스케일 100 배 여기에 이미지 설명을 입력하십시오


0

APL (Dyalog) , 33 바이트

⎕IO←0많은 시스템에서 기본값이 필요합니다 . 또한 자동 형식은 프로그램을 정확하게 유지하려면 꺼져 있어야합니다.

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

16 진 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
유니 코드 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

작성 P: P3 11 1255 185186253 78 80 85 84187248 13 80 1194205253 65 86178 13 3 11 1 255 13194187 200253 78 82 13 22 13
저장하려면 여기 를 클릭하십시오.코드 이미지

⎕NR'f'N ested R의 프로그램의 epresentation F

⊃⌽ 마지막 (반전 된 첫 번째 요소) 요소 (선)를 선택합니다

'␍ɫ␉⍣', 네 문자 앞에 붙습니다 (파일 형식, 너비, 높이, 최대)

⎕AV⍳A tomic V ector (문자 세트)  에서 해당 색인을 찾습니다.

 텍스트 형식

'P', 편지를 붙이다

() 다음 암묵적 기능을 적용하십시오.

 전체 논쟁을 받아들이고

⎕NPUT기본 [file,] Put [파일 이름이 다음과 같이 구성됨]

 첫 문자 ( "P")


이것은 어떤 코드 페이지를 가정합니까?
Bálint

@ Bálint 편집을 참조하십시오.
Adám

결과 이미지가 14 개 대신 42 픽셀 인 이유는 무엇입니까? "바이트"가 멀티 바이트 문자에 해당하기 때문입니까?
Suever

@Suever 고정. 감사.
Adám

BTW, 나는 도전에 앞서 버전이 컴파일러를 가지고 있다면 그것은 합법적이라고 생각합니다.
Bálint

-1

파이썬, 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.
Mego

q한 번만 사용 하면 할당을 제거하고 직접 대체하여 3 바이트를 절약 할 수 있습니다.
기금 모니카의 소송

파일 내용을 인쇄하는 것처럼 보이지만 OP는 출력이 별도의 파일이어야합니다 .
Adám

안녕하세요, @QPaysTaxes가 말했습니다 print'P3\n9 3 256 '+' '.join(map(lambda x:str(ord(x)),open(__file__).read())). -4 바이트입니다!
아웃 골퍼 Erik 14
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.