Encontrei um artigo em que os alunos usavam o tráfego de rede para desenhar sua universidade no gráfico IPv6 do país . [imagem]
Seu objetivo é simples de dizer, mas difícil de implementar. Desenhe o texto MAIL (como é uma das poucas palavras que podem ser lidas em um gráfico 1D) no gráfico da CPU.
Deve ser algo como isto:
Elaborando um pouco mais sobre o que qualifica:
- O código não precisa ser multiplataforma (portanto, você não precisará lidar com APIs desconhecidas).
- Você pode capturá-lo em qualquer utilitário geral de uso da CPU que possui.
- O gráfico parece um pouco pior em uma máquina diferente: confio em você neste momento.
- O% de uso básico da CPU deve ser contínuo; portanto, se você gerar uma onda aleatória e destacar algo parecido com a palavra MAIL, obviamente isso é trapaça.
- Você pode escolher a carga máxima a ser usada, mas precisa ser substancial o suficiente para vê-la claramente.
- Você deve seguir a linearidade do exemplo. (Para M, é assim: base% e, em seguida, aumento repentino até o máximo especificado, diminua gradualmente para um% mais baixo, retorne ao máximo e queda repentina para o% base novamente.)
- Se for ilegível, os eleitores perceberão, afinal.
Aplicam-se brechas padrão. Publique as imagens também!
Respostas:
Python, 143
Cada caractere da sequência corresponde a um segundo de atividade, do caractere ASCII
0
(carga máxima) até a~
(carga muito leve). O programa é executado em um loop sincronizado com o tempo, para que você possa executar várias instâncias para obter melhores resultados.Usei o Python 2.7.6 no OS X com um Intel Core i7, mas ele deve funcionar em outros computadores com alguns ajustes (ajuste o
0.001
). A captura de tela abaixo foi tirada com significativa atividade em segundo plano.Atualização - Consegui produzir um gráfico mais claro
time()/10
e com uma frequência de atualização mais baixa:E, finalmente, aqui está uma versão mais prática ( 123 bytes ) e seu resultado :
fonte
Pitão,
358281268221194 bytesMonocromático é tão no ano passado. Isso usa vários processos e syscalls para obter gráficos de CPU em duas cores !
Saída do Activity Monitor (OS X 10.9):
Saída de MenuMeters:
Todas as saídas foram geradas com uma velocidade de atualização de 1s. Nenhuma tarefa em segundo plano significativa estava em execução, embora essa saída supere com facilidade qualquer tarefa da CPU de thread único.
Este código supõe que você tenha 8 núcleos. Deve ser muito fácil modificar por menos / mais. É portátil para sistemas Linux / UNIX (embora tenha sido testado apenas no OS X) e deve produzir a mesma saída de duas cores para qualquer monitor de CPU que possa distinguir o tempo de CPU do usuário do sistema.
Essencialmente, isso funciona executando sete processos, cada um dos quais escolherá passar 1 segundo dormindo, girando no modo de usuário ou girando o kernel. A rotação no modo kernel é obtida solicitando grandes quantidades de dados
/dev/urandom
, o que força o driver/dev/urandom
a gastar muitos ciclos de CPU do "sistema".EDITADO [21/07]: Encurtado significativamente usando em
fork()
vez demultiprocessing.Process
(/dev/urandom
funciona apenas em sistemas * NIX de qualquer maneira, portanto isso não reduz a portabilidade). Observe, no entanto, que o programa agora gera tarefas em segundo plano ; pode ser necessáriokillall Python
(ou similar) para se livrar dos comedores de CPU.Não pude resistir a implementar mais algumas cartas. Eu tenho 16 letras, mais alguns símbolos:
O alfabeto completo é "ACDFHILMNOPTUVWY", com os símbolos "._ ~ / \". Provavelmente há muito mais caracteres que podem ser representados.
Código totalmente não destruído para as letras extras:
fonte
C (Intel Core Duo + OS X / Darwin), 248 bytes
Esse código é tão portátil quanto a Grande Pirâmide de Quéops. Me desculpe por isso. Os valores retornados
mach_absolute_time()
dependem do hardware, mas na minha máquina o valor aumenta cerca de uma vez por nanossegundo.Aqui está o resultado:
Existem dois gráficos porque o processador possui dois núcleos. Defino a carga máxima da CPU para cerca de 90% porque o processo pode alternar entre núcleos sempre que eu ligar
usleep()
. Com uma carga de 100%, o processo é acorrentado a um núcleo e os resultados são ilegíveis ( veja isso, por exemplo )fonte
uint64_t
variáveis no cabeçalho do seguintefor
loop?Ruby, 150 caracteres
Até agora, não é tão curto assim, mas, na minha opinião, a saída é bastante agradável, então achei que publicaria isso de qualquer maneira. Como na maioria das outras soluções, pode ser necessário fixar o processo Ruby em um determinado núcleo, prefixando-o com
taskset -c $core
.O código é uma combinação simples de rotação / suspensão por um certo período de tempo, o que deve torná-lo um pouco portátil. Gradientes suaves são criados variando a proporção de rotação / tempo de sono.
Diminuir a frequência de amostragem da CPU torna as bordas um pouco melhores:
Ao adicionar mais algumas letras ao alfabeto (
AILMNUVW
são um pouco reconhecíveis), também podemos escrever outras palavras:Essas imagens foram geradas com o seguinte código:
Palavras que podem ser escritas com as letras implementadas podem ser encontradas com
fonte
Python, no Intel Pentium 4 3.0Ghz,
180 166 145 141138 bytesLigue com
taskset -c 0 python cpu_graph_drawer.py
.taskset
é necessário para restringir o processo para usar apenas uma CPU / núcleo (hyperthreading no meu caso).O resultado não é tão bom.
fonte
gnome-system-monitor
é a única coisa que sei. Tem alguma alternativa que seria executada no LMDE Cinnamon?a=[...]+[(.1,.2)]*10
vez de.extend
.Java 8, 482 caracteres
Cada caractere na String significa o número de threads que serão utilizados. Imagem tirada no Intel Core i3 (2 núcleos / 4 threads).
Edit : versão mais golfe (322 caracteres), mesma funcionalidade:
fonte
C, 78 bytes
Você nunca disse que não podíamos aceitar a entrada do usuário, sooo ..
Este programa lê desde o padrão e toda vez que lê um caractere, ele executa uma CPU gratuita que está desperdiçando o loop e depois chama o main novamente. Você controla a quantidade de tempo de CPU que ele usa enviando spam a tecla Enter em velocidades diferentes.
Eu executei isso em um intel i3 4130T, que é um processador razoavelmente novo. Mas sua milhagem pode variar, se estiver usando mais ou menos tempo de CPU do que o praticável para você observar, tente brincar com a quantidade de turnos no loop de atraso.
Meu programa é incrível porque:
Depois de algumas tentativas, produzi um gráfico parecido com este:
fonte
taskset -c 1 [file]
yes | [program]