Vẽ với CPU của bạn


289

Tôi đã bắt gặp một bài báo nơi sinh viên sử dụng lưu lượng mạng để vẽ trường đại học của họ trên biểu đồ IPv6 của đất nước . [Hình ảnh, tưởng tượng]

Mục tiêu của bạn là đơn giản để nói, nhưng khó thực hiện. Vẽ văn bản MAIL (vì đây là một trong số ít các từ có thể đọc được trên biểu đồ 1D) trên biểu đồ CPU.

Nó sẽ trông giống như thế này:

Kết quả

Xây dựng thêm một chút về những gì đủ điều kiện:

  • Mã không cần phải đa nền tảng (vì vậy bạn sẽ không cần các API không xác định để xử lý).
  • Bạn có thể nắm bắt nó trong bất kỳ tiện ích sử dụng CPU chung nào mà bạn có.
  • Biểu đồ trông hơi tệ hơn trên một máy khác: Tôi tin bạn lần này.
  • % Sử dụng CPU cơ sở phải liên tục, vì vậy nếu bạn tạo một sóng ngẫu nhiên và làm nổi bật một cái gì đó trông giống như từ MAIL, thì rõ ràng là gian lận.
  • Bạn có thể chọn tải tối đa để sử dụng, nhưng nó phải đủ lớn để thấy rõ nó.
  • Bạn phải tuân theo tính tuyến tính của ví dụ. (Đối với M, nó trông như thế này:% cơ sở, sau đó tăng đột ngột đến mức tối đa được chỉ định, giảm dần xuống% thấp hơn, tăng trở lại mức tối đa và giảm đột ngột xuống% cơ sở một lần nữa.)
  • Nếu không thể đọc được, cử tri sẽ chú ý sau tất cả.

Tiêu chuẩn áp dụng. Đăng hình ảnh quá!


9
Tôi không thấy một lý do cho việc bỏ phiếu chặt chẽ nữa. Cá nhân tôi thấy đây là một thử thách thú vị, mặc dù có một chút hệ thống cụ thể.
xem

6
Vấn đề tôi thấy với mã golf là đánh giá mức độ dễ đọc là đủ rõ ràng. Nếu bạn có thể nghĩ ra một cách để xác định điều đó một cách khách quan, điều đó sẽ cải thiện đáng kể thử thách, nhưng dù sao đó cũng là một ý tưởng hay!
Martin Ender

3
nó thực sự giống như hình ảnh của bạn, nhưng tôi đảm bảo với bạn nếu bạn không nói nó thành lời, mọi người sẽ diễn giải "vẽ MAIL" rất tự do.
Martin Ender

33
+1, thật là vô lý đến nỗi tôi suýt cười thầm cho đến chết ... "đây là sự điên rồ ..." "sự điên rồ .. ĐÂY LÀ CODEGOLF !!!"
vaxquis

5
Đây là một câu hỏi tuyệt vời . Tôi ước mình đủ thông minh để tham gia. Điều đó không thực sự quan trọng, tôi quan tâm đến các giải pháp sáng tạo của người khác: P
Chris Cirefice

Câu trả lời:


117

Con trăn, 143

from time import*
while 1:
 sleep((ord('00012345654321000~~~D:6300036:D~~~000~~~000DDDD~~~~~'[int(time())%52])-48)*0.001);x=10**5
 while x:x-=1

Mỗi ký tự của chuỗi tương ứng với một giây hoạt động, từ ký tự ASCII 0(tải tối đa) đến ~(tải rất nhẹ). Chương trình chạy trên một vòng lặp được đồng bộ hóa thời gian, vì vậy bạn có thể chạy nhiều phiên bản để có kết quả đẹp hơn.

Tôi đã sử dụng Python 2.7.6 trên OS X với Intel Core i7, nhưng nó sẽ hoạt động trên các máy tính khác với một chút tinh chỉnh (điều chỉnh 0.001). Ảnh chụp màn hình dưới đây được chụp với hoạt động nền quan trọng.

THƯ

Cập nhật - Tôi đã có thể tạo một biểu đồ rõ ràng hơn time()/10và tần suất cập nhật thấp hơn:

THƯ

Và cuối cùng, đây là một phiên bản được chơi nhiều hơn ( 123 byte ) và kết quả của nó :

from time import*
while 1:
 sleep((ord('002464200~~A5005A~~00~~00DDD~~'[int(time()/2)%30])-48)*0.001);x=10**5
 while x:x-=1

250

Python, 358 281 268 221 194 byte

Đơn sắc là như vậy năm ngoái. Điều này sử dụng nhiều quy trình và tòa nhà để đạt được hai biểu đồ CPU màu !

import os,time
A='%-99o'%int('t12q2lxqkap48euoej9429cstbnazl63ubyryteo49u',36)
for i in'0123456':
 t=os.fork()
 while t<1:T=int(time.time())%50;(time.sleep,(id,os.urandom)[i<A[T+49]])[i<A[T]](1)

Đầu ra từ Trình giám sát hoạt động (OS X 10.9):

Biểu đồ tải CPU giám sát hoạt động Biểu đồ lịch sử CPU Giám sát hoạt động

Lặp lại trên biểu đồ Lịch sử CPU

Đầu ra từ MenuMeter:

Đầu ra MenuMeter

Tất cả các kết quả đầu ra được tạo ra với tốc độ cập nhật là 1 giây. Không có tác vụ nền quan trọng nào đang chạy, mặc dù đầu ra này khá dễ dàng vượt qua mọi tác vụ CPU đơn luồng.

Mã này giả sử bạn có 8 lõi. Nó sẽ khá dễ dàng để sửa đổi cho ít / nhiều hơn. Nó có thể di chuyển tới các hệ thống Linux / UNIX (mặc dù nó mới chỉ được thử nghiệm trên OS X) và sẽ tạo ra cùng một đầu ra hai màu cho bất kỳ màn hình CPU nào có thể phân biệt Người dùng với thời gian CPU của Hệ thống.

Về cơ bản, điều này hoạt động bằng cách loại bỏ bảy quy trình, mỗi quy trình sẽ chọn dành 1 giây để ngủ, quay trong usermode hoặc quay kernel. Việc quay vòng trong chế độ kernel đạt được bằng cách yêu cầu các luồng dữ liệu lớn từ /dev/urandomđó, điều này buộc người lái /dev/urandomphải lùi nhiều chu kỳ CPU "hệ thống".

EDITED [21/07]: Rút ngắn đáng kể bằng cách sử dụng fork()thay vì multiprocessing.Process( /dev/urandomchỉ hoạt động trên các hệ thống * NIX vì vậy điều này không làm giảm tính di động). Tuy nhiên, lưu ý rằng chương trình hiện sinh ra các tác vụ nền ; bạn có thể phải killall Python(hoặc tương tự) để loại bỏ những kẻ ăn CPU.


Tôi không thể cưỡng lại việc thực hiện thêm một vài chữ cái. Tôi đã nhận được 16 chữ cái, cộng với một vài ký hiệu:

~ /._ PIN ANCHO ... ... VY

Bảng chữ cái hoàn chỉnh là "ACDFHILMNOPTUVWY", với các ký hiệu "._ ~ / \". Có lẽ có rất nhiều nhân vật có thể được đại diện.

Mã hoàn toàn vô căn cứ cho các chữ cái thêm:

from time import*
from multiprocessing import*

chars6 = {
'A': ('123456654321',
      '000123321000'),
'C': ('344556666666',
      '321110000000'),
'D': ('666666655443',
      '000000011123'),
'F': ('66666666666666',
      '00002222244444'),
'H': ('666664444466666',
      '000002222200000'),
'I': ('66666',
      '00000'),
'L': ('666662222222',
      '000000000000'),
'M': ('6665544334455666',
      '0004321001234000'),
'N': ('66665544336666',
      '00003322110000'),
'O': ('3445556666555443',
      '3221110000111223'),
'P': ('666666666555',
      '000003333444'),
'T': ('777776666677777',
      '444440000044444'),
'U': ('6666322236666',
      '4211000001124'),
'V': ('66654322345666',
      '33321000012333'),
'W': ('66542466424566',
      '43210133101234'),
'Y': ('66665433456666',
      '44333000033344'),
'_': ('1111111111',
      '0000000000'),
' ': ('000',
      '000'),
'.': ('12221',
      '10001'),
'~': ('44445544334444',
      '11223322112233'),
'/': ('2234566',
      '0012344'),
'\\': ('6654322',
       '4432100'),
}

