Alfabeto de bandeira marítima do ICS

14

O alfabeto de bandeira do Código Internacional de Sinais é usado pelos navios para comunicação, principalmente para sinais estáticos.

Seu desafio é escrever um programa ou função que retire uma string de STDIN ou como argumento e exiba o texto correspondente no alfabeto de bandeira do ICS. Se o seu idioma não for exibido na tela, a gravação em um arquivo é aceitável.

Seu programa ou função deve suportar as letras AZ em maiúsculas e minúsculas, além de Espaço e Nova Linha . O comportamento com outros caracteres é indefinido.

A tela deve ser grande o suficiente para exibir capaz de exibir pelo menos 8 sinalizadores horizontalmente e 6 sinalizadores verticalmente. O comportamento é indefinido se a borda direita for atingida antes do recebimento de uma nova linha ou se a mensagem for muito longa para caber na tela verticalmente.

O alfabeto da bandeira é como mostrado abaixo (as letras romanas são apenas para referência, não são necessárias na saída.)

insira a descrição da imagem aqui

Dimensões

Não há um padrão universalmente aceito para as dimensões dessas bandeiras, portanto, para os fins deste desafio, o seguinte será aplicado:

Os sinalizadores devem ter 60x60 pixels, com um intervalo de 30 pixels entre eles na horizontal e na vertical.

O corte da andorinha cortado em A e B deve ter 15 pixels de profundidade.

Todas as outras linhas devem ser horizontais, verticais ou a 45 graus.

As características devem ser localizadas dividindo a bandeira em uma grade NxN imaginária de lado 3,4,5 ou 6 quadrados. Consulte a imagem acima, mas para mais esclarecimentos:

A, E, H, K, L e U são baseadas em uma grade 2x2: a largura de cada zona de cor deve ser 30 pixels. Além disso, os pontos do diamante em F devem estar a meio caminho de cada lado da bandeira.

J e T são baseados em uma grade 3x3: cada banda deve ter 20 pixels.

P, N e S são baseados em uma grade 4x4. Além disso, as linhas diagonais de Y devem dividir as bordas da bandeira em 4.

C, D, R e X devem ser baseados em uma grade de 5x5. As faixas e os braços das cruzes devem ter 12 pixels de largura.

G, W, M, V são baseados em uma grade 6x6. Bandas de G e bordas de W devem ter 10 pixels de largura. Os braços das cruzes em M e V devem cobrir o primeiro e o último 10 pixels de cada borda da bandeira, deixando zonas de triângulo medindo 40 pixels ao longo da borda longa.

O círculo de I deve estar no centro da bandeira e ter 30 pixels de diâmetro.

É permitido um erro de +/- 1 pixel no texto acima. Se seu idioma suportar apenas gráficos escaláveis, você poderá interpretar "pixels" como "unidades".

Cores

As cores devem ser vermelhas, brancas, azuis, amarelas e pretas, conforme definido pelo seu idioma ou por sua documentação. Se o seu idioma não definir cores, você pode usar o seguinte: Vermelho FF0000, Branco FFFFFF, Azul 0000FF, Amarelo FFFF00, Preto 0000000.

O fundo deve ser cinza (canais r, ge eb iguais, entre 25% e 75% de intensidade.)

Pontuação / Lacunas

Isso é codegolf. O código mais curto em bytes vence.

As brechas padrão não são permitidas.

Nenhuma função interna ou de biblioteca para exibir sinalizadores pode ser usada. A saída deve ser sem texto (e, em particular, caracteres unicode não devem ser usados ​​para criar a forma do sinalizador.)

Exemplo

JFK got
my VHS
PC
and XLR
web quiz

deve produzir o seguinte

insira a descrição da imagem aqui

