Downgoat-ify Hayvanlar!


25

Benim Downgoat avatarımın birçok farklı özelliği var.

Ancak bu özellikler başka herhangi bir hayvan için de geçerli olabilir.

Şartname

Bir hayvanın görüntüsünü göz önüne alındığında (teknik olarak herhangi bir şey olabilir), Downgoat özelliklerini ona uygulamanız gerekir.

Kenarlık pikselleri görüntünün en dış pikselleridir.

Arka plan rengi , sınır piksellerinde en yaygın renk olarak tanımlanır. Bu renk (r, g, b, a) renk olarak yorumlandığında, her kanal [0, 256) 'dan, arka plan verilen piksellerin her kanalının "50" nin içinde olduğu alan olarak tanımlanır. arka plan rengi".

Süreç:

  • Arka planı ve tüm saydam pikselleri #232323,RGBA(35, 35, 35, 1.00)
  • Arka plan olmayan tüm pikselleri ayarlayın #FC0D1B, RGBA(252, 13, 27, 1.00).
  • Görüntüyü dikey olarak yansıtın
  • Metni -1, resmin ortasına, Arial fontuna ekleyin . Metnin toplam yüksekliği görüntünün en küçük boyutunun% 25'i kadar olmalıdır (örn. min(width, height) * 0.25).

kurallar

  • Yazı tiplerinin zaten kurulu olduğunu varsaymaktan çekinmeyin
  • Eşiğiniz olması gerekiyordu 50, ancak bu numarayı girdi olarak da alabilirsiniz. Bunu yapmak için herhangi bir azalmış bayt sayısı alamazsınız ancak
  • Bizim bakın görüntü G / Ç varsayılan I / O formatları ile ilgili herhangi bir soru için.
  • Görüntü her zaman en az 3x3 boyutunda olacaktır
  • En yaygın "kenarlık piksel rengi" yoksa, "kenarlık rengi" olarak hangi kenarlık pikseli rengini kullandığınız önemli değildir, ancak bunun tutarlı olması gerekir.

Örnekler

Giriş: Keçi

Çıktı: Downgoat


Giriş: Kalamar

Çıktı: Downsquid

Giriş: Downgoat

Çıktı: Downdowngoat


Giriş: Dennis

Çıktı: Downdennis


Giriş: placozoa

Çıktı: Downtrichoplax


Daha fazla örnek?

Çevrimiçi bir uygulama burada bulabilirsiniz: vihan.org/p/downgoatify/#50


Bu yani bayt cinsinden en kısa kod kazanır. İyi şanslar!


6
-1 İlk test olayı bir hayvan değil -_-
Geobits 14:00 16:00 '

10
-1ˢᵗ test durumu da bir hayvan değildir.
Adám

8
İblis dennis Değil a yelpaze
downrep_nation

1
Başlıkta ve soru boyunca "hayvan" ı "avatar" olarak değiştirerek hayvan olup olmadığı endişesini ortadan kaldırabilirsiniz.
Glenn Randers-Pehrson

4
Yazı tipini kullanmak için zorlamanın amacı nedir? Bunu yapan tek şey, yazı tipini değiştirmenin daha fazla bayt aldığı dilleri cezalandırmak
Fatalize

Yanıtlar:


9

ImageMagick 7.0.3 + bash + sed, 379 bayt

M=magick K=\#232323 P='-chop x%[fx:u[0].h-2]-0+1'
$M $1 -depth 8 ppm:W;$M W $P T;$M W -rotate 90 -shave 1x $P L
C=`$M T L +append -statistic mode +0 txt:-|sed -e "1d;s/.*#/#/;s/ .*//;q"`
$M W -background $K -flatten -fill $K -fuzz 20% -opaque $C +fuzz -fill \#FC0D1B +opaque $K -flip -pointsize %[fx:.282*min\(u[0].w,u[0].h\)] -fill white -draw 'gravity center text 0,0 "-1"' x:

Ungolfed

# Make aliases for things we'll use repeatedly
M=magick K=\#232323 P='-chop x%[fx:u[0].h-2]-0+1'

# Copy the input file to a PPM file
$M $1 -depth 8 ppm:W

# Extract the border pixels into "T" (top and bottom), and "L" (left and right)
# PPM files, removing the ends from the "L" because they were already counted 
$M W $P T;$M W -rotate 90 -shave 1x $P L

# Put the borders into one strip and reduce to a txt image of the "mode"
# color on stdout, then convert the first pixel to hex format string "C"
C=`$M T L +append -statistic mode +0 txt:-|sed -e "1d;s/.*#/#/;s/ .*//;q"`

