วาดด้วยซีพียูของคุณ


289

ฉันเจอบทความที่นักเรียนใช้การจราจรบนเครือข่ายเพื่อวาดมหาวิทยาลัยของพวกเขาบนกราฟIPv6ของประเทศ [ภาพ]

เป้าหมายของคุณนั้นง่ายที่จะบอก แต่ยากที่จะนำไปใช้ วาดข้อความ MAIL (เนื่องจากเป็นหนึ่งในไม่กี่คำที่สามารถอ่านได้บนกราฟ 1D) บนกราฟ CPU

ควรมีลักษณะดังนี้:

ผลลัพธ์

อธิบายเพิ่มเติมเกี่ยวกับคุณสมบัติที่เหมาะสม:

  • รหัสไม่จำเป็นต้องเป็นข้ามแพลตฟอร์ม (ดังนั้นคุณไม่จำเป็นต้องใช้ API ที่ไม่รู้จักเพื่อจัดการกับ)
  • คุณสามารถจับมันในยูทิลิตี้การใช้งาน CPU ทั่วไปที่คุณมี
  • กราฟดูแย่ลงในเครื่องอื่น: ฉันเชื่อคุณในครั้งนี้
  • การใช้งาน CPU พื้นฐาน% จะต้องต่อเนื่องดังนั้นหากคุณสร้างคลื่นแบบสุ่มและเน้นสิ่งที่ดูเหมือนคำว่า MAIL จะเป็นการโกงอย่างเห็นได้ชัด
  • คุณอาจเลือกโหลดสูงสุดที่จะใช้ แต่จะต้องมีมากพอที่จะเห็นได้ชัดเจน
  • คุณต้องทำตามความเป็นเส้นตรงของตัวอย่าง (สำหรับ M ดูเหมือนว่านี้: ฐาน% จากนั้นเพิ่มสูงสุดถึงสูงสุดที่ระบุแล้วค่อยๆลดลงเป็น% ที่ต่ำกว่ากลับไปที่สูงสุดและลดลงทันทีถึงฐาน% อีกครั้ง)
  • หากอ่านไม่ได้ผู้ลงคะแนนจะสังเกตเห็นหลังจากทั้งหมด

ช่องโหว่มาตรฐานใช้ โพสต์ภาพด้วย!


9
ฉันไม่เห็นเหตุผลของการลงคะแนนอย่างใกล้ชิดอีกต่อไป โดยส่วนตัวแล้วฉันพบว่านี่เป็นความท้าทายที่สนุกแม้ว่าจะเป็นระบบที่เฉพาะเจาะจง
Seequ

6
ปัญหาที่ฉันเห็นด้วยรหัสกอล์ฟคือการตัดสินว่าอ่านได้ชัดเจนเพียงพอหรือไม่ หากคุณนึกถึงวิธีที่จะระบุสิ่งนั้นอย่างเป็นกลางสิ่งนั้นจะช่วยเพิ่มความท้าทายอย่างมาก แต่ก็เป็นความคิดที่ดีจริงๆ!
Martin Ender

3
มันเหมือนกับภาพของคุณ แต่ฉันรับประกันคุณว่าถ้าคุณไม่ใส่ไว้ในคำพูดคนจะตีความ "ดึงจดหมาย" อย่างเสรี
Martin Ender

33
+1 มันช่างไร้สาระจนฉันเกือบจะหัวเราะตัวเองจนตาย ... "นี่มันบ้าแน่ ๆ... " "บ้าแล้ว .. นี่คือCODEGOLF !!!"
vaxquis

5
นี่คือ friggin น่ากลัวคำถาม ฉันหวังว่าฉันฉลาดพอที่จะเข้าร่วม ไม่สำคัญว่าฉันสนใจในโซลูชันที่สร้างสรรค์โดยคนอื่น: P
Chris Cirefice

คำตอบ:


117

Python, 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(โหลดสูงสุด) ถึง~(โหลดเบามาก) โปรแกรมทำงานบนลูปแบบซิงโครไนซ์เวลาดังนั้นคุณสามารถเรียกใช้หลายอินสแตนซ์เพื่อผลลัพธ์ที่ดีกว่า