Level River St
fonte
Não tenho muita certeza do que você quer dizer com " A exibição deve ser grande o suficiente para exibir pelo menos 8 sinalizadores horizontalmente e 6 sinalizadores verticalmente ", especialmente considerando que seu caso de teste mostra uma saída com apenas 5 sinalizadores de altura. É apenas que as respostas devem lidar com mensagens até essas dimensões e não são necessárias para lidar com as maiores, ou você pretende exigir que todas as linhas sejam preenchidas com pelo menos 8 caracteres e todas as mensagens com pelo menos 6 linhas?
Peter Taylor
1
@PeterTaylor Se o seu programa ou idioma é inteligente o suficiente para redimensionar a exibição de acordo com a saída, não há necessidade de ajustar a exibição para 8x6 se a saída for menor. A saída deve ter um plano de fundo cinza e ser retangular (todas as linhas preenchidas pelo menos no comprimento da linha mais longa.)
Level River St St

Respostas:

15

CJam, 464 bytes

Você achou que o CJam não tinha funções de manipulação de imagem? Bem, você pensou certo! Mas eu não deixaria isso me parar.

"P3
690 690 4
"3a3*a690_@*a*qeuN/{0:U;{_'C<.5*:N;i[{XY+Z<[E8][9C]?XY<=}WWWW{XH<9F?}C{YC/[9FCF]=}{YC/3&9E?}{YH<9F?}{X29.5:R-zYR-z+H>FC?}{XA/1&9E?}{XH<FC?}{XR-_*YR-_*+F_*>E8?}{YK/(9F?}{XH<E9?}{XH<YH<^8E?}{XY+Z-A/XY-A/e&9F?}{XF/YF/^1&F9?}{XY<EC?}{XH-F/YH-F/|9F?}E{XHm6/YHm6/e&CE?}{XH-F/YH-F/|F9?}{XK/[CF9]=}{XH<YH<^FC?}{XY+Z-A/XY-A/e&FC?}{XR-zYR-ze>iA/[CF9]=}{XHm6/YHm6/e&F9?}{XY+F/1&CE?}]=:P~!!{60:Z{Z30:HYH-z-N*-{YV+_2$=XU+P2b1>4f*tt}fX}fY}*U90+:U;}/V90+:V;}/`"[]"-

Este programa gera a imagem da melhor maneira que o CJam pode: como texto que representa a imagem quando salva como um arquivo PPM . A propósito, nem tente executá-lo com o intérprete on-line; você vai explodir a pilha. Execute-o com o interpretador Java e canalize a saída para um arquivo com um comando como java -jar cjam-0.6.4.jar flags.cjam > flags.ppm. Depois de fornecer sua entrada, envie um EOF (pode ser necessário imediatamente após uma nova linha) com ctrl + D no Unix ou ctrl + Z no Windows.

Amostra

Se for realmente desejado, posso tentar colar a fonte da imagem original de ~ 3 MB em algum lugar. Mas aqui está o resultado aberto no GIMP e convertido em um PNG:

ABCDEFG
hijklmn
OPQRSTU
vwxyz z

flags_alphabet.png

Explicação

O cabeçalho da imagem, facilmente identificável na fonte, consiste no número mágico, largura, altura e valor máximo do canal. Portanto, a saída é uma imagem 690 * 690 (o suficiente para 8 * 8 sinalizadores de 60px com espaçamento de 30px entre eles), com cada valor de R, G e B variando de 0 a 4.

Os dados da imagem são inicializados como uma matriz 690 * 690 * 3 preenchida com 3's, deixando toda a imagem em cinza. Em seguida, a entrada é lida, convertida em maiúscula e dividida em linhas. As linhas são processadas em um loop, incrementando a coordenada do sinalizador Y em 90 a cada iteração e em cada linha, cada caractere é processado em um loop, incrementando a coordenada do sinalizador X em 90 a cada iteração. Agora a mágica começa.

