CPU로 그리기


289

학생들이 네트워크 트래픽을 사용하여 국가의 IPv6 그래프 에서 대학을 그리는 기사를 보았습니다. [영상]

당신의 목표 는 말하기 쉽지만 구현하기는 어렵습니다. 그리기 는 CPU 그래프 (가 1 차원 그래프에서 읽을 수있는 몇 가지 단어 중 하나이기 때문에) 텍스트 MAIL을.

다음과 같이 보일 것입니다 :

결과

자격 요건에 대해 좀 더 자세히 설명합니다.

  • 코드는 크로스 플랫폼 일 필요가 없으므로 알 수없는 API가 필요하지 않습니다.
  • 가지고있는 일반적인 CPU 사용 유틸리티에서 캡처 할 수 있습니다.
  • 다른 기계에서는 그래프가 약간 나빠 보입니다. 이번에는 믿습니다.
  • 기본 CPU 사용량 %는 연속적이어야하므로 임의 파형을 생성하고 MAIL이라는 단어를 강조 표시하면 부정 행위입니다.
  • 사용할 최대 하중을 선택할 수 있지만 명확하게 볼 수있을만큼 실질적이어야합니다.
  • 예제의 선형성을 따라야합니다. (M의 경우 기본 %, 갑자기 지정된 최대 값으로 증가, 점차적으로 낮은 %로 감소, 최대로 상승한 후 다시 기본 %로 떨어짐과 같이 보입니다.)
  • 읽을 수 없으면 유권자들은 결국 알게 될 것입니다.

표준 허점이 적용됩니다. 이미지도 게시하십시오!


9
더 이상 찬성 투표를 할 이유가 없습니다. 비록 시스템에 따라 조금씩 다르지만 개인적으로는 이것이 재미있는 도전이라고 생각합니다.
seequ

6
코드 골프에서 볼 수있는 문제는 읽기 쉬운 가독성을 판단하는 것입니다. 그것을 객관적으로 지정하는 방법을 생각할 수 있다면 도전을 크게 향상시킬 수 있지만 어쨌든 정말 좋은 생각입니다!
마틴 엔더

3
그것은 실제로 당신의 사진과 동일하지만, 당신이 말로 표현하지 않으면, 사람들은 "메일 발송"을 매우 자유롭게 해석 할 것입니다.
Martin Ender

33
+1, 내가 거의 죽을 정도로 멍청한 짓이다 ... "이것은 광기 ..." "광기 .. 이것은 CODEGOLF입니다 !!!"
vaxquis

5
이것은 매우 멋진 질문입니다. 내가 참여하기에 충분히 똑똑했으면 좋겠다. 그다지 중요하지 않습니다. 다른 사람들의 창의적인 솔루션에 관심이 있습니다 .P
Chris Cirefice

답변:


117

파이썬, 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

문자열의 각 문자는 ASCII 문자 0(최대로드)에서 ~(매우 가벼운로드) 까지 1 초의 활동에 해당합니다 . 이 프로그램은 시간 동기화 루프에서 실행되므로 더 나은 결과를 위해 여러 인스턴스를 실행할 수 있습니다.

Intel Core i7과 함께 OS X에서 Python 2.7.6을 사용했지만 약간의 조정 ()을 조정하여 다른 컴퓨터에서 작동해야합니다 0.001. 아래 스크린 샷은 중요한 백그라운드 활동으로 촬영되었습니다.

우편

업데이트-time()/10 업데이트 빈도가 낮고 더 명확한 그래프를 생성 할 수있었습니다 .

우편

마지막으로 더 골프 버전 ( 123 바이트 )과 결과가 있습니다 .

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

파이썬, 358 281 268 221 194 바이트

흑백은 그래서 작년에. 이것은 여러 프로세스와 syscall을 사용하여 두 가지 컬러 CPU 그래프 를 달성 합니다!

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)

활동 모니터의 출력 (OS X 10.9) :

활동 모니터 CPU로드 그래프 활동 모니터 CPU 히스토리 그래프

CPU 히스토리 그래프에서 반복

MenuMeters의 출력 :

MenuMeters 출력

모든 출력은 1s의 업데이트 속도로 생성되었습니다. 중요한 백그라운드 작업은 실행되지 않았지만이 출력은 단일 스레드 CPU 작업보다 훨씬 뛰어납니다.

이 코드는 8 개의 코어가 있다고 가정합니다. 더 적거나 더 많이 수정하는 것은 매우 쉬워야합니다. 그것은이다 휴대용 (그것은 단지 OS X에서 테스트되었습니다 불구하고) 리눅스 / 유닉스 시스템 및 시스템 CPU 시간에서 사용자를 구별 할 수있는 CPU 모니터 같은 2 색 출력을 생성한다.

