สร้างโปรแกรม Paint!


51

บทนำ

อยู่มาวันหนึ่งคุณได้แสดงให้เด็กเห็นวิธีการวาดบนคอมพิวเตอร์ คุณพิมพ์mspaint.exeในแถบทำงาน สำหรับความสยองขวัญของคุณมีข้อความระบุว่า "ไม่มีรายการที่ตรงกับการค้นหาของคุณ" คุณต้องสร้างสีแบบง่าย ๆ เพื่อให้เด็กของคุณวาดได้!

ท้าทาย

คุณต้องสร้างโปรแกรมวาดรูปอย่างง่าย หากต้องการทำสิ่งนี้ให้เปิดหน้าต่างแสดงผลสีขาว (ใหญ่กว่า 99x99 พิกเซล) เมื่อใดก็ตามที่กดเมาส์ให้เปลี่ยนพิกเซลที่เมาส์ใช้เป็นสีดำ

นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ!


8
ต้องเป็นพิกเซลหรือไม่ หรือมันอาจจะเป็น 99x99 กำลังสอง?
fəˈnɛtɪk

2
ต้องใช้เวลานานเท่าไหร่?
Rɪᴋᴇʀ

2
เมื่อ TI-Basic Penทำสิ่งนี้อย่างแน่นอน: o
Timtech

1
@Riker มันควรทำงานเป็นเวลาอย่างน้อย 10 วินาทีโดยเฉพาะอย่างยิ่งตลอดไป
pydude

1
มีขนาดใหญ่กว่า 99x99 ดังนั้นเราต้องใช้ตัวเลขสามหลักในรูปทศนิยมในแต่ละมิติ? 99 × 100 หรือ 100 × 99 จะถูกต้องหรือไม่
เซบาสเตียนไซมอน

คำตอบ:


87

รหัสเครื่อง 8086, 32 31 28 26 ไบต์

00000000  b8 0f 00 cd 10 b8 02 10  ba 18 01 cd 10 b8 03 00  |................|
00000010  cd 33 4b b8 01 0c eb f3  3f 00                    |.3K.....?.|
0000001a

ถือว่ามีการ์ดกราฟิก VGA และไดรเวอร์เมาส์ที่เข้ากันได้กับ Microsoft

-2 ไบต์ต้องขอบคุณ @berendi!

ภาพหน้าจอ

มันทำงานอย่างไร:

            |   org 0x100
            |   use16
b8 0f 00    |       mov ax, 0x000f      ; set screen mode: 640x350 monochrome
cd 10       |       int 0x10            ; call video bios
b8 02 10    |       mov ax, 0x1002      ; set palette
ba 18 01    |       mov dx, palette     ; pointer to palette data
cd 10       |   @@: int 0x10            ; call video bios
b8 03 00    |       mov ax, 0x0003      ; get mouse position in (CX, DX) and button status in BL
cd 33       |       int 0x33            ; call mouse driver
4b          |       dec bx              ; if no buttons pressed, --BX = 0xFFFF (invalid page)
b8 01 0c    |       mov ax, 0x0c01      ; plot pixel with color AL at (CX, DX) in page BH
eb f3       |       jmp @b              ; repeat
3f 00       |   palette db 0x3f, 0x00   ; palette in 2:2:2 rgb. color 0 = white, 1 = black.
            |                           ; this should be a 17-byte struct, but we only care about the first two colors here

นั่นคือทั้งหมดที่มีให้มัน ไม่เกี่ยวข้องกับเวทมนต์เพียงใช้ฟังก์ชั่นการโทรไม่กี่ครั้ง


1
ทำความสะอาดรหัสที่ชัดเจนและฉลาด ทำได้ดีมาก! ฉันไม่เห็นว่าจะสามารถปรับขนาดให้เหมาะกับขนาดใดเพิ่มเติม ด้วยเหตุผลบางอย่างเมื่อฉันลองใช้ไดรเวอร์ CuteMouse สิ่งนี้จะดึงโดยไม่ต้องกดปุ่มเมาส์ค้างไว้ แต่นั่นอาจเป็นปัญหากับ CuteMouse ที่ไม่รองรับ Microsoft ได้ 100% คุณใช้ไดรเวอร์รุ่นใดในการทดสอบ
โคดี้เกรย์

