Bir görüntüdeki kodunuzu sıkıştırın


17

Bu bir çeşididir.

Giriş

Hepimiz kısa kod yazıyoruz, çünkü bazı belirsiz nedenler var , ancak ne yaparsak yapalım, en az 144 piksel / bayt (12 piksellik yazı tipiyle) yer kaplayacak. Ancak kodumuzu resimlerde kodlarsak ne olur? Bugünkü göreviniz bu.

Meydan okuma

Göreviniz kendi kaynak kodunuzu okumaktır (ASCII'ye dayalı bir pikselin kırmızı, yeşil ve mavi bileşenlerini ayarlayarak, uygun olmayan sorgulara izin verilir, örneğin kaynak dosyayı tam anlamıyla okumak) ve bundan bir görüntü oluşturmaktır. karakterin değeri.

Misal:

"Merhaba dünya!"

Hello world!

Bunu ASCII değerlerine dönüştürelim:

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

RGB değerlerini buna eşleyin (Kaynak kodun uzunluğu 3 ile bölünemezse, kalan karakterler olarak 0 kullanın):

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

Ardından, görüntüyü en küçük alanı dışarıda oluşturuyoruz. 4 RGB değerine sahibiz, bu nedenle en küçük resim 2 x 2 resim olacak ve sol üst pikselden sağa doğru gidecek:

resim açıklamasını buraya girin

Ve bu çok renkli görüntüyü alıyoruz (yeniden boyutlandırıldı, bu yüzden en azından görünür, aynı zamanda ne kadar küçük olabileceğini de kanıtlıyor)

Kurallar / Ek bilgiler

  • Girdi yok
  • Çıktı ayrı bir dosya olarak veya ayrı bir pencerede olmalıdır.
  • Çok baytlı karakterler için karakteri 2 bayta ayırın.
  • Kaynak kodu en az 1 bayt uzunluğunda olmalıdır
  • Görüntü, 1'e en yakın genişlik / yükseklik oranına sahip olası boyutlardan olmalıdır.
  • Görüntüdeki piksel sayısı tam olarak tavan (bayt sayısı / 3) olmalı, fazladan piksel eklenmemelidir

puanlama

Bu bir , bu yüzden bayttaki en küçük cevap kazanır.


7
Piet gönderimi bekleniyor ...: P
Rɪᴋᴇʀ

3
"En küçük görüntü" nedir? En küçük alan? Bu her zaman düz bir çizgi olmaz mıydı? Resmin kare olması gerekiyor mu? Öyleyse, kareye sığmayan pikselleri nasıl doldurabiliriz? Bazı örnek çözümler sunabilir misiniz? (Kaynak kodu ile değil, sadece herhangi bir dize ile)
DJMcMayhem

2
Hala net değil. Hangisi daha önemli, en küçük alan veya en küçük genişlik / yükseklik oranı? Ya üç ya da herhangi bir asal piksel sayısı olsaydı? 1x3 (en küçük alan) veya 2x2 piksel eksik mi (en küçük oran)? O eksik piksel ne olmalı?
DJMcMayhem

3
Bu kum havuzunda mıydı? Orada biraz zaman geçirmiş gibi görünüyor.
Morgan Thrapp

1
Teknik olarak her zaman olacak en küçük genişlik / yükseklik oranı değil mi height = Nve width = 1? Sanırım 1'e en yakın genişlik / yükseklik demek istediniz
Suever

Yanıtlar:


1

Aslında 12 bayt

Q"P6 4 1 255

Çevrimiçi deneyin!

Bu program aynı zamanda Ciddi çalışır.

Bu program , varsayılan olarak kabul edilebilir bir PPM görüntüsü verir .

Çıktı görüntüsü (50x büyütülmüş):

output

Açıklama:

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: Çıktı ayrı bir dosya olmalıdır . Bu sadece dosya içeriğini STDOUT'a değil mi?
Adám

8

MATLAB, 81 72 69 bayt

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

Bu, komut penceresine yapıştırılabilen ve kullanılarak çalıştırılabilen anonim bir işlev oluşturur ans(). Çalıştırıldığında bu 23 piksellik bir görüntü (asal) oluşturur, bu nedenle en kare gösterim basit bir piksel dizisidir.

enter image description here

açıklama

Komut penceresine yapıştırıldığında, anonim işlev kendini otomatik olarak değişkene atar ans. Sonra anonim işlev içinde şunları kullanırız:

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

char(ans)anonim işlevin yerel ad alanı yerine komut penceresinin ad alanı içinde değerlendirilir . Bu nedenle anonim işlevin kendisini bir dize temsiline dönüştürebilir.

Sonra daha basit olan aşağıdaki işlemlere sahibiz:

%// 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
ansFikir için +1 !
Kusur

Bunun çalışması için iki kez yapılması gerekmez mi? İlk seferinde ans, ilk çalışma tamamlanana kadar değere dayalı bir görüntü oluşturmasını beklerdim , bu ansda fonksiyonun kendisi haline gelir. İkinci kez, "kendi" kodunu kullanıyor (aslında, ayrı ama aynı anonim bir fonksiyonun kodudur). Bununla birlikte, MATLAB'ı bilmiyorum, bu yüzden yanlış olabilirim.
Adám

2
@ Nᴮᶻ Temel çalışma alanında evalinaramak için kullanmanın güzelliği bu char(ans). evalinYalnızca de değerlendirilir çalışma zamanında bu kadar olsa bile anskomut penceresine yapıştırın zaman Aradığınızda, tanımlı değil ans(), bu anonim işlevini çalıştırmak için ans olduğu tanımlanmış ve evalinanonim işlevi içinde çağrı erişebilir. Yani iki kez çalıştırmak zorunda değilsiniz. Eğer iki kez çalıştırılmaya güvenebilseydim, evalin('base', 'char(ans)')basitçe değiştirilirchar(ans)
Suever

4

Javascript (ES6) 324 312 309 Bayt

Eminim bu biraz golf olabilir:

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'))}
  • bir tuval oluşturur
  • içinde görüntü oluşturur
  • Görüntü için veri URL'sini yeni sekmede açar

Okunabilirlik için yeni hatlar:

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'))
}