기본적으로이 작업은 7 개의 프로세스를 차단하여 작동하며 각 프로세스는 1 초의 절전 모드, 사용자 모드 회전 또는 커널 회전을 선택합니다. 커널 모드에서의 회전은에서 데이터를 대량으로 요청하여 이루어지며 /dev/urandom, 이로 인해 드라이버 백업 /dev/urandom이 많은 "시스템"CPU주기를 소비하게됩니다.

편집 됨 [07/21] : fork()대신 사용하여 크게 단축되었습니다 multiprocessing.Process( /dev/urandom어쨌든 * NIX 시스템에서만 작동하므로 이식성이 감소하지 않습니다). 그러나 이제 프로그램은 백그라운드 작업을 생성 합니다. killall PythonCPU-eater를 제거하기 위해 (또는 유사한) 해야 할 수도 있습니다 .


나는 몇 글자를 더 이행하는 것을 거부 할 수 없었다. 16 개의 문자와 몇 가지 기호가 있습니다.

~ /._ PIN 안호 ... ... VY

완전한 알파벳은 "._ ~ / \"기호가있는 "ACDFHILMNOPTUVWY"입니다. 표현할 수있는 더 많은 문자가있을 수 있습니다.

여분의 문자에 대한 완전히 ungolfed 코드 :

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
2 가지 색상을 사용하여 글자에 더 많은 정의를 부여하기위한 +1
DustinDavis

4
그리고 테이블 중심의 편지 작성을위한 +1
GreenAsJade

1
실제로 A는 4 개의 스레드로 올바르게 구멍이 생길 수 있습니다. 그래도 일부 CPU 모니터 색상을 일치시켜야합니다.
Ruslan

@Ruslan : 어떤 CPU 모니터를 생각하십니까? 내 모니터에는 각 지점에 0 <= 시스템 <= 사용자 <= 100 인 "단일 홀"이 불가능한 집계 그래프가 하나만 표시됩니다 ( "구멍"불가능 AFAIK).
nneonneo

1
@nneonneo 나는 당신과 비슷한 모니터를 의미합니다. 이 사진을 참조하십시오 . 여기서 파란색에서 녹색으로, 빨간색에서 보라색으로 흰색으로 바꾸면 구멍이있는 멋진 "A"가 나타납니다.
Ruslan

133

C (Intel Core Duo + OS X / Darwin), 248 바이트

#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);}}}

이 코드는 Cheops의 대 피라미드만큼 이식성이 뛰어납니다. 미안합니다. 반환 된 값 mach_absolute_time()은 하드웨어에 따라 다르지만 내 컴퓨터에서는 약 1 초마다 값이 증가합니다.

결과는 다음과 같습니다.

CPU 히스토리 그래프에 "MAIL"이라는 단어가 표시됨

프로세서에는 두 개의 코어가 있기 때문에 두 개의 그래프가 있습니다. 호출 할 때마다 프로세스가 코어간에 전환하기 쉽기 때문에 최대 CPU로드를 약 90 %로 설정했습니다 usleep(). 100 %로드를 사용하면 프로세스가 하나의 코어에 연결되고 결과를 읽을 수 없습니다 ( : 참조 )


1
잘 했어! 이것은 매우 흥미로운 것 같습니다. 코드에 대한 간단한 설명을 게시 해 주시겠습니까? :)
duci9y

1
나는 중괄호를 참조하십시오. for 루프에 왜 중괄호가 있습니까? 두 번째 for 루프의 마지막 블록에 usleep을 넣을 수 있습니다. 좀 더 쉽게 골프를 칠 수 있다고 생각합니다.
bebe

uint64_t변수 의 선언과 초기화를 다음 for루프 의 헤더에 넣을 수 없습니까?
Joey

74
하나는 "이 코드의 Cheops의 피라미드만큼이나 휴대용"
우베 KEIM

@ Јοеу 아니오, 블록 시작 부분에 C 변수를 선언해야합니다. for의 초기화 블록에 넣으면 오류가 발생합니다. 물론 그것은 단지 <C99 적용
비비

102

루비, 150 자

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}

이것은 지금까지 그렇게 짧지는 않지만 내 의견으로는 출력이 다소 좋기 때문에 어쨌든 게시 할 것이라고 생각했습니다. 대부분의 다른 솔루션과 마찬가지로 Ruby 프로세스를 접두사로 특정 코어에 고정해야 할 수도 있습니다 taskset -c $core.

