Então eu acho que todos nós provavelmente já vimos essa história em quadrinhos xkcd :
:
Isso pode ser muito geral ou muito difícil, não tenho certeza. Mas o desafio é criar um programa em qualquer idioma que crie uma janela que tenha pelo menos duas cores e exiba em inglês o percentual da tela de cada cor.
ex. A solução mais simples seria um fundo branco com letras pretas que diz "Porcentagem desta imagem em preto: [x]%. Porcentagem dessa imagem em branco: [y]%"
Você pode ficar tão louco ou simples quanto quiser; texto simples é uma solução válida, mas se você criar imagens interessantes, como nos quadrinhos xkcd, é ainda melhor! O vencedor será a solução mais divertida e criativa que conseguir mais votos. Então vá em frente e faça algo divertido e digno de xkcd! :)
Então, o que você acha? Soa como um desafio divertido? :)
Inclua uma captura de tela do seu programa em execução na sua resposta :)
fonte
"/.*/"
(leia-se: [código fonte] não contém uma nova linha)Respostas:
Olmo
Ainda não vi ninguém usar essa brecha: demo
fonte
view source
é colocado lá pelo share-elm.com e não faz parte do JS / HTML compilado.JavaScript com HTML
Tentei reproduzir o quadrinho original com mais precisão. Uma captura de tela é feita usando a biblioteca html2canvas. Os números são calculados repetidamente, para que você possa redimensionar a janela ou até mesmo adicionar algo à página em tempo real.
Experimente online: http://copy.sh/xkcd-688.html
Aqui está uma captura de tela:
fonte
Processando, 222 caracteres
Eu sempre quis fazer minha própria versão dessa história em quadrinhos! A maneira mais simples (apenas?) De pensar em fazer isso foi tentativa e erro - desenhe algo, conte, desenhe novamente ...
Este programa estabelece uma porcentagem precisa após alguns segundos. Não é muito bonito, mas é interativo ; você pode redimensionar a janela e ela começará a recalcular.
Adicionadas algumas novas linhas para facilitar a leitura:
Ele mostra apenas a porcentagem de pixels brancos; Devido ao antialiasing do texto, os pixels não brancos não são necessariamente pretos. Quanto mais tempo estiver em execução, mais tempo será necessário para se atualizar em um redimensionamento.
Editar:Então, é um desafio de código; Eu meio que jogava golfe de qualquer maneira. Talvez eu pudesse adicionar algum tipo de gráfico mais tarde, mas o princípio geral permaneceria o mesmo. A interatividade é a parte legal, eu acho.
fonte
background(-1)
em vez debackground(255)
Grande desafio. Aqui está a minha solução. Tentei me aproximar o máximo possível do quadrinho original, até usei a fonte xkcd .
É um aplicativo WPF, mas eu costumava
System.Drawing
fazer as peças de desenho porque sou preguiçoso.Conceito básico: No WPF, as janelas são
Visuals
, o que significa que podem ser renderizadas. Eu renderizo toda a instância do Windows em um bitmap, conto o preto e o total de preto ou branco (ignorando os cinzas na suavização da fonte e outras coisas) e também os conto para cada 3 da imagem (para cada painel). Então eu faço isso novamente em um temporizador. Atinge o equilíbrio dentro de um ou dois segundos.Baixar:
MEGA Verifique sempre os arquivos baixados em busca de vírus, etc., etc.
Você precisará instalar a fonte acima no seu sistema, se quiser vê-la, caso contrário, é a fonte padrão do WPF.
XAML:
Código:
O código não está limpo, mas deve ser um pouco legível, desculpe.
fonte
C (com SDL e SDL_ttf): solução em escala de cinza
Aqui está uma solução que aproveita o formulário do gráfico de pizza para capturar o espectro completo de cores de pixel em escala de cinza, com um clock de menos de 100 linhas.
Como na minha solução anterior, o caminho para o arquivo da fonte precisa ser codificado na fonte ou adicionado ao comando build, por exemplo:
A saída do programa é assim:
Este é divertido de assistir, porque toda a matemática retarda os redesenhos para onde você pode ver o programa se concentrar na solução estável. A primeira estimativa é descontrolada (já que a superfície começa totalmente preta) e depois diminui para o tamanho final após cerca de uma dúzia de iterações.
O código funciona fazendo uma contagem de população de cada cor de pixel na imagem atual. Se essa contagem de população não corresponder à última, redesenha a imagem. O código itera sobre cada pixel, mas transforma as coordenadas x, y em coordenadas polares, computando primeiro o raio (usando o centro da imagem como origem). Se o raio estiver dentro da área do gráfico de pizza, ele calculará o teta. O teta é facilmente dimensionado para a contagem da população, que determina a cor do pixel. Por outro lado, se o raio estiver na borda do gráfico de pizza, um valor anti-serrilhado será calculado para desenhar o círculo ao redor da parte externa do gráfico. As coordenadas polares facilitam tudo!
fonte
float
versões de funções matemáticas de biblioteca, mas, em seguida, não devefabs
serfabsf
?fabs()
é mais portátil.C (com SDL e SDL_ttf)
Aqui está uma implementação muito simples, em cerca de 60 linhas de código C:
Para compilar isso, você precisa definir
FONTPATH
para apontar para um arquivo .ttf da fonte a ser usada:Na maioria das máquinas Linux modernas, você pode usar o
fc-match
utilitário para procurar locais de fontes, para que o comando compile se torne:(É claro que você pode substituir a fonte solicitada pela sua favorita.)
O código solicita especificamente sem suavização de serrilhado, para que a janela contenha apenas pixels em preto e branco.
Por fim, fui inspirado pela solução elegante do @ daniero para permitir o redimensionamento de janelas. Você verá que, às vezes, o programa oscila entre as contagens, preso em uma órbita em torno de um atrator que nunca pode alcançar. Quando isso acontecer, redimensione a janela um pouco até que ela pare.
E, por solicitação, veja como fica quando eu o executo no meu sistema:
Finalmente, acho que devo salientar, caso alguém aqui ainda não tenha visto, que o MAA publicou uma entrevista com Randall Munroe, na qual ele discute a criação do desenho animado # 688 com mais detalhes.
fonte
A imagem é 100x100 e os números são exatos, e quero dizer exato - escolhi uma imagem de 10000 pixels para que as porcentagens pudessem ser expressas com duas casas decimais. O método era um pouco de matemática, um pouco de adivinhação e alguns trituradores de números em Python.
Como sabia antecipadamente que as porcentagens podiam ser expressas em 4 dígitos, contei quantos pixels pretos havia em cada um dos dígitos de 0 a 9, em Arial de 8 pixels de altura, que é o texto em que o texto está escrito. função rápida,
weight
que indica quantos pixels são necessários para escrever um determinado número, preenchidos com zeros para ter 4 dígitos:px
é um array que mapeia os dígitos para o número de pixels necessários. Se B é o número de pixels pretos e W é o número de pixels brancos, temosB + W = 10000
e precisamos:De onde vieram as constantes? 423 é o número "inicial" de pixels pretos, o número de pixels pretos no texto sem os números. 9577 é o número de pixels brancos iniciais. Eu tive que ajustar a quantidade de pixels pretos iniciais várias vezes antes de conseguir obter constantes de forma que o sistema acima tivesse uma solução. Isso foi feito adivinhando e cruzando os dedos.
O sistema acima é terrivelmente não linear, portanto, obviamente, você pode esquecer de resolvê-lo simbolicamente, mas o que você pode fazer é fazer um loop entre todos os valores de B, definir W = 10000 - B e verificar as equações explicitamente.
fonte
QBasic
Porque nostalgia.
E porque eu realmente não conheço nenhuma biblioteca de imagens, é uma linguagem moderna.
Método bastante direto de saída, contagem e repetição. O principal "interessante" é que o programa tenta aleatoriamente diferentes precisões para as porcentagens - descobri que nem sempre converge de outra maneira.
E a saída (testada em QB64 ):
fonte
AWK
... com netpbm e outros ajudantes
O arquivo 'x':
A corrida:
A imagem está escrita como 'x.pbm', converti-a para png para fazer o upload:
fonte