ฉันใช้ Python 2.7.6 บน OS X กับ Intel Core i7 แต่ควรทำงานกับคอมพิวเตอร์เครื่องอื่น ๆ ด้วยการปรับแต่งเล็กน้อย (ปรับ0.001) ภาพหน้าจอด้านล่างนี้ถ่ายด้วยกิจกรรมพื้นหลังที่สำคัญ

MAIL

อัปเดต -ฉันสามารถสร้างกราฟที่ชัดเจนยิ่งขึ้นด้วยtime()/10และอัปเดตความถี่ที่ต่ำกว่า:

MAIL

และสุดท้ายนี่คือเวอร์ชั่น golfed ( 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

Python, 358 281 268 221 194 ไบต์

ขาวดำเป็นดังนั้นปีที่ผ่านมา สิ่งนี้ใช้กระบวนการหลายอย่างและ syscalls เพื่อให้ได้กราฟ 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:

มีเมนูเอาท์พุท

เอาต์พุตทั้งหมดถูกสร้างขึ้นด้วยความเร็วการอัพเดท 1 วินาที ไม่มีงานพื้นหลังที่สำคัญกำลังทำงานอยู่แม้ว่าเอาต์พุตนี้จะเอาชนะงาน CPU ใด ๆ เธรดเดียวได้ค่อนข้างง่าย

รหัสนี้จะถือว่าคุณมี 8 คอร์ มันควรจะง่ายต่อการแก้ไขน้อย / มาก เป็นแบบพกพาไปยังระบบ Linux / UNIX (แม้ว่าจะได้รับการทดสอบบน OS X เท่านั้น) และควรสร้างเอาต์พุตสองสีที่เหมือนกันสำหรับจอภาพ CPU ใด ๆ ที่สามารถแยกผู้ใช้ออกจากเวลา CPU ของระบบ

โดยพื้นฐานแล้วสิ่งนี้ทำงานโดยการหยุดกระบวนการเจ็ดกระบวนการซึ่งแต่ละกระบวนการเลือกที่จะใช้เวลา 1 วินาทีในการนอนการหมุนในโหมด usermode หรือการปั่นเคอร์เนล การหมุนในโหมดเคอร์เนลทำได้โดยการขอข้อมูลจำนวน/dev/urandomมากซึ่งบังคับให้ผู้ขับขี่สำรอง/dev/urandomใช้รอบ CPU "ระบบ" เป็นจำนวนมาก

แก้ไข [07/21]: ย่อลงอย่างมากโดยใช้fork()แทนmultiprocessing.Process( /dev/urandomใช้ได้กับระบบ * NIX เท่านั้นดังนั้นจึงไม่ลดความสามารถในการพกพา) อย่างไรก็ตามโปรดทราบว่าขณะนี้โปรแกรมวางไข่ภารกิจพื้นหลัง คุณอาจต้องkillall Python(หรือคล้ายกัน) เพื่อกำจัด CPU-eaters


ฉันไม่สามารถต้านทานการใช้ตัวอักษรอีกสองสามตัว ฉันได้รับ 16 ตัวอักษรรวมทั้งสัญลักษณ์บางอย่าง:

~ /._ PIN ancho ... ... 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
+1 เพื่อให้ตัวอักษรมีความหมายมากขึ้นโดยใช้ 2 สี
DustinDavis

4
และ +1 สำหรับการสร้างตัวอักษรที่ขับเคลื่อนด้วยตาราง
GreenAsJade

1
อันที่จริง A สามารถแสดงผลได้อย่างถูกต้อง (มีรู) ที่มี 4 เธรด คงต้องตั้งค่าจอมอนิเตอร์ CPU บางสีให้เหมือนกัน
Ruslan

@Ruslan: คุณกำลังคิดถึง CPU monitor อะไร? จอภาพของฉันแสดงกราฟรวมเพียงกราฟเดียวโดยมี 0 <= ระบบ <= ผู้ใช้ <= 100 ในแต่ละจุด (ซึ่งทำให้ "หลุม" เป็นไปไม่ได้ AFAIK)
nneonneo

1
@nneonneo ฉันหมายถึงจอภาพที่คล้ายกับของคุณ ดูรูปนี้ ที่นี่ถ้าเราเปลี่ยนสีน้ำเงินเป็นสีเขียวและสีแดงและสีม่วงเป็นสีขาวเราจะได้ช่อง "A" ที่ดี
Ruslan

133

C (Intel Core Duo + OS X / ดาร์วิน), 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()นั้นขึ้นอยู่กับฮาร์ดแวร์ แต่ในเครื่องของฉันค่าที่เพิ่มขึ้นประมาณหนึ่งครั้งต่อนาโนวินาที

นี่คือผลลัพธ์:

คำว่า "MAIL" แสดงในกราฟประวัติ CPU ของฉัน

มีกราฟสองกราฟเนื่องจากตัวประมวลผลมีสองคอร์ ผมตั้งโหลด CPU สูงสุดที่ประมาณ 90% usleep()เนื่องจากกระบวนการมีแนวโน้มที่จะสลับไปมาระหว่างแกนเมื่อใดก็ตามที่ผมเรียกว่า ด้วยการโหลด 100% กระบวนการจะถูกผูกมัดกับคอร์หนึ่งแกนและผลลัพธ์นั้นอ่านไม่ออก ( ดูตัวอย่างนี้ )


1
เยี่ยมมาก! มันดูน่าสนใจมาก คุณช่วยโพสต์คำอธิบายเล็กน้อยของรหัสได้ไหม :)
duci9y