Çıktı

JavaScript


Belirtmediğim gibi, otomatik olarak çalıştırmanıza gerek yok.
Bálint

Ayrıca, boş paragraflar kullanmak yerine bir kukla değişken ekleyin
Bálint

Paragraflar boş mu? Nerede?
Shaun H

f=()=>{Burada, sadece f=_=>-1 bayt, sadece kullanmayın, javascript gevşek yazılmıştır
Bálint

Ah parametreleri, parens'ten ayrılan akım 3 ile eşit olarak bölünemez
Shaun H

3

Javascript ES6 - 216 bayt

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

Not: fbir tuval döndürür.

Örnek çalışma ( <body>eklenecek bir varsayar ):

document.body.appendChild(f())

Aşağıdaki resmi sayfaya dökmelisiniz (büyütülmüş):

QuineImage


Son piksel tamamen boş, yapabilir misiniz, yani toplam 71 piksel mi?
Bálint

@ Bálint Whoops, boş piksel bölümünü görmedi. İlginç bir şekilde, 71x1 görüntüsünü yapmaya çalışırsam, bayt sayımı 214'e ve bu arada piksel sayısı 72'ye, yani 9x8 olur ve bu da bayt sayısını 213'e geri getirir. . Tüm talepleri karşılayan en temiz çözüm, çözüme 3 yedek karakter eklemektir ...
Dendrobium

2

PowerShell v4, 64 bayt

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

Kendi dosya adının içeriğini alır, dizeyi char dizisi olarak verir, bazı PPM üstbilgileri ekler ve içeriği a.ppm'ye çıktı olarak ayarlar. 64 bayt 11x2 piksel yapar:

PowerShell source encoded as picture


1

Node.js, 63 bayt

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

Adlı bir dosyaya Çıkışlar görüntü P6içindedir PPM (P6) formatında.

İşte bir PNG yorumlaması (7x3 piksel):

resim açıklamasını buraya girin


1

PHP, 226 bayt

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);

Ungolfed sürümü

<?
// 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);

Bu komut dosyasını 'p.php' adlı bir dosyaya girin ve çalıştırın. Yerel bir dosyadan okuduğu için kendi PHP betiğini çalıştırma yönteminize ihtiyacınız vardır.

Çıktı görüntüsü:

renk kodlu


0

Java 511 karakterleri

Çözümün uzunluğu daha büyük bir resme yol açar, çünkü bu resimler gerçekten güzeldir.

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"));}}

Görünmez bir satırsonu olduğunu unutmayın! "Q.java" olması gereken kaynak dosyasını okur ve şöyle görünen bir "Q.png" resmi oluşturur:

Kod tarafından oluşturulan görüntü

veya 100x ölçekli resim açıklamasını buraya girin


0

APL (Dyalog) , 33 bayt

⎕IO←0Birçok sistemde varsayılan olanı gerektirir . Ayrıca, programı tam olarak verildiği gibi korumak için AutoFormat kapalı olmalıdır.

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

İçerik P: P3 11 1255186186253 78 80 85 84187248 13 80 13194 205253 65 86 178 13 3 11 1 255 131941871900253 78 82 13 22 13 Gördüğünüz ve görmek için buraya
bırakın :kod resmi

⎕NR'f'N ested R programı ePresentation f

⊃⌽ son (ters çevrilmiş ilk öğe) öğesini (satırı) seç

'␍ɫ␉⍣', dört karakteri (filetype, width, height, max)

⎕AV⍳A tomic V vektöründe (karakter seti)  karşılık gelen indeksleri bulma

 metin olarak biçimlendir

'P', mektubun başına gel

() Aşağıdaki tacit fonksiyonunu uygulayın:

 argümanın tamamını al [ve a]

⎕NPUTN ative [dosya] koyun [bu, bir dosya oluşturduğu ile]

 ilk karakter ("P")


Bu hangi kod sayfasını varsayıyor?
Bálint

@ Bálint Bkz. Düzenleme.
Adám

Sonuçta ortaya çıkan görüntü 14 yerine 42 pikseldir? Bunun nedeni "bayt" ınızın çok baytlı karakterlere karşılık gelmesidir?
Suever

@Suever Çözüldü. Teşekkürler.
Adám

BTW, bence, sürüm meydan okumadan önce bir derleyici varsa, o zaman yasal bir tane.
Bálint

-1

Python, 81 bayt

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

Çıktı PPM biçimindedir.

Görüntünün görünümü aşağıdaki gibidir:

görüntü

Ölçeklendirildi:

Ölçeklendirildi


Tekrar kullandığını görmüyorumq
Maltysen

P6Biçimi kullanırsanız, sıra sayılarına dönüştürmeniz gerekmez. Ayrıca, 8 bit RGB 255için yerine kullanılmalıdır 256.
Mego

Sadece bir qkez kullanırsanız , göründüğü gibi, ödevden kurtulun ve doğrudan yerine koyun - sizi üç bayt kurtaracaktır.
Monica'nın Davası

Dosya içeriğini yazdırdığınız anlaşılıyor, ancak OP dedi Çıktı ayrı bir dosya olmalıdır .
Adám

Merhaba, @ QPaysTaxes dedi print'P3\n9 3 256 '+' '.join(map(lambda x:str(ord(x)),open(__file__).read())). -4 bayt, tho!
Outgolfer Erik
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.