Стисніть код на зображенні


17

Це варіація .

Вступ

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

Виклик

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

Приклад:

У нас є рядок "Привіт, світ!"

Hello world!

Перетворимо це у значення ASCII:

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

Зіставте на нього значення RGB (Якщо довжина вихідного коду не ділиться на 3, використовуйте 0s як інші символи):

 __________________________________________________
| 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
Очікування подання на
піет

3
Що таке "найменший образ"? Найменша площа? Чи не завжди це буде прямою лінією? Чи має зображення бути квадратним? Якщо так, то як ми розміщуємо пікселі, які не вміщуються у квадрат? Не могли б ви надати деякі зразкові рішення? (Не обов’язково із вихідним кодом, будь-якою
ланкою

2
Ще не надто ясно. Яка важливіша, найменша площа чи найменше співвідношення ширини до висоти? Що робити, якщо це було три чи будь-яка інша проста піксель? Чи слід робити 1x3 (найменша площа) або 2x2 з відсутньою пікселем (найменше співвідношення)? Яким має бути той відсутній піксель?
DJMcMayhem

3
Це було на пісочниці? Здається, це могло б там деякий час використати.
Морган Трапп

1
Не менше співвідношення ширина / висота технічно буде завжди height = Nі width = 1? Я думаю, ви маєте на увазі ширину / висоту, найближчу до 1.
Suever,

Відповіді:


1

Власне, 12 байт

Q"P6 4 1 255

Спробуйте в Інтернеті!

Ця програма також працює в Серйозно.

Ця програма виводить зображення PPM , прийнятне за замовчуванням .

Вихідне зображення (збільшення 50x):

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-піксельне зображення (простим), тому найбільш квадратне представлення - це простий масив пікселів.

enter image description here

Пояснення

Якщо вставити у вікно команд, анонімна функція автоматично призначить себе змінною 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


Як я цього не вказав, вам не потрібно змушувати його автоматично працювати.
Балінт

Крім того, просто вставте фіктивну змінну замість порожніх абзаців
Балінт

Порожні абзаци? Де?
Shaun H

f=()=>{Тут просто зробіть f=_=>, -1 байт, просто не використовуйте його, JavaScript набрано слабко
Bálint

А параметри, поточний вихід з парен дешевше, ніж обробка не рівномірно поділяється на 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>слід додати):

document.body.appendChild(f())

Потрібно скинути на сторінку таке зображення (збільшене):

QuineImage


Останній піксель повністю порожній, ви можете це зробити, тож це всього 71 піксель?
Балінт

@ Bálint Whoops не побачив порожню піксельну частину. Досить цікаво, що якщо я спробую зробити зображення 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 байти складає 11х2 пікселів:

PowerShell source encoded as picture


1

Node.js, 63 байти

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

Виводить зображення у файл, названий P6у форматі PPM (P6).

Ось перегляд PNG (7x3 пікселів):

enter image description here


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-скрипту, оскільки він читається з локального файлу.

Вихідне зображення:

color coded


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", яке виглядає приблизно так:

The image generated by the code

або масштабувати 100х enter image description here


0

APL (Dyalog) , 33 байти

Потрібно, ⎕IO←0що для багатьох систем за замовчуванням. Також AutoFormat слід вимкнути, щоб зберегти програму точно так, як задано.

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

Створює 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
Що ви збережете та відкиньте сюди, щоб побачити:code image

⎕NR'f'N Зацікавлена R epresentation з програми F

⊃⌽ виберіть останній (літ. перший із зворотного) елемент (рядок)

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

⎕AV⍳ знайдіть відповідні індекси в а томічному V екторі (набір символів

 формат у вигляді тексту

'P', подати лист

() Застосувати таку негласну функцію:

 взяти весь аргумент [і в a]

⎕NPUTN ative [file,] Помістіть [it, з назвою файлу, що складається з]

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


Яку кодову сторінку передбачає це?
Балінт

@ Bálint Див. Редагувати.
Адам

Як виходить отримане зображення на 42 пікселя замість 14? Це тому, що ваші "байти" відповідають багатобайтовим символам?
Сьювер

Виправлено @Suever. Спасибі.
Адам

BTW, я думаю, якщо версія мала до виклику компілятор, то вона є юридичною.
Балінт

-1

Пітон, 81 байт

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

Вихід у форматі PPM.

Ось так виглядає зображення:

Image

Масштаб:

Scaled up


Я не бачу, щоб ти повторно використовувавq
Малтісен

Якщо ви використовуєте P6формат, вам не потрібно перетворюватися на порядкові. Крім того, для 8-бітового RGB 255слід використовувати замість 256.
Мего

Якщо ви використовуєте лише qодин раз, як вам здається, позбудьтеся завдання і замініть його безпосередньо - це заощадить три байти.
Фонд позову Моніки

Схоже, ви друкуєте вміст файлу, але ОП сказав, що вихід має бути окремим файлом .
Адам

Привіт, сказав @QPaysTaxes print'P3\n9 3 256 '+' '.join(map(lambda x:str(ord(x)),open(__file__).read())). Це -4 байти, тхо!
Ерік Аутгольфер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.