2
อืมมม หลังจากเรียกใช้รหัสด้วยดีบักเกอร์ (ดีบั๊กเก่า DEBUG.COM แน่นอน!) ปรากฏว่าไม่มีปัญหากับไดรเวอร์ CuteMouse หากไม่มีการกดปุ่มค้างไว้INT 33hจะส่งคืน 0 ในBXและสิ่งนี้จะลดลงถึง FFFFh ตามที่คาดไว้ แต่ยังคงมีการวาดเส้น อาจเป็นเพราะโหมด 11h มีหน้าวิดีโอเพียงหน้าเดียวและหมายเลขหน้าไม่ถูกต้องจะได้รับการแก้ไขโดยอัตโนมัติหรือไม่ ฉันกำลังทดสอบกับ VM VirtualBox ดังนั้นอาจเป็นสิ่งที่การใช้งานไบออสกำลังทำอยู่
โคดี้เกรย์

2
ดูเหมือนว่า VirtualBox จะกล่าวโทษที่นี่เพียงแค่ละเว้นหมายเลขหน้าทั้งหมด: virtualbox.org/browser/vbox/trunk/src/VBox/Devices/Graphics/ …
5434231

2
บิลแอตกินสันเองก็ภูมิใจในสิ่งนี้ การทำงานที่ยอดเยี่ยม
Wossname

4
-2 ไบต์ลบสุดท้ายint 0x10, jmpกลับไปที่สองint 0x10แทน ออฟเซ็ตjmpยังคงเหมือนเดิมปรับที่อยู่ในmov dx
เบเรนดิ - ประท้วง

25

เริ่มต้น 10 ขีดข่วนไบต์

รอยขีดข่วนได้รับการออกแบบในทางปฏิบัติสำหรับสิ่งเช่นนี้

ลองออนไลน์!


สิ่งนี้ทำพิกเซลได้จริงหรือ นอกจากนี้หากคุณคลิกเมาส์เร็วและกดค้างไว้สักครู่มันก็ให้ผลลัพธ์ที่แตกต่างกัน (โดยไม่ต้องขยับแน่นอน) ฉันคิดว่านี่เป็นโมฆะ
Rɪᴋᴇʀ

19
นี่ไม่ใช่รอยขีดข่วน 10 ไบต์ตามคะแนนที่เราใช้ในปัจจุบัน
Okx

2
คุณควรใช้แอพ scratchblocks เพื่อแปลงเป็นข้อความหรือขนาดไฟล์ SB2
Matthew Roh

2
ฉันใช้คะแนนที่ฉันใช้กับคำตอบ Scratch ก่อนหน้า ใครช่วยได้โปรดเชื่อมโยงฉันกับคะแนนปัจจุบันได้ไหม @Okx
dkudriavtsev

8
@Mendeleev ฉันไม่แน่ใจ แต่เขาอาจหมายถึงระบบการให้คะแนนเริ่มต้นนี้
FreeAsInBeer

20

HTML + JavaScript (ES6), 66 64 62 ไบต์

HTML

<canvas id=c>

JavaScript

onclick=e=>c.getContext`2d`.fillRect(e.x,e.y,1,1)

บันทึก 2 ไบต์ขอบคุณ Gustavo Rodrigues และ 2 ไบต์จาก Shaggy

onclick=e=>c.getContext`2d`.fillRect(e.x,e.y,1,1)
/* This css isn't needed for the program to work. */
*{margin: 0}
#c{border:1px solid black}
<canvas id=c>


แล้วไง<canvas id=c>ล่ะ
Gustavo Rodrigues

2
นี่ทำให้จุดไม่ใช่ตำแหน่งที่เคอร์เซอร์ของฉันไป แต่อยู่ที่ด้านล่างขวาของลูกศร มันตั้งใจหรือไม่
Anoplexian