s = 'ANCHOVY '
A = '000'.join(chars6[t][0] for t in s)
B = '000'.join(chars6[t][1] for t in s)

t=time()
f=open('/dev/urandom')
def F(n):
 while 1:T=int(time()-t)%len(A);[sleep,[].count,lambda x:f.read(4**9)][(n<int(A[T]))+(n<int(B[T]))](1)
for i in range(7):Process(target=F,args=(i,)).start()
F(7)

34
+1 để cung cấp cho các chữ cái thêm định nghĩa bằng cách sử dụng 2 màu
DustinDavis

4
Và +1 để tạo thư theo bảng
GreenAsJade

1
Trên thực tế, chữ A có thể được hiển thị đúng (có lỗ) với 4 luồng. Mặc dù vậy, sẽ phải đặt một số màu màn hình CPU trùng khớp.
Ruslan

@Ruslan: Bạn đang nghĩ đến màn hình CPU nào? Màn hình của tôi chỉ hiển thị một biểu đồ tổng hợp, với 0 <= system <= user <= 100 tại mỗi điểm (điều này làm cho "lỗ hổng" không thể AFAIK).
nneonneo

1
@nneonneo Ý tôi là màn hình tương tự như của bạn. Xem hình này . Ở đây nếu chúng ta thay đổi màu xanh lam thành màu xanh lá cây và màu đỏ và màu tím thành màu trắng, chúng ta sẽ có một chữ "A" đẹp có lỗ.
Ruslan

133

C (Intel Core Duo + OS X / Darwin), 248 byte

#include <unistd.h>
#include <mach/mach_time.h>
#define M mach_absolute_time()
main(){char*s="JJJIHGFGHIJJJ@BDFHJJJHFDB@JJJJ@JJJJBBBBBBB";uint64_t i,t,y=1;for(;*s;s++){
for(i=40;i;i--){for(t=M+(*s&15)*9090909;t>M;)y*=7;usleep((11-(*s&15))*9091);}}}

Mã này có khả năng di động như Đại kim tự tháp Cheops. Xin lỗi vì điều đó. Các giá trị được trả về mach_absolute_time()phụ thuộc vào phần cứng, nhưng trên máy của tôi, giá trị tăng khoảng một lần mỗi nano giây.

Đây là kết quả:

Từ "MAIL" hiển thị trong biểu đồ lịch sử CPU của tôi

Có hai biểu đồ vì bộ xử lý có hai lõi. Tôi đặt tải CPU tối đa là khoảng 90% vì quá trình này có thể chuyển đổi giữa các lõi bất cứ khi nào tôi gọi usleep(). Với tải 100%, quy trình được kết nối thành một lõi và kết quả là không thể thực hiện được ( xem ví dụ này )


1
Làm tốt lắm! Điều này có vẻ rất thú vị. Bạn có thể vui lòng gửi một chút giải thích về mã? :)
duci9y

1
tôi thấy niềng răng Tại sao có niềng răng trong vòng lặp? bạn có thể đặt giấc ngủ vào khối thứ hai cho vòng lặp cuối cùng. Tôi nghĩ rằng bạn có thể chơi golf dễ dàng hơn một chút.
bebe

Bạn không thể đặt khai báo và khởi tạo các uint64_tbiến vào tiêu đề của forvòng lặp sau phải không?
Joey

74
+1: "Mã này có khả năng di động như Đại kim tự tháp Cheops"
Uwe Keim

@ Không có, các biến C phải được khai báo ở đầu một khối. đặt nó trong khối khởi tạo của for sẽ gây ra lỗi. tất nhiên nó chỉ áp dụng cho <C99
bebe

102

Ruby, 150 ký tự

a=(0..15).map{|i|[0.9-3*i*=0.02,i]}
[9,*a[0,11],*(z=a.reverse)[5,11],11,*z,*a,2,11,6,*[0.2]*9].map{|x,y|c=Time.now
1until Time.now-c>x/3
sleep y||x%3}

