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.)
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
fonte
Respostas:
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.
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:
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,
fonte
PHP, 811 bytes
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 é
\n
um teste":( Você pode experimentá-lo em ideone , embora não renderize a página para você.)
fonte