Me encontré con un artículo donde los estudiantes usaban el tráfico de red para dibujar su universidad en el gráfico IPv6 del país . [imagen]
Su objetivo es simple de decir, pero difícil de implementar. Dibuje el texto CORREO (ya que es una de las pocas palabras que se puede leer en un gráfico 1D) en el gráfico de la CPU.
Debería verse más o menos así:
Elaborando un poco más sobre lo que califica:
- El código no necesita ser multiplataforma (por lo que no necesitará API desconocidas para tratar).
- Puede capturarlo en cualquier utilidad general de uso de CPU que tenga.
- El gráfico se ve un poco peor en una máquina diferente: esta vez confío en ti.
- El% de uso de CPU base debe ser continuo, por lo que si genera una onda aleatoria y resalta algo que se parece a la palabra CORREO, obviamente es trampa.
- Puede elegir la carga máxima para usar, pero tiene que ser lo suficientemente sustancial como para verla claramente.
- Debe seguir la linealidad del ejemplo. (Para M se ve así:% base, luego aumento repentino al máximo especificado, caer gradualmente a un% más bajo, volver a subir al máximo y caer repentinamente al% base nuevamente.)
- Si es ilegible, los votantes lo notarán después de todo.
Se aplican lagunas estándar. ¡Publica las imágenes también!
Respuestas:
Pitón, 143
Cada carácter de la cadena corresponde a un segundo de actividad, desde el carácter ASCII
0
(carga máxima) hasta~
(carga muy ligera). El programa se ejecuta en un ciclo sincronizado en el tiempo, por lo que puede ejecutar varias instancias para obtener mejores resultados.Utilicé Python 2.7.6 en OS X con un Intel Core i7, pero debería funcionar en otras computadoras con un poco de ajuste (ajuste
0.001
). La captura de pantalla a continuación se tomó con una importante actividad de fondo.Actualización: pude producir un gráfico más claro
time()/10
y con una frecuencia de actualización más baja:Y finalmente, aquí hay una versión más golfizada ( 123 bytes ) y su resultado :
fuente
Python,
358281268221194 bytesMonocromo es tan el año pasado. ¡Esto utiliza múltiples procesos y syscalls para lograr gráficos de CPU de dos colores !
Salida del Monitor de actividad (OS X 10.9):
Salida de MenuMeters:
Todas las salidas se generaron con una velocidad de actualización de 1s. No se estaban ejecutando tareas importantes en segundo plano, aunque esta salida supera con bastante facilidad cualquier tarea de CPU de un solo subproceso.
Este código asume que tienes 8 núcleos. Debería ser bastante fácil de modificar para menos / más. Es portátil para sistemas Linux / UNIX (aunque solo se ha probado en OS X), y debe producir la misma salida de dos colores para cualquier monitor de CPU que pueda distinguir el tiempo de CPU del usuario del sistema.
Esencialmente, esto funciona al desechar siete procesos, cada uno de los cuales elegirá pasar 1 segundo durmiendo, girando en modo de usuario o girando el núcleo. El giro en el modo kernel se logra solicitando grandes cantidades de datos
/dev/urandom
, lo que obliga al controlador/dev/urandom
a invertir una gran cantidad de ciclos de CPU del "sistema".EDITADO [21/07]: se acortó significativamente al usar en
fork()
lugar demultiprocessing.Process
(/dev/urandom
solo funciona en sistemas * NIX de todos modos, por lo que esto no reduce la portabilidad). Sin embargo, tenga en cuenta que el programa ahora genera tareas en segundo plano ; Puede que tenga quekillall Python
(o similar) para deshacerse de los consumidores de CPU.No pude resistirme a implementar algunas cartas más. Tengo 16 letras, más algunos símbolos:
El alfabeto completo es "ACDFHILMNOPTUVWY", con los símbolos "._ ~ / \". Probablemente hay muchos más personajes que se pueden representar.
Código completamente sin golf para las letras adicionales:
fuente
C (Intel Core Duo + OS X / Darwin), 248 bytes
Este código es tan portátil como la Gran Pirámide de Keops. Lo siento por eso. Los valores devueltos
mach_absolute_time()
dependen del hardware, pero en mi máquina el valor aumenta aproximadamente una vez por nanosegundo.Aquí está el resultado:
Hay dos gráficos porque el procesador tiene dos núcleos. Establecí la carga máxima de CPU en aproximadamente el 90% porque el proceso puede cambiar entre núcleos cada vez que llamo
usleep()
. Con una carga del 100%, el proceso se encadena a un núcleo y los resultados son ilegibles ( ver esto, por ejemplo )fuente
uint64_t
variables en el encabezado del siguientefor
bucle?Ruby, 150 caracteres.
Esto no es tan corto hasta ahora, pero en mi opinión el resultado es bastante bueno, así que pensé que publicaría esto de todos modos. Al igual que con la mayoría de las otras soluciones, es posible que deba fijar el proceso de Ruby en un núcleo determinado con el prefijo
taskset -c $core
.El código es una combinación simple de girar / dormir durante una cierta cantidad de tiempo, lo que debería hacerlo algo portátil. Los gradientes suaves se crean variando la relación del tiempo de centrifugado / reposo.
Bajar la frecuencia de muestreo de la CPU hace que los bordes se vean un poco mejor:
Al agregar algunas letras más al alfabeto (
AILMNUVW
son algo reconocibles), también podemos escribir algunas otras palabras:Estas imágenes se generaron con el siguiente código:
Las palabras que se pueden escribir con las letras implementadas se pueden encontrar con
fuente
Python, el procesador Intel Pentium 4 3.0 GHz,
180 166 145 141138 bytesLlamada con
taskset -c 0 python cpu_graph_drawer.py
.taskset
es necesario para restringir el proceso para usar solo una CPU / núcleo (hyperthreading en mi caso).El resultado no es tan bueno.
fuente
gnome-system-monitor
es lo único que sé. ¿Tienes alguna alternativa que se ejecute en LMDE Cinnamon?a=[...]+[(.1,.2)]*10
lugar de.extend
.Java 8, 482 caracteres
Cada carácter en la cadena significa número de hilos, que serán utilizados. Imagen tomada en Intel Core i3 (2 núcleos / 4 hilos).
Editar : versión más golfizada (322 caracteres), misma funcionalidad:
fuente
C, 78 bytes
Nunca dijiste que no podíamos aceptar las aportaciones de los usuarios, así que ...
Este programa lee desde el estándar y cada vez que lee un carácter, ejecuta un desperdicio de CPU gratuito para el bucle, luego llama a main nuevamente. Usted controla la cantidad de tiempo de CPU que usa enviando la tecla enter a diferentes velocidades.
Ejecuté esto en un Intel i3 4130T, que es un procesador razonablemente nuevo. Pero su millaje puede variar, si está usando más o menos tiempo de CPU de lo que es práctico para usted, intente jugar con la cantidad de cambio en el ciclo de retraso.
Mi programa es increíble porque:
Después de algunos intentos, produje un gráfico que se veía así:
fuente
taskset -c 1 [file]
yes | [program]