एक छवि में अपने कोड को संपीड़ित करें


17

यह एक रूपांतर है।

परिचय

हम सभी शॉर्ट कोड लिखते हैं, क्योंकि कुछ अस्पष्ट कारण हैं , लेकिन हम जो भी करते हैं, वह कम से कम 144 पिक्सेल / बाइट (12px फ़ॉन्ट के साथ) लेगा। लेकिन क्या होगा, अगर हम छवियों में अपने कोड को एनकोड करेंगे? आज तुम्हारा काम है।

चुनौती

आप कार्य अपने स्वयं के स्रोत कोड में पढ़ना चाहते हैं (गैर-उचित quines की अनुमति है, उदाहरण के लिए स्रोत फ़ाइल को सचमुच पढ़ते हैं), और ASCII के आधार पर पिक्सेल के लाल, हरे और नीले घटकों को सेट करके, उसमें से एक छवि बनाएं। चरित्र का मूल्य।

उदाहरण:

हमारे पास स्ट्रिंग है "हैलो वर्ल्ड!"

Hello world!

आइए इसे ASCII मानों में बदलें:

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

आरजीबी मानों को इसे मैप करें (यदि स्रोत कोड की लंबाई 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 |
----------------------------------------------------

हम इसके बाद सबसे छोटे क्षेत्र के साथ छवि बनाते हैं। हमारे पास RGB मानों के 4 सेट हैं, इसलिए सबसे छोटी छवि 2 * 2 छवि होगी, जो शीर्ष बाएँ पिक्सेल से दाईं ओर जा रही है:

यहाँ छवि विवरण दर्ज करें

और हमें यह भयानक रूप से रंगीन छवि मिलती है (आकार बदल जाता है, इसलिए यह कम से कम दिखाई देता है, यह इस तथ्य को भी साबित करता है कि यह कितना छोटा हो सकता है)

नियम / अतिरिक्त जानकारी

  • कोई इनपुट नहीं है
  • आउटपुट एक अलग फ़ाइल के रूप में, या एक अलग विंडो में होना चाहिए।
  • मल्टीबाइट पात्रों के लिए, चरित्र को 2 बाइट्स में विभाजित करें।
  • स्रोत कोड कम से कम 1 बाइट लंबा होना चाहिए
  • छवि को संभावित आकारों में से एक होना चाहिए, जो कि निकटतम चौड़ाई / ऊंचाई का अनुपात 1 है
  • छवि पर पिक्सेल गणना बिल्कुल सीलिंग (बाइट काउंट / 3) होनी चाहिए, कोई अतिरिक्त पिक्सेल नहीं जोड़ा जाना चाहिए

स्कोरिंग

यह एक , इसलिए बाइट्स में सबसे छोटा जवाब जीत जाता है।


7
एक सबमिशन की प्रतीक्षा में ...: P
R

3
"सबसे छोटी छवि" क्या है? सबसे छोटा क्षेत्र? क्या यह हमेशा एक सीधी रेखा नहीं होगी? क्या छवि को वर्गाकार होना चाहिए? यदि हां, तो हम पैड को किस प्रकार से फिट करते हैं जो वर्ग में फिट नहीं होते हैं? आप कुछ नमूना समाधान प्रदान कर सकते हैं? (जरूरी नहीं कि स्रोत कोड, बस किसी भी तार के साथ)
DJMcMayhem

2
अभी भी सुपर स्पष्ट नहीं है। कौन सा अधिक महत्वपूर्ण है, सबसे छोटा क्षेत्र, या सबसे छोटी चौड़ाई आठवें अनुपात में? अगर यह तीन, या किसी अन्य प्राइम नंबर की पिक्सेल हो तो क्या होगा? क्या मुझे पिक्सेल लापता (सबसे छोटा अनुपात) के साथ 1x3 (सबसे छोटा क्षेत्र) या 2x2 करना चाहिए? उस लापता पिक्सेल को क्या होना चाहिए?
DJMcMayhem

3
क्या यह सैंडबॉक्स पर था? ऐसा लगता है कि यह वहाँ कुछ समय के लिए इस्तेमाल किया जा सकता है।
मॉर्गन थ्रैप

1
तकनीकी रूप से हमेशा सबसे छोटी चौड़ाई / ऊँचाई अनुपात नहीं है height = Nऔर width = 1? मुझे लगता है कि आपका मतलब चौड़ाई / ऊँचाई के करीब 1.
स्वेअर

जवाबों:


1

दरअसल, 12 बाइट्स

Q"P6 4 1 255

इसे ऑनलाइन आज़माएं!

यह कार्यक्रम सीरियसली भी काम करता है।

यह कार्यक्रम एक पीपीएम छवि को आउटपुट करता है, जो डिफ़ॉल्ट रूप से स्वीकार्य है

आउटपुट चित्र (50x तक बढ़ा हुआ):

उत्पादन

स्पष्टीकरण:

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
ansविचार के लिए +1 !
दोष

यह काम करने के लिए दो बार चलाने के लिए नहीं है? पहली बार के आसपास, मैं यह उम्मीद करूंगा कि मूल्य के आधार पर एक छवि बनाई जाए, ansजब तक कि पहला रन पूरा न हो जाए, जिसके परिणामस्वरूप ansयह फ़ंक्शन स्वयं बन जाता है। दूसरी बार के आसपास, यह "अपने स्वयं के" कोड का उपयोग कर रहा है (वास्तव में, यह एक अलग लेकिन समान अनाम फ़ंक्शन का कोड है)। कहा जा रहा है, मैं MATLAB नहीं जानता, इसलिए मैं गलत हो सकता है।
एडम

2
@ N @ यह आधार कार्यक्षेत्र में evalinकॉल करने के लिए उपयोग करने की सुंदरता है char(ans)evalinकेवल पर मूल्यांकन किया जाता है चलाने के समय तो भले ही ansपरिभाषित नहीं है जब आप इसे कमांड विंडो में पेस्ट, जब आप कॉल ans()इस अनाम समारोह को चलाने के लिए, ans है परिभाषित और evalinगुमनाम समारोह के अंदर कॉल पहुँच सकते हैं। इसलिए आपको इसे दो बार चलाने की आवश्यकता नहीं है। अगर मैं इस पर भरोसा कर सकता था दो बार चलाया जा रहा है, evalin('base', 'char(ans)')बस द्वारा प्रतिस्थापित किया जाएगाchar(ans)
स्वेअर

4

जावास्क्रिप्ट (ईएस 6) 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

खाली पैराग्राफ? कहाँ पे?
शॉन एच

f=()=>{यहाँ, बस करो f=_=>, -1 बाइट, बस इसका उपयोग न करें, जावास्क्रिप्ट शिथिल टाइप किया गया है
बैलिंट

आह मापदंडों, वर्तमान में पार्न्स को छोड़ना 3 से समान रूप से विभाज्य नहीं होने से सस्ता है
शॉन एच

3

जावास्क्रिप्ट ईएस 6 - 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 पिक्सेल है?
बैलिंट

@ बैलिंट वूप्स, खाली पिक्सेल भाग नहीं देखा। दिलचस्प रूप से पर्याप्त है, अगर मैं छवि को 71x1 बनाने की कोशिश करता हूं, जिससे मेरी बाइट गिनती 214 तक बढ़ जाती है और संयोग से, पिक्सेल की संख्या 72 हो जाती है, जो 9x8 है, जो बदले में बाइट की गिनती 213 पर वापस लाती है। यह अल्फा चैनल गणना को भी बर्बाद कर देता है। । सभी रेकों को पूरा करने वाला वर्तमान सबसे स्वच्छ समाधान, समाधान में 3 निरर्थक वर्ण जोड़ने के लिए है ...
डेंड्रोबियम

2

PowerShell v4, 64 बाइट्स

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

यह अपने स्वयं के फ़ाइलनाम की सामग्री प्राप्त करता है, स्ट्रिंग को चार सरणी के रूप में जोड़ता है, कुछ पीपीएम हेडर जोड़ता है और सामग्री को आउटपुट के रूप में app पर सेट करता है। 64 बाइट्स इसे 11x2 पिक्सेल बनाता है:

PowerShell स्रोत चित्र के रूप में एन्कोडेड है


1

Node.js, 63 बाइट्स

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

नाम की एक फ़ाइल में आउटपुट छवि P6जिसमें है पीपीएम (पी 6) स्वरूप।

यहाँ एक 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

जावा 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कई सिस्टम पर डिफ़ॉल्ट की आवश्यकता होती है। इसके अलावा, 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
यूनिकोड 28 2282 234 4E 50 55 54 2283 29 27 27 2C 2355 2395 2395 2395 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'एन दिलचस्पी आर कार्यक्रम के epresentation

⊃⌽ अंतिम चुनें (उलट के पहले जलाया) तत्व (लाइन)

'␍ɫ␉⍣', चार वर्णों को छोड़ें (फ़िलाटाइप, चौड़ाई, ऊंचाई, अधिकतम)

⎕AV⍳ टोमिक वी  में संबंधित सूचकांकों को खोजें (वर्ण सेट)

 पाठ के रूप में प्रारूपित करें

'P', एक पत्र प्रस्तुत करना

() निम्नलिखित टैसिट फ़ंक्शन लागू करें:

 संपूर्ण तर्क [और में] लें

⎕NPUTएन एटिव [फ़ाइल,] रखो [इसे, जिसमें फ़ाइल नाम शामिल है]

 पहला चरित्र ("पी")


यह कौन सा कोडपेज मानता है?
बैलिंट

@ Bálint देखें संपादित करें।
'21

परिणामी छवि 14 के बजाय 42 पिक्सेल कैसे आती है? क्या यह इसलिए है क्योंकि आपके "बाइट्स" मल्टी-बाइट वर्णों के अनुरूप हैं?
स्वेअर

@Suever फिक्स्ड। धन्यवाद।
एडम

BTW, मुझे लगता है, अगर संस्करण में चुनौती से पहले एक संकलक था, तो यह एक कानूनी है।
बैलिंट

-1

पायथन, 81 बाइट्स

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

आउटपुट पीपीएम प्रारूप में है।

यह वही है जो छवि दिखती है:

छवि

ऊपर पहुंचा:

ऊपर पहुंचा


मैं आपको पुन: प्रयोग करते हुए नहीं देखताq
21

यदि आप P6प्रारूप का उपयोग करते हैं , तो आपको अध्यादेशों में बदलने की आवश्यकता नहीं है। इसके अतिरिक्त, 8-बिट आरजीबी के लिए, के 255बजाय उपयोग किया जाना चाहिए256
मईगो

यदि आप केवल उपयोग करते हैं q एक बार , जैसा कि ऐसा लगता है कि आप करते हैं, असाइनमेंट से छुटकारा पाएं और इसे सीधे स्थानापन्न करें - यह आपको तीन बाइट्स बचाएगा।
निधि मोनिका का मुकदमा

ऐसा लगता है कि आप फ़ाइल सामग्री प्रिंट करते हैं, लेकिन ओपी ने कहा कि आउटपुट एक अलग फ़ाइल के रूप में होना चाहिए
एडम

नमस्कार, @QPaysTaxes ने कहा print'P3\n9 3 256 '+' '.join(map(lambda x:str(ord(x)),open(__file__).read()))। यह -4 बाइट्स है, थो!
1942
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.