Downgoat-ify Animais!

25

Meu avatar do Downgoat possui vários recursos distintos

No entanto, esses recursos também se aplicam a qualquer outro animal.

Especificação

Dada a imagem de um animal (tecnicamente pode ser qualquer coisa), você deve aplicar as propriedades Downgoat a ele.

Pixels de borda são os pixels mais externos da imagem.

A cor do plano de fundo é definida como a cor mais comum nos pixels da borda. Quando essa cor é interpretada como uma cor (r, g, b, a), com cada canal de [0, 256), o plano de fundo é definido como a área em que todos os canais dos pixels fornecidos estão a 50 do " cor de fundo".

O processo:

  • Definir o plano de fundo e todos os pixels transparentes para #232323,RGBA(35, 35, 35, 1.00)
  • Definir todos os pixels que não são o pano de fundo #FC0D1B, RGBA(252, 13, 27, 1.00).
  • Reflita verticalmente a imagem
  • Adicione o texto -1na fonte Arial, no centro da imagem. A altura total do texto deve ser 25% da menor dimensão da imagem (ou seja min(width, height) * 0.25).

Regras

  • Sinta-se livre para assumir que as fontes já estão instaladas
  • Seu limite deveria ser 50, no entanto, você também pode usar esse número como entrada. Você não obtém uma contagem reduzida de bytes para fazer isso, no entanto
  • Consulte os padrões de E / S da nossa imagem para quaisquer perguntas relacionadas aos formatos de E / S.
  • A imagem sempre terá pelo menos 3x3 de tamanho
  • Se não houver uma "cor de pixel de borda" mais comum, não importa qual cor de pixel de borda você use como "cor de fundo", no entanto, isso deve ser consistente.

Exemplos

Entrada: Bode

Saída: Downgoat


Entrada: Lula

Saída: Downsquid

Entrada: Downgoat

Saída: Downdowngoat


Entrada: Dennis

Saída: Downdennis


Entrada: Trichoplax

Saída: Downtrichoplax


Mais exemplos?

Uma implementação online está disponível aqui: vihan.org/p/downgoatify/#50


Este é o pelo que o código mais curto em bytes vence. Boa sorte!

Downgoat
fonte
6
-1 caso Primeiro teste não um animal -_-
Geobits
10
-1ˢᵗ caso de teste também não é um animal.
Adám 14/11/16
8
Não é um fã de demon dennis
downrep_nation 14/11
1
Você pode eliminar a preocupação de saber se é um animal alterando "animal" para "avatar" no título e em toda a pergunta.
Glenn Randers-Pehrson
4
Qual é o ponto de impor a fonte a ser usada? A única coisa que isto faz é línguas penalizar onde mudar fonte leva mais bytes
Fatalize

Respostas:

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:

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:

Entradas e saídas

Estou recebendo uma resposta bastante diferente para a imagem de dennis, provavelmente porque o "-fuzz" do ImageMagick calcula uma esfera com diâmetro de 2N unidades em coordenadas rgb, enquanto as regras exigem o cálculo de um cubo com lados de 101 unidades em coordenadas rgb. Variando o "fuzz" ajudou alguns. Além disso, os artefatos JPEG no original parecem estar interferindo na conversão.

Glenn Randers-Pehrson
fonte
Eu não sou familiar com o imageMagick, então isso pode ser muito inculto, mas você pode substituir o código de cores # 0000 pelo simplesmente # 0?
Tuskiomi
Não, # 0 não funciona. Nem o número 000 porque é preto opaco e precisamos de preto transparente aqui.
Glenn Randers-Pehrson #
O bug que eu mencionei # ImageMagick 7.0.1 through 7.0.3-7 fails herefoi relatado aos desenvolvedores de MI e foi corrigido na versão 7.0.3-8.
Glenn Randers-Pehrson
10

C, Windows de 32 bits, 987 bytes

#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);}
  • O arquivo é salvo com LF como final de linha, não com CR + LF para salvar alguns bytes.
  • O programa é escrito de uma maneira que os avisos do compilador são gerados para economizar mais alguns bytes.
  • O arquivo provavelmente não será compilado como um programa de 64 bits porque a matriz " s[]" é usada para fazer algumas projeções implícitas ...
  • O programa tira duas imagens (os nomes dos arquivos são fornecidos via linha de comando):
    • A primeira imagem (argumento da primeira linha de comando) é a imagem R / G / B no formato .BMP do Windows
    • A segunda imagem é o canal alfa (preto significa: 0%, qualquer outra cor significa: não 0%); o arquivo também está no formato .BMP e deve ter o mesmo tamanho ou ser maior que a primeira imagem
  • A imagem de saída é exibida no canto superior esquerdo da tela
  • Não consegui reproduzir o garoto de cabelos amarelos. O amarelo parece estar muito longe (> 50) do branco!

Versão não destruída:

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