1
ฉันเห็นวงเล็บปีกกา ทำไมมีเครื่องหมายวงเล็บในห่วงสำหรับ? คุณสามารถใส่ usleep เป็นวินาทีสำหรับบล็อกสุดท้ายของลูป ฉันคิดว่าคุณสามารถลงเล่นกอล์ฟได้ง่ายขึ้นอีกเล็กน้อย
bebe

คุณไม่สามารถใส่การประกาศและการเริ่มต้นของuint64_tตัวแปรลงในส่วนหัวของforลูปต่อไปนี้ได้หรือไม่?
Joey

74
+1: "รหัสนี้เกี่ยวกับการพกพามากเท่าพีระมิดแห่ง Cheops"
Uwe Keim

@ ไม่เลยต้องประกาศตัวแปร C ที่จุดเริ่มต้นของบล็อก วางไว้ในบล็อก initializtion ของสำหรับจะโยนข้อผิดพลาด แน่นอนใช้กับ <C99
bebe

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}

นี่ไม่ใช่ทั้งหมดที่สั้น แต่ในความคิดของฉันผลลัพธ์ค่อนข้างดีดังนั้นฉันคิดว่าฉันโพสต์นี้ต่อไป เช่นเดียวกับการแก้ปัญหาอื่น ๆ ส่วนใหญ่คุณอาจจะมีการปักกระบวนการรูบีแกนบางอย่างโดย prefixing taskset -c $coreด้วย

รหัสคือการรวมกันอย่างง่าย ๆ ของการปั่น / นอนในระยะเวลาหนึ่งซึ่งควรทำให้มันค่อนข้างพกพา การไล่ระดับสีที่ราบรื่นนั้นถูกสร้างขึ้นโดยเปลี่ยนแปลงอัตราส่วนของเวลาการปั่นหมาด / การนอนหลับ

มอนิเตอร์ CPU ที่เขียนด้วย MAIL

การลดความถี่ในการสุ่มตัวอย่าง CPU ทำให้ขอบดูดีขึ้นเล็กน้อย:

ความถี่การสุ่มตัวอย่างต่ำ

โดยการเพิ่มตัวอักษรอีกสองสามตัวลงในตัวอักษร ( AILMNUVWค่อนข้างเป็นที่รู้จัก) เราสามารถเขียนคำอื่น ๆ :

