Сжатие вашего кода в изображении


17

Это вариация .

Вступление

Мы все пишем короткий код, потому что по некоторым неясным причинам , но что бы мы ни делали, они будут занимать не менее 144 пикселей / байт (со шрифтом 12 пикселей). Но что произойдет, если мы закодируем наш код в изображениях? Это ваша задача сегодня.

Вызов

Ваша задача - читать в своем собственном исходном коде (допускаются неправильные кавычки, например, буквальное чтение исходного файла) и создавать из него изображение, устанавливая красный, зеленый и синий компоненты пикселя на основе ASCII ценность персонажа.

Пример:

У нас есть строка "Привет, мир!"

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
  • Количество пикселей на изображении должно быть в точности равно количеству байтов / 3, дополнительные пиксели не должны добавляться

счет

Это , поэтому выигрывает самый маленький ответ в байтах.


7
В ожидании подачи Питом ...: P
Rɪᴋᴇʀ

3
Что такое "самое маленькое изображение"? Самая маленькая область? Разве это не всегда будет прямой линией? Изображение должно быть квадратным? Если так, то как мы дополняем пиксели, которые не помещаются в квадрат? Не могли бы вы предоставить некоторые примеры решений? (Не обязательно с исходным кодом, просто любая строка)
DJMcMayhem

2
Все еще не супер ясно. Что важнее, наименьшая площадь или наименьшее отношение ширины к высоте? Что, если это было три или любое другое простое число пикселей? Должен ли я сделать 1x3 (наименьшая площадь) или 2x2 с отсутствующим пикселем (наименьшее соотношение)? Каким должен быть этот недостающий пиксель?
DJMcMayhem

3
Это было в песочнице? Кажется, он мог бы провести там некоторое время.
Морган Трепп

1
Не наименьшее соотношение ширина / высота технически будет всегда height = Nи width = 1? Я думаю, что вы имеете в виду ширину / высоту, ближайшую к 1.
Suever

Ответы:


1

На самом деле, 12 байтов

Q"P6 4 1 255

Попробуйте онлайн!

Эта программа также работает серьезно.

Эта программа выводит изображение PPM , которое является приемлемым по умолчанию .

Выходное изображение (увеличено в 50 раз):

выход

Объяснение:

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
ОП: Вывод должен быть в виде отдельного файла . Разве это не выводит содержимое файла в 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
+1 за ansидею!
Flawr

Разве это не должно быть запущено дважды, чтобы работать? В первый раз я ожидал, что он создаст образ на основе значения ansдо первого запуска, в результате чего ansстанет самой функцией. Во второй раз он использует «свой» код (ну, на самом деле, это код отдельной, но идентичной анонимной функции). При этом я не знаю MATLAB, поэтому могу ошибаться.
Адам

2
@ Nᴮᶻ В этом и заключается прелесть использования evalinвызова char(ans)в базовом рабочем пространстве. Значение evalinоценивается только во время выполнения, поэтому, даже если ansоно не определено, когда вы вставляете его в командное окно, когда вы вызываете ans()для запуска эту анонимную функцию, ans оно определено, и evalinвызов внутри анонимной функции может получить к нему доступ. Таким образом, вам не нужно запускать его дважды. Если бы я мог рассчитывать на то, что он будет запущен дважды, 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


Как я не уточнил, вам не нужно делать это автоматически.
Балинт

Кроме того, просто вставьте фиктивную переменную вместо использования пустых абзацев
Bálint

Пустые абзацы? Где?
Шон Х

f=()=>{Вот, просто делайте f=_=>, -1 байт, просто не используйте его, javascript свободно напечатан
Bálint

Ах параметры, ток, выходящий из паренсов, дешевле, чем обработка, делимая неравномерно на 3
Шон Х

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)

Ungolfed:

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 Ой, не видел пустую часть пикселя. Интересно, что если я попытаюсь сделать изображение 71x1, это увеличит мой счетчик байтов до 214 и, между прочим, счетчик пикселей до 72, что составляет 9x8, что, в свою очередь, возвращает количество байтов обратно до 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 байт

Golfed

<?$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», который выглядит следующим образом:

Изображение, сгенерированное кодом

или масштабируется в 100 раз введите описание изображения здесь


0

APL (Dyalog) , 33 байта

Требуется ⎕IO←0по умолчанию во многих системах. Кроме того, автоформат должен быть выключен, чтобы сохранить программу точно так, как указано.

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

Шестнадцатеричный 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

Создает P: P3 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 Заинтересованное R epresentation из программы F

⊃⌽ выберите последний (освещенный. первый из перевернутых) элементов (строки)

'␍ɫ␉⍣', добавить четыре символа (тип файла, ширина, высота, максимум)

⎕AV⍳ найти соответствующие индексы в A Tomic V Ector (набор символов

 форматировать как текст

'P', написать письмо

() Применить следующую молчаливую функцию:

 принять весь аргумент [и в]

⎕NPUTN ческие [файл] Put [это, с именем файла , состоящее из]

 первый символ ("P")


Какую кодовую страницу это предполагает?
Балинт

@ Bálint См редактировать.
Адам

Почему полученное изображение составляет 42 пикселя вместо 14? Это потому, что ваши "байты" соответствуют многобайтовым символам?
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один раз, как кажется, избавитесь от назначения и замените его напрямую - это сэкономит вам три байта.
Фонд Моника иск

Похоже, вы печатаете содержимое файла, но OP сказал, что вывод должен быть в виде отдельного файла .
Адам

Здравствуйте, @QPaysTaxes сказал print'P3\n9 3 256 '+' '.join(map(lambda x:str(ord(x)),open(__file__).read())). Это -4 байта, хотя!
Эрик Outgolfer
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.