Đây không phải là tất cả quá ngắn cho đến nay, nhưng theo tôi thì đầu ra khá đẹp, vì vậy tôi nghĩ rằng dù sao tôi cũng sẽ đăng bài này. Như với hầu hết các giải pháp khác, bạn có thể phải ghim quy trình Ruby vào một lõi nhất định bằng cách thêm tiền tố vào taskset -c $core.

Mã này là một sự kết hợp đơn giản của quay / ngủ trong một khoảng thời gian nhất định, điều này sẽ làm cho nó có phần di động. Độ dốc mịn được tạo ra bằng cách thay đổi tỷ lệ thời gian quay / ngủ.

Màn hình CPU viết MAIL

Giảm tần số lấy mẫu CPU làm cho các cạnh trông tốt hơn một chút:

Tần suất lấy mẫu thấp hơn

Bằng cách thêm một vài chữ cái vào bảng chữ cái ( AILMNUVWcó thể dễ nhận ra), chúng ta cũng có thể viết một số từ khác:

MUM, MAW, VILLAIN

Những hình ảnh này được tạo ra với mã sau đây:

def gradient num_samples, direction, base = 0.3, increment = 0.02, scale = 1
    range = [*0..num_samples]

    samples = case direction
        when :up then range.reverse
        when :down then range
        when :updown then range.reverse + range
        when :downup then range + range.reverse
    end

    samples.map{|i|
        i *= increment
        [base - scale * i, i]
    }
end

# letters are defined as a series of pairs of (spin-time, sleep-time)
# with the time in seconds
THIN_A = gradient(15, :updown, 0.2, 0.2/15)
A = gradient(15, :updown)
I = 2,0
L = 1.5,0, [[0.1,0.2]]*9
M = 2,0, gradient(9, :downup), 2,0
N = 1,0, gradient(9, :down), 2,0
U = 1,0, gradient(9, :downup, 0.1, 0.03, 0.1), 1,0
V = 0.5,0, gradient(12, :downup, 0.25, 0.02), 0.5,0
W = 0.5,0, [gradient(12, :downup, 0.25, 0.02)]*2, 0.5,0

[A,I,L,M,N,U,V,W].map{|i|
    # add 2 second pause after each letter
    i + [0,2]
}.flatten.each_slice(2){|x,y|
    # spin, then sleep
    c = Time.now
    1 until Time.now-c > x
    sleep y
}

Các từ có thể được viết bằng các chữ cái được triển khai có thể được tìm thấy với

grep -E '^[aijlmnuvw]+$' /usr/share/dict/words 

4
+1 cho phần mở rộng thành nhiều từ hơn!
Chris Cirefice

Bạn có thể đã tạo ra từ "nhôm".
Oliver Daugherty-Long

@ OliverDaugherty-Long nhôm *
Thiền lập

1
@ TùxCräftîñg Nhôm là một cách viết chính tả có thêm một chữ cái và là từ dài nhất tôi có thể nghĩ về tác phẩm đó.
Oliver Daugherty-Long

48

Python, trên Intel Pentium 4 3.0Ghz, 180 166 145 141 138 byte

Gọi với taskset -c 0 python cpu_graph_drawer.py.

taskset là cần thiết để hạn chế quá trình chỉ sử dụng một CPU / lõi (siêu phân luồng trong trường hợp của tôi.)

from time import*;c=clock
a=[(3,.8),(3,5),(4,5),(1.3,5),(1.3,0)]
a.extend([(.1,.2)]*10)
for x,y in a:
    t=c()
    while c()-t<x:pass
    sleep(y)

Kết quả không phải là tuyệt vời. Cái này với tasket -c 1


9
Tôi rất muốn thấy điều này với một màn hình CPU không làm mịn các đường cong ...
Szabolcs

1
Tôi cũng vậy, nhưng tôi không cảm thấy muốn viết một biểu đồ sử dụng cpu conky và gnome-system-monitorlà điều duy nhất tôi biết. Có bất kỳ lựa chọn thay thế nào sẽ chạy trên LMDE Cinnamon?
user80551