Cada caractere é mapeado para a função de pixel de uma bandeira que, quando chamada, retorna a cor do pixel na posição (X, Y) na bandeira. É aqui que a maior parte do trabalho duro foi: descrever concisamente 26 imagens como funções matemáticas. Cada uma dessas funções retorna um valor de cor de 8 a 15. Esse intervalo aproveita o fato de que, quando convertido para a base 2, a matriz de bits resultante pode ser interpretada como [1, R, G, B]. O primeiro elemento pode ser removido e o restante multiplicado por 4 para fornecer facilmente um valor de pixel no formato desejado, que abrange todas as cores de bandeira possíveis (além de verde, ciano e magenta). Também funciona bem que existem variáveis ​​de um caractere inicializadas entre 10 e 15 e, como as variáveis ​​não precisam de espaço para separá-las sintaticamente,

Depois que a função é recuperada, é apenas uma questão de iterar X e Y de 0 a 60, chamando a função a cada etapa e gravando o resultado de volta na matriz de dados da imagem. Um observador astuto pode perceber que os valores de cores retornados por cada função de flag não permitem cinza, no entanto. Portanto, há um pouco de lógica extra para pular espaços. Mas ainda existem os cortes de rabo de andorinha em 'A' e 'B'. Portanto, há um pouco de lógica extra também. Se o valor do caractere for menor que 'C', um valor será definido de forma que o limite superior no loop X varie corretamente em relação a Y e as áreas de corte nunca sejam desenhadas.

No geral, estou muito feliz com o resultado. Demorou muito trabalho, mas foi divertido. Algumas bandeiras não combinam perfeitamente com a imagem de referência, mas acho que todas as formas estão a 1px do alvo (se houver mais que isso, informe-me e eu as corrigirei). Definitivamente, ainda há potencial para otimizar, pois há uma boa quantidade de redundância entre as 26 funções de sinalizador.


Primeira tentativa de testar, 559 bytes

