Courier Ception

13

Courier Ception

O programa deve aceitar qualquer sequência como entrada e gerar uma imagem de pixel que mostra a sequência de entrada no Courier. Todas as letras que contêm um 'buraco' (como abdegopqABDPQRetc) cercado por pixels pretos também devem ser preenchidas em preto.

Entrada

O Programa deve poder aceitar qualquer sequência ASCII como entrada. A entrada pode ser da maneira que você quiser, desde que o código do programa em si não precise ser alterado para aceitar uma entrada diferente. (Exceto, por exemplo, o nome do arquivo do arquivo que deve ser lido.) Nenhuma brecha padrão. Você pode assumir que cada entrada contém pelo menos uma letra imprimível.

Resultado

A saída deve ser um gráfico de pixels em preto e branco (sem cinza) que mostre a sequência escrita em Courier (em preto, branco com fundo), com os 'buracos' especificados preenchidos. O tamanho da fonte de toda a cadeia deve ser constante (o que significa que não há redimensionamento diferente para cada letra diferente), de modo que as letras de tamanho completo (por exemplo,ABCDEFGHIJKLMNOPRSTUVWXYZ mas j e Q sejam maiores) devem ter pelo menos 10 px de altura. (Você não precisa gravá-lo em um arquivo, qualquer tipo de exibição é aceitável desde que seja gerado como pixelgraphics, como, por exemplo, tela em JavaScript.) Por favor, poste este gráfico com sua resposta.

O acesso às bibliotecas courier.ttf / font é permitido.

O programa também deve contar o número de pixels pretos e gravá-lo no console ou no método de saída que preferir no final.

Ponto

A pontuação é avaliada da seguinte forma: O código completo do programa deve ser usado como sequência de entrada para o seu programa. O número de pixels pretos será sua pontuação. O código do programa que contém letras imprimíveis ou não ASCII não é permitido. (Assim como as brechas padrão.) Quanto menor a pontuação, melhor.

flawr
fonte
A saída é especificada como preto e branco, portanto, não são permitidos pixels cinza. E obrigado por perguntar sobre a codificação, isso será limitado ao ASCII por causa da fonte.
flawr
1
Existem pelo menos dois problemas sérios que precisam de esclarecimentos. Primeiro, não está claro se o programa tem permissão para acessar o Courier.ttf e as bibliotecas de fontes que podem usá-lo. Em segundo lugar, você pretende seriamente proibir programas que não contenham caracteres não ASCII?
Peter Taylor
Sim, o acesso às Courier.ttf e às bibliotecas de fontes é permitido - não faria sentido, obrigado. Não consegui encontrar nenhum idioma principal que dependa de caracteres não ASCII - você conhece algum idioma que precise de caracteres não ASCII?
flawr
1
@flawr APL. E no Mathematica você pode reduzir algumas coisas usando caracteres Unicode.
Martin Ender
O ImageMagick é permitido?
Digital Trauma

Respostas:

12

Mathematica, 4864 pixels

l = ImageData[Binarize[Rasterize[Style[j, FontSize -> 15]], .71]]
i = {{1, 1}}
While[Length[i] > 1 - 1,
 {r, c} = j = i[[1]]; l[[r, c]] = 2; i = i[[2 ;; -1]];
 If[FreeQ[i, {r, c} = J = j + #] && l[[r, c]] == 1, 
    i = i~Join~{J}] & /@
  {{1, 1 - 1}, {1 - 1, 1}, {-1, 1 - 1}, {1 - 1, -1}}
 ]
Image[l = l /. 1 -> 1 - 1 /. 2 -> 1]
Count[l, 1 - 1, {2}]

Aqui está a foto:

insira a descrição da imagem aqui

No Mathematica, quando você escreve um "programa", basta escrever um trecho. Portanto, isso espera que a entrada armazenada je a última coisa que retorne sejam a imagem e a contagem. Isso também gera muitos erros, porque eu não faço verificação de limites l, mas produz o resultado desejado de qualquer maneira.

onde %se refere à última saída mencionada.

Agradecemos a Geobits pela ideia do algoritmo. Estou preenchendo a imagem do canto superior esquerdo com uma intensidade inválida, substituindo todos os pixels brancos restantes por pixels pretos e os inválidos por brancos.

Observe que a FreeQverificação não é realmente necessária para o programa funcionar corretamente, mas para concluir em um período de tempo razoável. Se eu deixasse de fora, na verdade eu marcaria cerca de 300 pixels a menos.

Martin Ender
fonte
A contagem deve fazer parte do próprio programa! Além disso, é uma boa solução, você calculou quais letras (como nomes de variáveis) usam o menor número de pixels?
flawr
@flawr yes :) (-se agora para todos eles) (fixação da contagem em um segundo)
Martin Ender