코드는 특정 시간에 대한 자 / 회전의 간단한 조합 한다 그것은 다소 휴대용 만든다. 회전 / 수면 시간의 비율을 변경하여 부드러운 그라데이션을 만듭니다.

MAIL 쓰기 CPU 모니터

CPU 샘플링 주파수를 낮추면 가장자리가 조금 더 좋아 보입니다.

낮은 샘플링 주파수

알파벳에 글자를 몇 개 더 추가하면 ( AILMNUVW약간 알아볼 수 있음) 다른 단어도 쓸 수 있습니다.

엄마, MAW, VILLAIN

이 그림은 다음 코드로 생성되었습니다.

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
}

구현 된 글자로 쓸 수있는 단어는

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

4
더 많은 단어로의 확장을 위해 +1!
Chris Cirefice

"알루미늄"이라는 단어를 만들었을 수도 있습니다.
Oliver Daugherty-Long

@ OliverDaugherty-Long aluminum *
TuxCrafting

1
@ TùxCräftîñg Aluminum은 여분의 문자가 포함 된 변형 철자이며, 제가 생각할 수있는 가장 긴 단어입니다.
Oliver Daugherty-Long

48

인텔 펜티엄 4 3.0GHz의 파이썬, 180 166 145 141 138 바이트

로 전화하십시오 taskset -c 0 python cpu_graph_drawer.py.

taskset 프로세스가 하나의 CPU / 코어 만 사용하도록 제한해야합니다 (필자의 경우 하이퍼 스레딩).

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)

결과가 그렇게 좋지 않습니다. taskset이있는 -c 1


9
커브를 부드럽게하지 않는 CPU 모니터로 이것을보고 싶습니다 ...
Szabolcs

1
나도,하지만 conky cpu-usage 그래프를 작성하고 싶지 않으며 gnome-system-monitor내가 아는 유일한 것입니다. LMDE Cinnamon에서 실행할 대안이 있습니까?
user80551

"스택 영역 차트로 CPU 그리기"를 활성화하고 모든 색상을 검은 색으로 설정하십시오.
Tejas Kale

@TejasKale 선은 여전히 ​​곡선입니다.
user80551

참고 : a=[...]+[(.1,.2)]*10대신을 사용하여 많은 문자를 골프화 할 수 있습니다 .extend.
nneonneo

46

자바 8,482 자

문자열의 모든 문자는 사용될 스레드 수를 의미합니다. 인텔 코어 i3 (2 코어 / 4 스레드)에서 찍은 이미지.

결과

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();
}}}

편집 : 더 골프 버전 (322 자), 동일한 기능 :

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
HTML로 해석되어 서식을 엉망으로 만드는 부호보다 적습니다.
David Conrad

@ValekHalfHeart 다음 두 줄은 그것을 설명해야합니다. 실행기는 중단 될 때까지 작업을 실행 하는 스레드 (비동기 작업 관리자) 입니다. 그것을 만든 후 메인 스레드는 1.5 초 동안 기다린 다음 모든 작업을 중단합니다.
PTwr

45
Eclipse를 열면 CPU 그래프에 "Simple Mail Transfer Protocol"이 작성되었습니다.
lolesque

21

C, 78 바이트

사용자 입력을받을 수 없다고 말한 적이 없습니다.

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

이 프로그램은 표준 입력을 읽고 문자를 읽을 때마다 루프에 대해 불필요한 CPU 낭비를 실행 한 다음 main을 다시 호출합니다. Enter 키를 다른 속도로 스팸 처리하여 사용하는 CPU 시간을 제어합니다.

나는 Intel i3 4130T에서 이것을 실행했는데, 이것은 상당히 새로운 프로세서입니다. 그러나 실제 주행 거리보다 많거나 적은 CPU 시간을 사용하는 경우 마일리지가 다를 수 있습니다.

내 프로그램은 굉장합니다.

  • 대부분 크로스 플랫폼이며, * nix에 대해 약간의 조정만으로 작동해야합니다.
  • 질문을 물리 치다
  • 훌륭한 게임 플레이

몇 번의 시도 후에 다음과 같은 그래프가 생성되었습니다.CPU 그래프


작업 세트가있는 하나의 CPU 코어로 제한하는 데 도움이됩니다. taskset -c 1 [file]
Wug

2
문제 요구 사항에서 제출 내용이 다음과 같이 호출 될 것이라는 내용은 없습니다.yes | [program]
Wug


1
"큰 엔드 게임 플레이"가 나를 힘들게 만들었습니다. +1
Christoph

1
이 답변은 너무 좋습니다. 허점은 xD를 저주합니다!
Magic Octopus Urn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.