Embora eu nunca tenha terminado isso, eu também vou postar, porque é bem interessante. Em vez de modelar cada sinalizador por uma função de (X, Y) → cor, os sinalizadores são desenhados como uma composição de formas simples. Mas eu estava preocupado com a necessidade de escrever uma quantidade substancial de código de renderização para cada forma diferente. Após muita reflexão, percebi que poderia renderizá-las todas, com algumas sobreposições e desencontros inteligentes, com apenas uma pseudo-forma: todos os pontos dentro de uma distância especificada de um ponto especificado, onde a definição de "distância" é variável. A distância do tabuleiro de xadrez dá um quadrado, a distância de Manhattan dá um diamante e a distância euclidiana dá um círculo. Isso significava que cada forma tinha os mesmos cinco parâmetros (cor, modo de distância, x, y,

"P3
690 690 4
"3a3*a690_@*a*qeuN/{0:U;{_'C<.5*:N;i[[8EX30:Q0Q9X60:ZQQCXQZQ]LLLL[F9TTQQ]Ca[9FTQ42QCTQ54QFTQ66Q9TQ78Q][E9TIQI9T42QI][9FTQZQ][FCXQQQ][E9T40QQET50QQ9TZQQET70QQ9T80QQ][FCTZQQ][E8YQQF][9FTQAQ9TQ9~Q][E9TZQQ][8ETTTQETZZQ][F9XQTK9XZQK9XQZK9XTQK][F4{4{JW^1&6*9+TJ)F*W)F*F}fJ}fW][CEX0ZZ][9FTQQF]Ea[E[TZ]_m*{CT@~24}/][F9TQQF][9FTAQQCT9~QQ][FCTTTQCTZZQ]C9$1>9a/Fa*+[9FTQQKCTQQA]9 6$1>Ca/Fa*+[C7{7\-_1&2*C+X@TT@F*}/]]=_!!{([TQQQ]+\+}*5/{~:R;.5-:H;.5-:G;:M;2b1>4f*:O;Z{ZQWQ-z-N*-{JG-{zM_!+#}:P~WH-PM{+}{e>}?RP<{WV+_2$=JU+Ott}*}fJ}fW}/U90+:U;}/V90+:V;}/`"[]"-
Runer112
fonte
1
Excelente, esse é o tipo de resposta criativa que eu estava procurando. Tentará executá-lo mais tarde.
Level River St
1
Este é possivelmente o código CJam mais longo que eu já vi. Bom trabalho, porém, +1.
Alex A.
Novamente, CJam parece salvar o dia.
ASCIIThenANSI
9
Infelizmente, é uma ofensa federal publicar código CJam com mais de 200 bytes. Vou ter que levá-lo sob custódia.
Deusovi 3/03/16
2

PHP, 811 bytes

function f($s){echo"<body bgcolor=#ccc>";$z=split("\n",gzinflate(base64_decode("vVfNasMwDL7vKQK7xlT+iaHQ9LDTLnuIQus6ENhgxS19+kmO0yRrkhbqGIxtyV8sWbIkZ/Prjtm52p9suYbMHqqjPdHMVYfzx/elhBzyNbXtZoXQ7dvm+Q9+dieb7csvZFkJToNlEq6Zqeq6fAcw2arDqCKXUPMCEYQicIc1xmNfUkBDzXgQkpMQ3W0PEGF7fz49dT7IuSCQ1APJ5h9IKAIhdGn1jIHH6oUzvCpZzhtGjoDiePzuzAPJEkG1JPk1uw29G5rC7pxAvAFxuHqd+nQxpCP65S4gR6wzAkphE4rPHfbYaAueky59BrmrZ4wU0Ss8SES/pCNugMduiBSYs25oJTeBSYNMbHO6+bUg22PPhA8E5LCWhT3SFBjEwxaWiOMYD1+FtZSZxateEAZ7pvsEL7w1aQxD3HxLcmayfNA9ZeXzcdteJLm0H5ZITzAwolDkXeGwVAvlSzUOSDDkMRqRxDkuLquVecbKMRKFaESLSYOMg4b6qVHQMnkMns5jyZLBAnksRehirQWrwClEqakDNrqKpjqKpZ8K5rVYTFE56ZmCyT68KinJX+n/puFpyHXg4RRLwg1oW6YipqfimfJTt6/c6XIv6Tnc/HxNXIj+a9nORdwN5Qa3qzvGHw==")));while($c=ord(ucfirst($s))){$s=substr($s,1);echo$c<32?'<br>':($c^32?$z[$c-64]:$z[0]);}}

O blob compactado contém código SVG para cada um dos 26 sinalizadores. Um loop simples extrai e gera a imagem SVG correspondente a cada caractere da entrada.

Exemplo de saída para "Este é \num teste":

<body bgcolor=#ccc><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h20v60h-20z fill=#f00 /><path d=M20,0h20v60h-20z fill=#fff /><path d=M40,0h20v60h-20z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h30v60h-30z fill=#fff /><path d=M30,0h30v60h-30z fill=#f00 /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#ff0 /><path d=M15,30a15,15,0,0,1,30,0a15,15,0,0,1-30,0z fill=#000 /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#fff /><path d=M15,15h30v30h-30z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#ff0 /><path d=M15,30a15,15,0,0,1,30,0a15,15,0,0,1-30,0z fill=#000 /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#fff /><path d=M15,15h30v30h-30z fill=#00f /></svg><br><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h30v60h-30z fill=#00f /><path d=M45,30l15-30h-30v60h30z fill=#fff /></svg><svg width=90 height=90 viewBox=0,0,90,90></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h20v60h-20z fill=#f00 /><path d=M20,0h20v60h-20z fill=#fff /><path d=M40,0h20v60h-20z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v30h-60z fill=#00f /><path d=M0,30h60v30h-60z fill=#fff /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#fff /><path d=M15,15h30v30h-30z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h20v60h-20z fill=#f00 /><path d=M20,0h20v60h-20z fill=#fff /><path d=M40,0h20v60h-20z fill=#00f /></svg>

( Você pode experimentá-lo em ideone , embora não renderize a página para você.)

ossifrage melindroso
fonte