Động vật hạ cấp!


25

Hình đại diện của tôi có một số tính năng khác biệt

Những tính năng này tuy nhiên cũng có thể áp dụng cho bất kỳ động vật khác.

Đặc điểm kỹ thuật

Đưa ra một hình ảnh của một con vật (về mặt kỹ thuật có thể là bất cứ điều gì), bạn phải áp dụng các thuộc tính của Downgoat cho nó.

Pixel viền là hầu hết các pixel bên ngoài của hình ảnh.

Các màu nền được định nghĩa là màu phổ biến nhất trong các điểm ảnh biên giới. Khi màu đó được hiểu là màu (r, g, b, a), với mỗi kênh từ [0, 256), nền được xác định là khu vực nơi mỗi kênh của các pixel đã cho 'nằm trong 50 của " màu nền".

Quá trình:

  • Đặt nền và tất cả các pixel trong suốt thành #232323,RGBA(35, 35, 35, 1.00)
  • Đặt tất cả các pixel mà không phải là nền #FC0D1B, RGBA(252, 13, 27, 1.00).
  • Phản ánh theo chiều dọc của hình ảnh
  • Thêm văn bản -1trong phông chữ Arial, ở giữa hình ảnh. Tổng chiều cao của văn bản phải bằng 25% kích thước nhỏ nhất của hình ảnh (nghĩa là min(width, height) * 0.25).

Quy tắc

  • Vui lòng giả sử các phông chữ đã được cài đặt
  • Ngưỡng của bạn được cho là 50, tuy nhiên bạn cũng có thể lấy số này làm đầu vào. Bạn không nhận được bất kỳ số byte giảm nào để làm điều này tuy nhiên
  • Tham khảo mặc định I / O hình ảnh của chúng tôi cho bất kỳ câu hỏi liên quan đến định dạng I / O.
  • Hình ảnh sẽ luôn có kích thước tối thiểu 3x3
  • Nếu không có "màu pixel viền" phổ biến nhất, thì bạn không sử dụng màu pixel viền nào làm "màu nền", tuy nhiên điều này phải nhất quán.

Ví dụ

Đầu vào: Con dê

Đầu ra: Hạ cấp


Đầu vào: Mực ống

Đầu ra: Nhược điểm

Đầu vào: Hạ cấp

Đầu ra: Hạ giá


Đầu vào: Dennis

Đầu ra: Hạ cấp


Đầu vào: Trichoplax

Đầu ra: Dftimerichoplax


Thêm ví dụ?

Một triển khai trực tuyến có sẵn tại đây: vihan.org/p/downgoatify/#50


Đây là để mã ngắn nhất tính theo byte thắng. Chúc may mắn!


6
-1 Trường hợp thử nghiệm đầu tiên không phải là động vật -_-
Geobits

10
-1ˢᵗ trường hợp thử nghiệm cũng không phải là động vật.
Adám

8
Không phải là fan hâm mộ của quỷ dennis
downrep_nation

1
Bạn có thể loại bỏ sự lo lắng về việc đó có phải là động vật hay không bằng cách thay đổi "động vật" thành "hình đại diện" trong tiêu đề và trong suốt câu hỏi.
Glenn Randers-Pehrson

4
Điểm bắt buộc sử dụng phông chữ là gì? Điều duy nhất làm điều này là xử phạt các ngôn ngữ trong đó việc thay đổi phông chữ cần nhiều byte hơn
Fatalize

Câu trả lời:


9

ImageMagick 7.0.3 + bash + sed, 379 byte

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:

Bị đánh cắp

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

Đầu vào và đầu ra

Tôi nhận được một câu trả lời khá khác nhau cho hình ảnh dennis, có lẽ là do "-fuzz" của ImageMagick tính toán một hình cầu có đường kính 2N theo tọa độ rgb trong khi các quy tắc yêu cầu tính toán một khối có cạnh 101 đơn vị theo tọa độ rgb. Thay đổi "fuzz" đã giúp một số. Ngoài ra, các tạo phẩm JPEG trong bản gốc dường như đang can thiệp vào quá trình chuyển đổi.


Tôi không quen thuộc với imageMagick, vì vậy điều này có thể rất ít được giáo dục, nhưng bạn có thể thay thế mã màu # 0000 chỉ bằng # 0 không?
tuskiomi

Không, # 0 không hoạt động. Không có # 000 vì đó là màu đen mờ và chúng ta cần màu đen trong suốt ở đây.
Glenn Randers-Pehrson

Lỗi mà tôi đã đề cập, # ImageMagick 7.0.1 through 7.0.3-7 fails heređã được báo cáo cho các nhà phát triển IM và được sửa trong phiên bản 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);}
  • Tệp được lưu với LF dưới dạng dòng cuối, không phải với CR + LF để lưu một số byte.
  • Chương trình được viết theo cách cảnh báo trình biên dịch được tạo để lưu thêm một số byte.
  • Tệp có thể sẽ không biên dịch thành chương trình 64 bit vì mảng " s[]" được sử dụng để thực hiện một số đúc ẩn ...
  • Chương trình có hai hình ảnh (tên tệp được đưa ra thông qua dòng lệnh):
    • Hình ảnh đầu tiên (đối số dòng lệnh đầu tiên) là hình ảnh R / G / B ở định dạng Windows .BMP
    • Hình ảnh thứ hai là kênh Alpha (màu đen có nghĩa là: 0%, bất kỳ màu nào khác có nghĩa là: không phải 0%); tệp cũng có định dạng .BMP và phải có cùng kích thước hoặc lớn hơn hình ảnh đầu tiên
  • Hình ảnh đầu ra được hiển thị ở góc trên bên trái của màn hình
  • Tôi không thể tái tạo cậu bé với mái tóc màu vàng. Màu vàng dường như quá xa (> 50) so với màu trắng!

Phiên bản bị đánh cắp:

#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);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.