บันทึก 2 ไบต์โดยปล่อยc.จากจุดเริ่มต้นของ JS ของคุณ @Anoplexian นั่นเป็นเนื้อหาเริ่มต้นที่ใช้ในmarginการขว้างสิ่งเล็ก ๆ น้อย ๆ ออก
Shaggy

4
ฉันจะทำให้งานนี้ได้อย่างไร ฉันกำลังคลิกในพื้นที่ผลลัพธ์และมันไม่ได้ทำอะไรเลย
numbermaniac

1
@Anoplexian นั่นเป็นปัญหาที่ทราบกันดีอยู่แล้ว ไม่มีวิธีที่เชื่อถือได้ในการรับตำแหน่งสัมพัทธ์ของเคอร์เซอร์ของเมาส์บนองค์ประกอบ (ขาดฟังก์ชั่นขนาดใหญ่เฉพาะเบราว์เซอร์ที่ล้มเหลวเมื่อมีการแนะนำการเสริม CSS แบบใหม่)
wizzwizz4

17

C + Win32, 209 200 195 ไบต์

ขอบคุณโคดี้และเควนติน! ฉันหวังว่าจะกำจัด#include <windows.h>แต่สิ่งนี้นำไปสู่ข้อผิดพลาดทุกประเภท อย่างน้อยก็ทำงานได้ถูกต้องกับจอภาพหลายจอ ...

#include<windows.h> 
struct{int h,m,w,x:16,y:16;}m;h;main(){for(h=CreateWindow("EDIT","",1<<28,0,0,199,199,0,0,0,0);GetMessage(&m,h,0,0);m.m^513?DispatchMessage(&m):SetPixel(GetDC(h),m.x,m.y,0));}

รหัสก่อนหน้า:

#include<windows.h> 
main(){MSG m;HWND h;for(h=CreateWindow("EDIT","",1<<28,0,0,199,199,0,0,0,0);GetMessage(&m,h,0,0);m.message^513?DispatchMessage(&m):SetPixel(GetDC(h),LOWORD(m.lParam),HIWORD(m.lParam),0));}

ป้อนคำอธิบายรูปภาพที่นี่


2
ฉันไม่สามารถทดสอบตอนนี้ bu ฉันคิดว่าคุณสามารถผสานประกาศของhลงไปในforการเริ่มต้นที่จะบันทึกไบต์ที่สอง :)
เควนติน

ผมทราบดีว่านี่คือกอล์ฟรหัสและมันอาจจะเป็นที่พึงปรารถนาที่นี่ แต่LOWORDและHIWORDมีไม่ได้LPARAMวิธีที่ถูกต้องในการสกัดเคอร์เซอร์พิกัดจากบรรจุ คุณควรจะใช้GET_X_LPARAMและGET_Y_LPARAMไม่เช่นนั้นคุณจะได้รับผลที่ผิดพลาดจากจอภาพหลายจอ
โคดี้เกรย์

@Quentin ที่จะทำงานใน c ++ แต่ไม่ใช่ใน c ฉันสามารถใช้ c ++ ได้ แต่ฉันจะเขียนint mainซึ่งจะเพิ่ม 4 ไบต์ขึ้นอีก
Johan du Toit

@Cody ความคิดเห็นที่ยุติธรรม ฉันไม่มีระบบมอนิเตอร์หลายจอ แต่คุณคิดว่าใช้(short)LOWORD()และ(short)HIWORD()จะแก้ปัญหาหรือไม่
Johan du Toit

สิ่งที่เค็นตินแนะนำทำงานได้ดีใน C รุ่นที่ทันสมัยรวมถึง C99 แน่นอนว่าคุณกำลังใช้คอมไพเลอร์ C ของ Microsoft ซึ่งติดอยู่ใน C89 / 90 โดยมีกฎการกำหนดขอบเขตตัวแปรที่มีการแบ่งแยก C89 เป็นเหตุผลที่คุณจะได้รับอนุญาตให้ละเว้นmainประเภทกลับของฟังก์ชัน (เพราะ implicit- intกฎ) ปัญหาเท่านั้นคือการละเว้นreturn 0;สาเหตุการทำงานที่ไม่ได้กำหนดไว้ใน C89 และ MSVC ใน C99 และ C ++ คุณต้องมีประเภทผลตอบแทนmainแต่return 0;เป็นนัยและไม่จำเป็น ภาษาไม่ได้ถูกสร้างขึ้นเพื่อการตีกอล์ฟ :-)
Cody Gray