MUM, 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 Aluminium เป็นตัวสะกดที่มีตัวอักษรพิเศษและเป็นคำที่ยาวที่สุดที่ฉันสามารถนึกได้
Oliver Daugherty-Long

48

Python สำหรับ Intel Pentium 4 3.0Ghz, 180 166 145 141 138 ไบต์

taskset -c 0 python cpu_graph_drawer.pyโทรหา

taskset จำเป็นเพื่อ จำกัด กระบวนการให้ใช้ CPU / core เพียงอันเดียว (การทำไฮเปอร์เธรดในกรณีของฉัน)

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)

ผลลัพธ์ไม่ค่อยดีนัก อันนี้มี tasket -c 1


9
ฉันชอบที่จะเห็นสิ่งนี้กับจอมอนิเตอร์ CPU ที่ไม่ทำให้เส้นโค้งเรียบ ...
Szabolcs

1
ฉันด้วย แต่ฉันก็ไม่รู้สึกอยากเขียนกราฟการใช้ cpu ที่แสนสะดวกและgnome-system-monitorเป็นสิ่งเดียวที่ฉันรู้ มีทางเลือกใดบ้างที่จะทำงานบน LMDE Cinnamon?
user80551

เปิดใช้งาน "วาด CPU เป็นแผนภูมิพื้นที่แบบเรียงซ้อน" และตั้งค่าสีทั้งหมดเป็นสีดำ
Tejas Kale

@TejasKale เส้นจะยังคงเป็นเส้นโค้ง
user80551

FYI: คุณสามารถกอล์ฟพวงของตัวอักษรออกมาโดยใช้แทนa=[...]+[(.1,.2)]*10 .extend
nneonneo

46

Java 8, 482 ตัวอักษร

อักขระทุกตัวใน String หมายถึงจำนวนเธรดที่จะใช้ ภาพที่ถ่ายใน Intel Core 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();
}}}

แก้ไข : รุ่น golfed เพิ่มเติม (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 สองบรรทัดถัดไปควรอธิบาย Executor เป็นเธรด (ตัวจัดการงานอะซิงโครนัส)ดำเนินการงาน (นี่ลูป) จนกว่าจะเกิดการขัดจังหวะ หลังจากสร้างมันเธรดหลักจะรอเป็นเวลา 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 ที่ใช้โดยการสแปมคีย์ Enter ด้วยความเร็วที่แตกต่างกัน

ฉันใช้ตัวนี้กับ intel i3 4130T ซึ่งเป็นโปรเซสเซอร์ใหม่ที่สมเหตุสมผล แต่ระยะทางของคุณอาจแตกต่างกันไปหากคุณใช้เวลา CPU มากหรือน้อยกว่าที่เป็นไปได้ในการสังเกตลองเล่นกับจำนวนกะในวงหน่วงเวลา

โปรแกรมของฉันยอดเยี่ยมเพราะ:

  • ส่วนใหญ่จะเป็นแพลตฟอร์มข้ามมันควรจะทำงานกับเล่นซอน้อย ๆ บน * ระวังใด ๆ
  • เอาชนะคำถาม
  • การเล่นเกมที่ยอดเยี่ยม

หลังจากพยายามสองสามครั้งฉันก็สร้างกราฟที่มีลักษณะดังนี้:กราฟซีพียู


ช่วยในการ จำกัด ให้ซีพียูหนึ่งคอร์ที่มีชุดงาน a.la taskset -c 1 [file]
2557

2
ฉันไม่เห็นสิ่งใดในข้อกำหนดของปัญหาที่ระบุว่าการส่งผลงานของเราจะถูกเรียกเป็นyes | [program]
Wug

12
หนีมาตรฐาน ... ยังตกอยู่ภายใต้meta.codegolf.stackexchange.com/a/1085/6699
nneonneo

1
"การเล่นเกมที่ยอดเยี่ยม" ทำให้ฉันลำบากมาก +1
Christoph

1
คำตอบนี้ดีเกินไปแม้ว่าช่องโหว่จะถูกสาป xD!
Magic Octopus Urn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.