# Make background "#232323" and compose transparent pixels against it
# Convert any pixels with color within "fuzz" distance of background to #232323
# Convert any remaining pixels to "#FC0D1B"
# Flip the image vertically
# Determine pointsize for text, 1/5 of min(w,h). 1 pixel == 1.44 points
# Draw text "-1" centered on the image
# Display the result to an X window

$M W -background $K -flatten                     \
-fill $K -fuzz 20% -opaque $C                    \
+fuzz -fill \#FC0D1B +opaque $K                  \
-flip                                            \
-pointsize %[fx:.282*min\(u[0].w,u[0].h\)]       \
-fill white -draw 'gravity center text 0,0 "-1"' \
x:

Girdiler ve çıktılar

Dennis görüntüsü için oldukça farklı bir cevap alıyorum, çünkü ImageMagick'in "-fuzz" değeri, rgb koordinatlarında 2N birim çapında bir küre hesaplarken, kurallar ise rgb koordinatlarında 101 birimin kenarları olan bir küpü hesaplamaya çağırıyor. "Fuzz" ı değiştirmek biraz yardımcı oldu. Ayrıca, orijinaldeki JPEG artefaktlarının dönüşüme müdahale ettiği görülüyor.


İmageMagick ile familliar değilim, bu yüzden bu çok azalmamış olabilir, ancak # 0000 renk kodunu basitçe # 0 ile değiştirebilir misiniz?
tuskiomi

Hayır, # 0 çalışmıyor. # 000 da değil çünkü bu mat siyah ve burada şeffaf siyah lazım.
Glenn Randers-Pehrson,

Bahsettiğim hata # ImageMagick 7.0.1 through 7.0.3-7 fails here, IM geliştiricilerine bildirildi ve 7.0.3-8 sürümlerinde düzeltildi.
Glenn Randers-Pehrson

10

C, 32 bit Windows, 987 bayt

#include <windows.h>
#define A CreateCompatibleDC(c)
#define F z=GetPixel(d,x,y);r=z;g=z>>8;b=z>>16
#define C(X,Y) (X<0||Y<0||X>=s[2]||Y>=s[3]||!GetPixel(e,X,Y))
#define D ((C(x-1,y)||C(x+1,y)||C(x,y-1)||C(x,y+1))&&!C(x,y))
#define E(X,Y) ((Z+X-Y)*(Z+X-Y)<2501)
main(int a,int*n){HDC c,d,e,f,w;int x,y,s[9],z,*o,m,t,Z;unsigned char r,g,b,R,G,B;c=GetDC(w=GetDesktopWindow());d=A;e=A;SelectObject(d,f=LoadImage(0,n[1],0,0,0,16));SelectObject(e,LoadImage(0,n[2],0,0,0,16));GetObject(f,24,s+1);o=LocalAlloc(64/*Fixed,ZeroInit*/,8*s[2]*s[3]);for(x=t=Z=s[1]=s[0]=0;x<s[2];x++)for(y=0;y<s[3];y++)if D{F;for(m=0;m<t&&o[m]!=z;m+=2);o[m]=z;o[m+1]++;t+=2*(m>=t);}for(x=y=1;x<t;x+=2)if(o[x]>o[y])y=x;z=o[y-1];R=z;G=z>>8;B=z>>16;for(x=0;x<s[2];x++)for(y=0;y<s[3];y++){F;SetPixel(c,x,s[3]-y-1,(C(x,y)||(E(r,R)&&E(g,G)&&E(b,B)))?0x232323:0x1B0DFC);}SelectObject(c,CreateFont(-(s[2]>>2),0,0,0,400,0,0,0,0,0,0,0,0,"Arial"));SetBkMode(c,1);SetTextColor(c,0xFFFFFF);DrawText(c,"-1",2,s,37);ReleaseDC(w,c);}
  • Dosya, bazı baytları kaydetmek için CR + LF ile değil, satır sonu olarak LF ile kaydedilir.
  • Program, daha fazla bayttan tasarruf etmek için derleyici uyarıları oluşturulacak şekilde yazılmıştır.
  • Dosya muhtemelen 64 bit program olarak derlenmeyecektir, çünkü " s[]" dizisi bazı dolaylı dökümler yapmak için kullanılıyor ...
  • Program iki resim çeker (dosya adları komut satırı üzerinden verilir):
    • İlk görüntü (ilk komut satırı argümanı), Windows .BMP biçimindeki R / G / B görüntüsüdür
    • İkinci görüntü Alfa kanalıdır (siyah: 0%, başka bir renk demektir:% 0 değil); dosya ayrıca .BMP formatındadır ve aynı boyuta sahip olmalı veya ilk görüntüden daha büyük olmalıdır
  • Çıktı görüntüsü ekranın sol üst köşesinde görüntülenir.
  • Çocuğu sarı saçlı yeniden üretemedim. Sarı beyazdan çok uzakta (> 50) görünüyor!

