Hewan yang Mengalah!

25

Avatar Downgoat saya memiliki beberapa fitur berbeda

Namun fitur ini juga dapat berlaku untuk hewan lain.

Spesifikasi

Diberi gambar binatang (secara teknis bisa apa saja), Anda harus menerapkan properti Downgoat padanya.

Pixel perbatasan adalah piksel paling luar dari gambar.

The warna latar belakang didefinisikan sebagai warna yang paling umum di pixel perbatasan. Ketika warna itu ditafsirkan sebagai warna (r, g, b, a), dengan masing-masing saluran dari [0, 256), latar belakang didefinisikan sebagai area di mana setiap saluran dari piksel yang diberikan 'berada dalam 50 dari " warna latar belakang".

Proses:

  • Mengatur latar belakang dan semua piksel transparan ke #232323,RGBA(35, 35, 35, 1.00)
  • Atur semua piksel yang tidak latar belakang #FC0D1B, RGBA(252, 13, 27, 1.00).
  • Memantulkan gambar secara vertikal
  • Tambahkan teks -1dalam font Arial, di tengah gambar. Tinggi total teks harus 25% dari dimensi terkecil gambar (yaitu min(width, height) * 0.25).

Aturan

  • Jangan ragu untuk menganggap font sudah diinstal
  • Ambang batas Anda seharusnya 50, namun Anda juga dapat menggunakan nomor ini sebagai masukan. Anda tidak mendapatkan penurunan jumlah byte apa pun untuk melakukan ini
  • Lihat gambar I / O standar kami untuk setiap pertanyaan yang terkait dengan format I / O.
  • Gambar akan selalu berukuran setidaknya 3x3
  • Jika tidak ada "warna piksel batas" yang paling umum, tidak masalah warna piksel batas mana yang Anda gunakan sebagai "warna latar belakang", namun ini harus konsisten.

Contohnya

Memasukkan: Kambing

Keluaran: Downgoat


Memasukkan: Cumi-cumi

Keluaran: Downsquid

Memasukkan: Downgoat

Keluaran: Downdowngoat


Memasukkan: Dennis

Keluaran: Downdennis


Memasukkan: Trichoplax

Keluaran: Downtrichoplax


Lebih banyak contoh?

Implementasi online tersedia di sini: vihan.org/p/downgoatify/#50


Ini adalah sehingga kode terpendek dalam byte menang. Semoga berhasil!

Downgoat
sumber
6
-1
Kotak
10
-1ˢᵗ test case bukan binatang juga.
Adám
8
Bukan penggemar dennis iblis
downrep_nation
1
Anda dapat menghilangkan kekhawatiran tentang apakah itu binatang dengan mengubah "binatang" menjadi "avatar" di judul dan sepanjang pertanyaan.
Glenn Randers-Pehrson
4
Apa gunanya menegakkan font untuk digunakan? Satu-satunya hal yang dilakukan adalah menghukum bahasa di mana perubahan font membutuhkan lebih banyak byte
Fatalize

Jawaban:

9

ImageMagick 7.0.3 + bash + sed, 379 bytes

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:

Tidak disatukan

# 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:

Masukan dan keluaran

Saya mendapatkan jawaban yang sangat berbeda untuk gambar dennis, mungkin karena ImageMagick's "-fuzz" menghitung bola dengan diameter 2N unit dalam koordinat rgb sementara aturan panggilan untuk menghitung kubus dengan sisi 101 unit dalam koordinat rgb. Memvariasikan "bulu halus" membantu beberapa orang. Juga, artefak JPEG dalam aslinya sepertinya mengganggu konversi.

Glenn Randers-Pehrson
sumber
Saya tidak terbiasa dengan imageMagick, jadi ini mungkin sangat tidak berpendidikan, tetapi bisakah Anda mengganti kode warna # 0000 hanya dengan # 0?
tuskiomi
Tidak, # 0 tidak berfungsi. Tidak juga # 000 karena itu buram hitam dan kita perlu hitam transparan di sini.
Glenn Randers-Pehrson
Bug yang saya sebutkan, # ImageMagick 7.0.1 through 7.0.3-7 fails here telah dilaporkan ke pengembang IM dan diperbaiki dalam versi 7.0.3-8.
Glenn Randers-Pehrson
10

C, Windows 32-bit, 987 byte

#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);}
  • File disimpan dengan LF sebagai akhir baris, bukan dengan CR + LF untuk menyimpan beberapa byte.
  • Program ini ditulis sedemikian rupa sehingga peringatan kompiler dihasilkan untuk menyimpan beberapa byte lagi.
  • File mungkin tidak akan dikompilasi sebagai program 64-bit karena " s[]" array digunakan untuk melakukan beberapa casting implisit ...
  • Program ini mengambil dua gambar (nama file diberikan melalui baris perintah):
    • Gambar pertama (argumen baris perintah pertama) adalah gambar R / G / B dalam format Windows .BMP
    • Gambar kedua adalah saluran Alpha (hitam berarti: 0%, warna lainnya berarti: bukan 0%); file ini juga dalam format .BMP dan harus memiliki ukuran yang sama atau lebih besar dari gambar pertama
  • Gambar output ditampilkan di sudut kiri atas layar
  • Saya tidak bisa mereproduksi anak laki-laki dengan rambut kuning. Kuning tampaknya terlalu jauh (> 50) dari putih!

Versi tidak disatukan:

#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);
}
Martin Rosenau
sumber