Kích hoạt "Vẽ CPU dưới dạng biểu đồ vùng xếp chồng" và đặt tất cả các màu thành màu đen.
Tejas Kale

@TejasKale Các đường vẫn sẽ bị cong.
dùng80551

FYI: bạn có thể chơi một loạt các ký tự bằng cách sử dụng a=[...]+[(.1,.2)]*10thay vì .extend.
nneonneo 6/11/2015

46

Java 8, 482 ký tự

Mỗi ký tự trong Chuỗi có nghĩa là số lượng chủ đề, sẽ được sử dụng. Hình ảnh được chụp trên Intel Core i3 (2 lõi / 4 luồng).

kết quả

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Mail{
public static void main(String[] args) throws InterruptedException{
Thread.sleep(15000);
for(char c:"123432234321000012343210000444000044441111111".toCharArray()){
ExecutorService executorService = Executors.newScheduledThreadPool(4);
for(int i=1;i<c-48;i++)executorService.execute(()->{while(!Thread.interrupted());});
Thread.sleep(1500);
executorService.shutdownNow();
}}}

Chỉnh sửa : phiên bản nhiều gôn hơn (322 ký tự), cùng chức năng:

import java.util.concurrent.*;
class M{
public static void main(String[]a)throws Exception{
for(int c:"123432234321000012343210000444000044441111111".toCharArray()){
ExecutorService s=Executors.newFixedThreadPool(4);
while(c>48){c--;s.execute(()->{while(!Thread.interrupted());});}
Thread.sleep(1500);
s.shutdownNow();
}}}

1
Có một dấu hiệu ít hơn ở đó đã được hiểu là HTML và làm rối định dạng.
David Conrad

@ValekHalfHeart hai dòng tiếp theo sẽ giải thích nó. Executor là một luồng (trình quản lý tác vụ không đồng bộ) thực thi (các) tác vụ (ở đây vòng lặp) cho đến khi bị gián đoạn. Sau khi tạo nó, luồng chính chờ trong 1,5 giây và sau đó làm gián đoạn tất cả các tác vụ.
PTwr

45
Chỉ cần mở Eclipse, biểu đồ CPU của tôi đã viết "Giao thức chuyển thư đơn giản".
lolesque

21

C, 78 byte

Bạn không bao giờ nói rằng chúng tôi không thể chấp nhận đầu vào của người dùng, vì vậy ..

#include <unistd.h>
int main(){int x=0;for(;x<1<<26;++x);read(0,&x,1);main();}

Chương trình này đọc từ tiêu chuẩn và mỗi khi đọc một ký tự, nó thực thi một CPU lãng phí cho vòng lặp, sau đó gọi lại chính. Bạn kiểm soát lượng thời gian CPU sử dụng bằng cách spam phím enter ở các tốc độ khác nhau.

Tôi đã chạy nó trên intel i3 4130T, đây là một bộ xử lý hợp lý mới. Nhưng số dặm của bạn có thể thay đổi, nếu nó sử dụng thời gian CPU nhiều hơn hoặc ít hơn thực tế để bạn quan sát, hãy thử chơi với số lượng thay đổi trong vòng lặp trễ.

Chương trình của tôi thật tuyệt vời vì nó:

  • chủ yếu là đa nền tảng, nó sẽ hoạt động với rất ít sự thay đổi trên bất kỳ * nix nào
  • đánh bại câu hỏi
  • chơi kết thúc tuyệt vời

Sau một vài lần thử, tôi đã tạo ra một biểu đồ trông như thế này:Đồ thị CPU


Nó giúp hạn chế nó vào một lõi CPU với tasket, a.la. taskset -c 1 [file]
Wug

2
Tôi không thấy bất cứ điều gì trong các yêu cầu vấn đề nói rằng bài nộp của chúng tôi sẽ được gọi làyes | [program]
Wug


1
"trò chơi kết thúc tuyệt vời" làm cho tôi lol khó khăn. +1
Christoph

1
Câu trả lời này là quá tốt, mặc dù sơ hở là xD!
Bạch tuộc ma thuật Urn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.