Ungolfed versiyonu:

#include <windows.h>

/*
 * Although this line costs us 32 bytes
 * Replacing "CreateCompatibleDC(c)" we'll
 * save 42 bytes in the golfed version later
 * so we save 10 bytes using this define!
 */
#define A CreateCompatibleDC(c)

/*
 * Macro: Get a pixel value at (x,y) to z
 * Also get r, g, b
 */
#define F z=GetPixel(d,x,y); \
    r=z; \
    g=z>>8; \
    b=z>>16

/*
 * Macro checking if a pixel is a
 * transparent colour or lies outside the
 * image
 */
#define C(X,Y) (X<0 || Y<0 || X>=s[2] || Y>=s[3] || !GetPixel(e,X,Y))

/*
 * Macro checking if a pixel at (x,y) is a border pixel
 */
#define D ((C(x-1,y) || C(x+1,y) || C(x,y-1) || C(x,y+1)) && !C(x,y))

/*
 * Macro checking if the difference between X and Y is less than 50
 * The variable "Z" must be type "int" and zero. It is used to
 * perform an implicit cast from "BYTE" to "int".
 */
#define E(X,Y) ((Z+X-Y)*(Z+X-Y)<2501)

/*
 * Note that the second argument is "char **",
 * not "int *".
 * We ignore resulting compiler warnings...
 */
main(int a, int * n)
{
    HDC c, d, e, f, w;
    int x, y, s[9], z, *o, m, t, Z;
    unsigned char r, g, b, R, G, B;

    /*
     * Get the HDC handle to the
     * screen (allowing us to create HDCs
     * for accessing bitmap files as well as
     * drawing directly to the screen!)
     */
    c=GetDC(w=GetDesktopWindow());
    /*
     * Create two virtual HDCs for accessing
     * the bitmap files.
     */
    d=A; /* Macro */
    e=A; /* Macro */
    /*
     * Load the two images:
     * The first argument is the image file with
     * the R/G/B channel
     * The second argument is the image file
     * containing the mask defined by the Alpha
     * channel:
     *   Black means = Alpha=0
     *   White means = Alpha>0
     *   (Any other colour means: Alpha>0)
     *
     * Note that "f" is of the type "HBITMAP",
     * not "HDC". We save 4 bytes in the golfed
     * version using HDC instead of HBITMAP and
     * compile the C file with compiler warnings
     * switched off!
     *
     * The second image should have the same size
     * as the first one. However it may be larger
     * than the first one. It must not be smaller!
     */
    SelectObject(d,f=LoadImage(0,n[1],0,0,0,16 /* 16=LR_LOADFROMFILE */));
    SelectObject(e,LoadImage(0,n[2],0,0,0,16));
    /*
     * Get the image information (size)
     */
    GetObject(f,24,s+1);
    /*
     * Search all background colours
     */
    o=LocalAlloc(64 /* Fixed, ZeroInit */,8*s[2]*s[3]);
    for(x=t=Z=s[1]=s[0]=0;x<s[2];x++)
        for(y=0;y<s[3];y++)
            if D
    {
        F; /* Macro */
        for(m=0;m<t && o[m]!=z;m+=2);
        o[m]=z;
        o[m+1]++;
        t+=2*(m>=t);
    }
    /*
     * Search the most common one
     */
    for(x=y=1;x<t;x+=2) if(o[x]>o[y]) y=x;
    z=o[y-1];
    R=z;
    G=z>>8;
    B=z>>16;
    /*
     * Draw the image directly to the screen
     */
    for(x=0;x<s[2];x++)
        for(y=0;y<s[3];y++)
    {
        F; /* Macro */
        /* C and E are macros: */
        SetPixel(c,x,s[3]-y-1,(C(x,y) ||
            (E(r,R) && E(g,G) && E(b,B)))?
            0x232323:0x1B0DFC);
    }
    /*
     * Draw the text over the image
     */
    SelectObject(c,CreateFont(-(s[2]>>2),0,0,0,400,0,0,0,0,0,0,0,0,"Arial"));
    SetBkMode(c,1 /* TRANSPARENT */);
    SetTextColor(c,0xFFFFFF);
    DrawText(c,"-1",2,s,37 /* center, vcenter, singleline */);
    /*
     * Unfortunately DrawText() won't work
     * when not doing this!
     */
    ReleaseDC(w,c);
}
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.