Seu programa deve ter como entrada uma linha de caracteres, assim:
@+.0
E produza os caracteres classificados pela escuridão, assim:
.+0@
Requisitos:
Você deve usar uma fonte monoespaçada para detecção de escuridão.
Você deve descobrir quantos pixels cada caractere ocupa. Você deve realmente desenhar o caractere e contar pixels, ou seja, não pode apenas codificar os valores de pixels.
- Como regra mais concreta: se você trocou as fontes, seu programa ainda deve funcionar. Além disso, seu programa deve poder alternar fontes simplesmente alterando uma variável ou valor ou string no código.
Se você usar antialiasing, deverá contar pixels como porcentagens de um pixel totalmente preto. Por exemplo, um
rgb(32, 32, 32)
pixel contará como 1/8 de um pixel completo. Desconsidere esta regra se seus personagens não tiverem antialias.Depois de contar os pixels, você deve classificar os caracteres pela quantidade de pixels e gerá-los em ordem.
Isso é código-golfe , então o código mais curto em bytes vencerá.
Respostas:
Mathematica,
112 110108 bytesIsso ainda pode ser ainda mais jogado. Assume que a sequência está na variável s.
E agora usa uma sintaxe correta para classificar uma lista por outra lista.
Casos de teste de sorte -> "Ah, sim, isso funciona" -> Facepalm
Obrigado pelos olhos afiados, David Carraher.
Atualização: OCR A substituído por Menlo porque percebi que no OSX o nome da família de fontes OCR A é realmente OCR A Std. Então, eu estava classificando uma fonte padrão em vez do negócio real. Menlo também é monoespaçado com a mesma contagem de bytes, portanto, não há ganho ou perda líquida.
Eu coloquei uma exportação CDF hospedado do notebook , para que possa ver o código em ação, se desejar. Ainda estou tentando descobrir como adicionar um pouco de interatividade aos CDFs hospedados na Web, então por enquanto é apenas estático.
Saída para
s = FromCharacterCode /@ Range[33, 135];
com "Courier"Saída para o mesmo, mas com o FontFamily "Monospace":
Observe que os resultados finais são mostrados na fonte interna da MM, não na fonte que está sendo classificada. Portanto, você vê as diferenças na fonte escolhida refletidas na classificação. O link CDF mostra ambos, no entanto, para os finalistas.
Código não destruído:
fonte
"" <> (FromCharacterCode /@ Range[33, 135])
StringJoin@SortBy[Characters@"@+.0",ImageData@Binarize@Rasterize@Style[#,FontFamily->"Monospace"]~Total~2&]
Bash + ImageMagick:
164147148 caracteresExemplo de execução:
Separadores são inseridos entre grupos de tons de cinza. Caracteres com nível de cinza idêntico não são separados:
fonte
sort
QBasic, 259 bytes
Eu fiz isso por diversão, por isso é tecnicamente não compatível com as regras de uma maneira. Não leva uma lista de caracteres, mas imprime todos os caracteres de 32 a 255 e usa-os. Se você realmente deseja ver uma versão que esteja em conformidade com esta regra, informe-me.
Ele também falha em outro detalhe técnico: "Além disso, seu programa deve poder alternar fontes simplesmente alterando uma variável ou valor ou string no código". Não há uma maneira fácil de fazer isso no QBasic. No entanto, é claro que o programa funcionará bem em qualquer página de código de sua escolha.
Por fim, eu poderia espremer alguns caracteres (principalmente espaços em branco que o QBasic IDE insere de maneira útil), mas provavelmente não vale a pena, pois essa resposta não tem chance de ganhar de qualquer maneira.
fonte
DOM do Javascript + Canvas e navegador (
280237235 bytes)Versão atualizada com sugestões de Fors e escova de dentes nos comentários:
Versão mais legível:
Talvez possa ser jogado mais.
Eu sou novo neste site, por isso não tenho certeza de como a entrada é normalmente lida para respostas Javascript. Presumo entrada está contido em uma variável chamada
s
. Caso contrário, atualizarei a resposta e a contagem de caracteres.JSFiddle da versão atualizada.
JSFiddle da primeira versão .
fonte
c
es
são desnecessárias (a=document.createElement('canvas').getContext('2d')
ey+=a.getImageData(0,0,30,30).data[i]
), o elemento não precisa ser anexado, a inicialização zero dey
pode ser combinada com a dei
(i=y=0
), o pós-incremento dei
pode ser combinado com a adição dey
(for(...;y+=...[i++]);
) e o tipo de letra Mônaco é mono-espaçada e tem um nome mais curto que Courier.prompt()
; mas isso também é bom.y=i=0;
e alterara.fillText(x,0,20)
paraa.fillText(x,y=i=0,20)
.PHP, 298 caracteres
Adicionei algumas quebras de linha para que você possa vê-lo em todo o seu hediondo:
Este código usa as fontes GD que vêm embutidas no PHP. O segundo argumento de
imagechar()
seleciona a fonte (números de 1 a 5 são válidos).Exemplo:
Se você inserir o seguinte no topo do código mostrado acima, poderá fornecer a lista de caracteres no seu navegador da web.
fonte
imagecreatetruecolor
poderá soltar o primeiro alocado e usar o nome da função diretamente no segundo, para -11.[]
em vez dearray()
. eforeach($a as$v)
funciona bemGTB
Esse código tem o código mais difícil que eu já escrevi para uma calculadora. Sem valores de pixel codificados, ele realmente desenha o texto em um gráfico e faz um loop para contar cada pixel.
Entrada
Saída
fonte
Java -
468 450444@+.0abcdefghijklmnopqrstuvwxyz
->.irl+jcvtfxyzsuonkheaqpdb0wgm@
Ungolfed:
fonte
Postscript, 381
Aqui está algo completamente diferente, apenas por diversão. Como a maioria das fontes é vetorial de qualquer maneira, 'contar pixels' é um pouco estranho, não é? Calcular a área da forma do glifo, apesar de estar correta, não é tão fácil. Uma alternativa pode ser a digitalização de um retângulo e a contagem de 'ocorrências' quando um ponto está dentro de uma forma de glifo, e o Postscript possui operadores para esse tipo de verificação. No entanto, é verdade que a digitalização e o teste de insidiosidade são apenas uma maneira estranha de contar pixels.
.
E aqui estão os resultados para três fontes diferentes (seleção das quais podem ser não comentadas, acima):
fonte
Perl (com GD) (159)
uso:
editar: reduzido para 159 caracteres
fonte
Java, 584
Uau ... Esta não era uma boa linguagem para fazer isso.
Uso:
Essa configuração resulta em:
A única linha aqui que precisa de explicação:
Então esta peça final reúne ...
Iterando todos os pontos e somando a contagem de pontos. Essas informações de densidade são passadas de volta para o comparador e são usadas para classificação.
fonte
R, 195 caracteres
Recuado com comentários:
Exemplo:
Como a gestão de fontes nos gráficos R depende da plataforma, não posso garantir que funcione no PC, mas no Mac (OS X 10.7.5, R 2.14.2).
fonte
SmileBASIC,
179176173 bytesUsa a fonte atualmente carregada. As fontes podem ser carregadas
LOAD"GRPF:filename"
.Código mais legível:
fonte
PHP - 485
Demo:
Código:
fonte
Python + freetype-py: 147
fonte