10

กำลังประมวลผล98 79 ไบต์

บันทึกแล้ว 19 ไบต์ด้วย @dzaima

void setup(){background(-1);}void draw(){if(mousePressed)point(mouseX,mouseY);}

คำอธิบาย (ล้าสมัย)

void setup() {
  size(100,100);            // size of the sketch
  background(-1);           // set the background to white
                            // 1 byte shorter than background(255);
}

void draw(){}               // required for mousePressed to work

void mousePressed() {       // function that is called whenever the mouse is pressed
  point(mouseX, mouseY);    // draw a point at the mouse's coordinates
                            // the colour is set to black as default
}

clicketty คลิก


@dzaima ฉันไม่ทราบว่าsize(100,100);ไม่ต้องพูดถึงขอบคุณ (เช่นกันฉันไม่รู้ว่าทำไมฉันจึงไม่เห็นif(mousePressed)บิต)
Kritixi Lithos

7

JavaScript ES6, 126 ไบต์

ทดสอบในโครเมี่ยม

onclick=e=>document.body.outerHTML+=`<a style=position:fixed;top:${e.y}px;left:${e.x}px;width:1px;height:1px;background:#000>`

ลองออนไลน์!

onclick=e=>document.body.outerHTML+=`<a style=position:fixed;top:${e.y}px;left:${e.x}px;width:1px;height:1px;background:#000>`


7

Haskell, 189 184 170 169 ไบต์

import Graphics.Gloss.Interface.Pure.Game
main=play FullScreen white 9[]Pictures(#)(\_->id)
EventKey(MouseButton LeftButton)Down _(x,y)#l=Translate x y(Circle 1):l
_#l=l

สิ่งนี้ใช้Glossไลบรารี (v1.11) มันเปิดหน้าต่างเต็มหน้าจอและวาดพิกเซลสีดำ (ในความเป็นจริงวงกลมที่มีรัศมี 1) โดยการกดปุ่มซ้ายของเมาส์ กดESCเพื่อออก

มันทำงานอย่างไร:

play                 -- handles the whole event handling, screen update, etc. process
    FullScreen       -- use a full screen window
    white            -- use a white background
    9                -- 9 simulation steps per second (see simulation handler below)
    []               -- the initial world state, an emtpy list of circles
    Pictures         -- a function to turn the world state into a picture.
                     -- The world state is a list of translated circles and
                     -- "Pictures" turns this list into a single picture
    (#)              -- event handler, see below
    (\_->id)         -- simulation step handler. Ignore time tick and return the
                     -- world state unchanged. More readable: "\tick world -> world"

EventKey ... # l=... -- if the left mouse button is pressed, add a circle with
                     -- radius 1 translated to the current position of the mouse
                     -- to the world state
_#l=l                -- on all other events do nothing

แก้ไข: @cece หัน counterclock ซึ่งบอกฉันเกี่ยวกับรุ่นใหม่ของความเงาซึ่งประหยัด 5 ไบต์เมื่อใช้หน้าต่างแบบเต็มหน้าจอ ขอบคุณ!


FullScreenเป็นโมฆะในเงา> = 1.11 ลดคะแนน 5 (ฉันได้รับข้อผิดพลาดunknown GLUT entry glutInitแต่อาจตั้งค่าจำนวนที่มากเกินไปของฉันไม่ทำงานไม่เคยใช้ในเครื่องนี้)
หยุดหมุน counterclockwis

@cetototurncounterclockwis: อ่าขอบคุณสำหรับคำใบ้ ฉันมี 1.10.2.3 ในระบบของฉันและอัปเดตเป็นเวอร์ชั่นล่าสุดแล้ว
nimi

5

SmileBASIC 2, 52 51 ไบต์

อันนี้ทำงานใน Petit Computer ของพ่อ SmileBASIC (และสั้นกว่าหนึ่งสองไบต์)

PNLTYPE"OFF
GPAGE 1GCLS 15@A
GPSET TCHX,TCHY
GOTO@A

คำอธิบาย:

PNLTYPE"OFF       'turn off keyboard
GPAGE 1           'set graphics to lower screen
GCLS 15           'clear with color 15 (white)
@A                'loop begin
GPSET TCHX,TCHY   'set black pixel at draw location
GOTO@A            'loop

คุณสามารถบันทึก 1 ไบต์โดยทำGPSET TCHX,TCHY:GOTO@Aตั้งแต่สีเริ่มต้นคือ 0 (โปร่งใส)
12Me21

4

Javascript + jQuery 138 ไบต์

d=$(document.body).click((e)=>d.append("<div style='background:black;width:5;height:5;position:fixed;top:"+e.pageY+";left:"+e.pageX+"'>"))

ตรวจสอบออนไลน์!

การเพิ่มการสนับสนุนการคลิกและการลากนั้นง่ายมากคุณต้องตั้งค่าตัวแปรอย่างไรก็ตามตามคำแนะนำและเพื่อย่อรหัสไม่รองรับ "เมื่อใดก็ตามที่มีการกดเม้าส์ลงเปลี่ยนพิกเซลที่เมาส์วางเป็นสีดำ" . ฉันตีความคำสั่งเป็นclickเหตุการณ์


3
สวัสดี! ครั้งต่อไปคุณควรยกเลิกการลบคำตอบเดิมแทนที่จะทำคำตอบใหม่ นอกจากนี้ฉันกลัวว่าสิ่งนี้จะต้องใช้งานได้ในสภาพแวดล้อมที่กำหนดหากเป็นวานิลลาจาวาสคริปต์คุณจะต้องนับจำนวน jQuery จำนวนไบต์ด้วยการส่งของคุณ คุณสามารถเรียกการส่งนี้ว่า "JavaScript + jQuery" และนั่นก็ใช้ได้: คุณอาจถือว่า jQuery ได้รับการติดตั้ง ในขณะที่คำตอบนี้มีอยู่คำตอบคือ "HTML" มากกว่าคำตอบคือไม่มีจาวาสคริปต์
Conor O'Brien

1
@ ConorO'Brien ฉันจะทำให้แน่ใจว่าจะทำในครั้งต่อไป ฉันอัปเดตคำตอบโดยใช้คำแนะนำของคุณ
Neil

4

SpecBAS - 61 59 ไบต์

1 CLS 15 
2 IF MOUSEBTN=1 THEN PLOT MOUSEx,MOUSEy
3 GO TO 2

สีดำเป็นสีเริ่มต้นของปากกาอยู่แล้ว แต่พื้นหลังมักเป็นสีเทาที่น่ารังเกียจดังนั้นให้CLS 15ตั้งเป็นสีขาวสว่าง

ป้อนคำอธิบายรูปภาพที่นี่


ตัวแปรพื้นฐานส่วนใหญ่ไม่ต้องการช่องว่างระหว่างหมายเลขคำสั่งและรหัสในบรรทัดนั้น
Pavel

SpecBAS เพิ่มช่องว่างทั้งหมดหลังจากที่คุณตีผลตอบแทน (รวมทั้งGOTOกลายเป็นGO TO)
ไบรอัน

1
แต่คุณสามารถลบช่องว่างและยังคงทำงานได้หรือไม่ ถ้าเป็นเช่นนั้นคุณจะไม่นับ
Pavel

หากผู้ใช้ไม่ได้สนใจเพียงการวาดภาพด้วยสีดำเหตุใดเขาจึงคำนึงถึงพื้นหลังสีเทา
Cees Timmerman

3

SmileBASIC, 70 58 53 ไบต์

XSCREEN 4GCLS-1@L
TOUCH OUT,X,Y
GPSET X,Y+240,0GOTO@L

อธิบาย:

XSCREEN 4 'display one graphics page on both screens
GCLS -1 'fill screen with white
@L 'loop
TOUCH OUT,X,Y 'get touch location
GPSET X,Y+240,0 'draw black pixel at touch position, offset by the height of the top screen.
GOTO @L 'loop

3

Clojure, 91 71 ไบต์

-20 ไบต์ขอบคุณ @cfrick สำหรับการชี้ให้เห็นว่าฉันสามารถใช้useเพื่อลดขนาดการนำเข้าของฉัน

(use 'quil.core)(defsketch P :mouse-dragged #(point(mouse-x)(mouse-y)))

ใช้ไลบรารีQuil ลากจุดเมื่อลากเมาส์

โดยทั่วไปคำตอบการประมวลผลเนื่องจาก Quil เป็น wrapper การประมวลผลสำหรับ Clojure

(q/defsketch P ; Start a new drawing

             :mouse-dragged ; Attach a mouse drag listener
             ; that draws a point at the current mouse location
             #(q/point (q/mouse-x) (q/mouse-y))) 

ป้อนคำอธิบายรูปภาพที่นี่


71:(use 'quil.core)(defsketch P :mouse-dragged #(point(mouse-x)(mouse-y)))
cfrick

@ cfrick LOL ฉันมักจะลืมuseเพราะมันเป็น "ไม่เหมาะสม" ขอขอบคุณ.
Carcigenicate


2

Java 7, 353 ไบต์

import java.awt.*;import java.awt.event.*;class M{static int x,y;public static void main(String[]a){Frame f=new Frame(){public void paint(Graphics g){g.drawLine(x,y,x,y);}};f.addMouseListener(new MouseAdapter(){public void mousePressed(MouseEvent e){x=e.getX();y=e.getY();f.repaint(x,y,1,1);}});f.setBackground(Color.WHITE);f.resize(500,500);f.show();}}

Ungolfed:

import java.awt.*;
import java.awt.event.*;

class M {
    //store the last point
    static int x, y;
    public static void main(String[] a) {
        Frame f = new Frame() {
            @Override
            public void paint(Graphics g) {
                g.drawLine(x, y, x, y);
            }
        }
        f.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                x = e.getX();
                y = e.getY();
                //repaint only the "new pixel"
                f.repaint(x, y, 1, 1);
            }
        });
        //default background is grey
        f.setBackground(Color.WHITE);
        f.resize(500, 500);
        f.show();
    }
}

2

Python2 และ Python3, 82 ไบต์ (หรือ 77?)

from turtle import *;up();onscreenclick(lambda x,y: goto(x,y)or dot(1));mainloop()

การใช้โมดูล Turtle สิ่งนี้ไม่เลวร้ายเกินไป :)

Ungolfed:

import turtle
turtle.up()

def fun(x, y):
    turtle.goto(x,y)
    turtle.dot(1)

turtle.onscreenclick(fun)
turtle.mainloop()

หากตกลงที่จะมีเส้นแบ่งระหว่างจุดคุณสามารถบันทึกได้ 5 ไบต์:

from turtle import *;onscreenclick(lambda x,y: goto(x,y)or dot(1));mainloop()

จากการนำเข้าเต่า *; up (); onclick (lambda * x: goto (* x) หรือจุด (1)); เสร็จสิ้น ()
innisfree

นั่นคือ 70 ไบต์
innisfree

2

Excel VBA, 62 ไบต์

ฟังก์ชั่นหน้าต่างแบบไม่ระบุชื่อ VBE แบบทันทีที่อนุญาตให้ผู้ใช้วาดบนแผ่นงานใด ๆ โดยเพียงแค่เลือกมัน

Cells.RowHeight=48:Do:DoEvents:Selection.Interior.Color=0:Loop

ตัวอย่างผลลัพธ์

ป้อนคำอธิบายรูปภาพที่นี่


1

HTML + Javascript, 152 148 ไบต์

<body onclick="document.body.innerHTML+='<x style=position:fixed;width:1;height:1;left:'+event.clientX+';top:'+event.clientY+';background:#000;>'"/>

1

ทัวริง , 77 ไบต์

var x,y,b:int loop mousewhere(x,y,b)if b=1then drawdot(x,y,1)end if end loop

Ungolfed:

var x,y,b : int      
loop
  mousewhere(x,y,b)  % Set (x,y) to mouse co-ords, and b to 1 or 0 indicating if the button is pressed
  if b=1 then
    drawdot(x,y,1)  % Draw a black pixel at (x,y)
  end if
end loop

1

HTML + CSS + JavaScript (ES6), 8 + 31 + 64 = 103 ไบต์

สนุกกับ CSS box-shadow!

s='0 0 0',onclick=e=>p.style.boxShadow=s+=`,${e.x}px ${e.y}px 0`
*{margin:0;width:1px;height:1px
<p id=p>

HTML + CSS + JavaScript (ES6), 8 +22 + 69 = 99 ไบต์

อันนี้พยายามที่จะชดเชยการเริ่มต้นmarginของ<body>องค์ประกอบ แต่มันอาจแตกต่างกันในเบราว์เซอร์และสไตล์ตัวแทนผู้ใช้ ผ่านการทดสอบใน Chrome เรียบร้อยแล้ว

s='0 0 0',onclick=e=>p.style.boxShadow=s+=`,${e.x-8}px ${e.y-16}px 0`
*{width:1px;height:1px
<p id=p>

HTML + CSS + JavaScript (ES6), 8 + 18 + 69 = 95 ไบต์

พิกเซลในภาพนี้อาจดูใหญ่ขึ้นเมื่อวาดที่พิกัดครึ่งพิกเซล

s='0 0 0',onclick=e=>p.style.boxShadow=s+=`,${e.x}px ${e.y}px 0 .5px`
*{margin:0;width:0
<p id=p>


1

TI-Basic, 1 ไบต์

Pt-Change(

ฉันแน่ใจว่าคุณส่วนใหญ่ที่มี TI calcs นึกถึงPenคำสั่ง แต่ปรากฎว่ามันไม่ได้ถูกโทเค็นดังนั้นจึงเหมาะสมที่สุดที่จะนับว่าเป็น 3 ไบต์ คุณสามารถอ่านเกี่ยวกับรุ่นอินเทอร์แอคทีฟได้Pt-Change(ที่http://tibasicdev.wikidot.com/pt-change


สิ่งนี้ไม่สามารถตอบความท้าทาย: TI calcs ไม่สามารถจัดการกับการป้อนข้อมูลของเมาส์เท่าที่ฉันรู้
Grimmy

2
@Grimy หากคุณยืนยันคุณสามารถใช้ไลบรารี usb8x เพื่อรับอินพุตเมาส์ USB แทนได้เสมอ แต่ฉันแน่ใจว่าการนำทางเคอร์เซอร์เริ่มต้นจะเพียงพอ
Timtech

1

Lua (love2d Framework), 180 ไบต์

รุ่น golfed

l=love v,g,m,p=255,l.graphics,l.mouse,{}d=m.isDown function l.draw()g.setBackgroundColor(v,v,v)if d(1)or d(2)then p[#p+1],p[#p+2]=m.getPosition()end g.setColor(0,0,0)g.points(p)end

ungolfed

l=love 
v,g,m,p=255,l.graphics,l.mouse,{}
d=m.isDown 
function l.draw()
  g.setBackgroundColor(v,v,v)
  if d(1)or d(2)then 
    p[#p+1],p[#p+2]=m.getPosition()
  end 
  g.setColor(0,0,0)
  g.points(p)
end

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

ป้อนคำอธิบายรูปภาพที่นี่


1
เชื่อหรือไม่ฉันมาที่นี่เพื่อโพสต์คำตอบโดยใช้ Love2d เพราะฉันเพิ่งค้นพบเกี่ยวกับมันและรักมันดังนั้น +1 สำหรับความพยายามที่ดี! อย่างไรก็ตามฉันคิดว่าคุณสามารถย่อให้สั้นลงได้เช่นนี้: l=love v,g,m,p=255,l.graphics,l.mouse,{}function l.draw()g.setBackgroundColor(v,v,v)if m.isDown(1)then p[#p+1],p[#p+2]=m.getPosition()end g.setColor(0,0,0)g.points(p)endซึ่งมีขนาด 169 ไบต์!
DimP

1
ผมมาที่นี่ชนิดของเหตุผลเดียวกันมีความสุขที่จะเห็นว่ามีคนอื่น ๆ ออกจากที่นี่ที่รู้ว่ามัน: D ขอบคุณ :)
Lycea


1

glslsandbox 232 ไบต์

โพสต์เก่า แต่พบว่าน่าสนใจ
ตั้งแต่การประมวลผลเสร็จแล้วฉันตัดสินใจที่จะทำสิ่งที่แตกต่าง

วิธีนี้ดึงว่ากดเมาส์หรือไม่ดังนั้นไม่ใช่ pydude ที่ขอ แต่เกือบ

#ifdef GL_ES
precision lowp float;
#endif
uniform float time;uniform vec2 mouse,resolution;uniform sampler2D t;void main(){vec2 f=gl_FragCoord.xy,r=resolution;gl_FragColor=vec4(time<2.||length(f-mouse*r)>2.&&texture2D(t,f/r).x>.1);}

ลองใช้กับ glslsandbox


0

กำลังดำเนินการ, 93 ไบต์, 91 ไบต์หากการเว้นวรรคไม่นับ

void setup(){size(100,100);background(-1);}void draw(){if(mousePressed) point(mouseX,mouseY);}

1
ใน PPCG หากไม่ได้กล่าวถึงในความท้าทายช่องว่างและทุกอย่างจะนับตามปกติ (เท่ากับจำนวนไบต์ในการเข้ารหัสที่เลือกโดยค่าเริ่มต้น UTF-8) ดังนั้นคะแนนของคุณจะเป็น 92 ไบต์เนื่องจากช่องที่ 1 ไม่สามารถลบได้โดยไม่ทำให้โปรแกรมแตก แต่ช่องว่างที่สองสามารถลบออกได้อย่างปลอดภัย
dzaima

0

UCBlogo พร้อม wxWidgets ขนาด 65 ไบต์

setbg 7
setpc 0
ht
pu
make "buttonact[setpos clickpos pd fd 1 pu]

คำอธิบาย (รหัสที่กำหนดให้กับตัวแปรbuttonactดำเนินการในการคลิกแต่ละปุ่ม):

SetBackground 7 ; white
SetPenColor 0 ; black
HideTurtle
PenUp
make "buttonact [
  SetPos ClickPos
  PenDown
  Forward 1
  PenUp
]

อย่างน้อยฉันคิดว่ามันใช้งานได้ มันควรจะเป็นไปตามเอกสารแต่เห็นได้ชัดbuttonactตัวแปรทำงานเฉพาะใน wxWidgets สร้างและฉันดิ้นรนที่จะสร้าง UCBLogo กับ wxWidgets บนลินุกซ์ที่ทันสมัย (waddyamean คุณไม่สามารถโยนตัวชี้ไปintและกลับมา?)

UCBlogo ที่ไม่มี wxWidgets ขนาด 73 ไบต์

หากต้องการดูเอฟเฟกต์ที่ต้องการคุณสามารถเรียกใช้เวอร์ชันที่ยาวกว่านี้ด้วยการวนซ้ำไม่สิ้นสุด

setbg 7 setpc 0 ht pu
while[1=1][setpos mousepos if[button?][pd] fd 1 pu]

แต่สิ่งนี้ขัดข้องucblogoบนเครื่องของฉัน ... ดูเหมือนสภาพการแข่งขัน

UCBlogo ทำงานกับเครื่องของฉัน 80 ไบต์

setbg 7 setpc 0 ht pu
while[1=1][setpos mousepos if[button?][pd] fd 1 pu wait 1]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.