Створіть програму Paint!


51

Вступ

Одного разу ви показували дитині, як малювати на комп’ютері. Ви набираєте mspaint.exeпанель запуску. На ваш жах, він говорить: "Жоден предмет не відповідає вашому пошуку". Ви повинні створити просту версію фарби, щоб малюк міг малювати!

Виклик

Ви повинні створити просту програму малювання. Для цього відкрийте біле вікно (більше 99x99 пікселів). Щоразу, коли мишу натискаєте, змініть піксель, на якому миша увімкнено, на чорний.

Це , тому найкоротша відповідь у байтах виграє!


8
Чи потрібно це пікселів? або це може бути квадрати 99x99?
fəˈnɛtɪk

2
Скільки часу потрібно бігати?
Rɪᴋᴇʀ

2
Коли TI-Basic Penробить саме це: o
Timtech

1
@Riker він повинен працювати не менше 10 секунд, бажано назавжди
pydude

1
Чи більший, ніж 99 × 99, тому ми повинні використовувати три цифри у десятковій нотації для кожного виміру? Чи було б дійсним 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 не на 100% сумісний з Microsoft. Якого драйвера ви використовували для тестування?
Коді Грей

2
Хм. Після запуску коду з відладчиком (звичайно, старий добрий DEBUG.COM!), Виявляється, що це не проблема з драйвером CuteMouse. Без натиснутої кнопки INT 33hповертається 0 BXдюймів, і цей показник зменшується до FFFFh, як очікувалося, але лінія все ще проводиться. Можливо, це тому, що в режимі 11h є лише одна сторінка відео, а недійсний номер сторінки автоматично встановлюється? Я тестую VM VirtualBox, тому, можливо, це щось робить його реалізація BIOS.
Коді Грей

2
Схоже, в цьому винен і VirtualBox, він просто ігнорує номер сторінки: virtualbox.org/browser/vbox/trunk/src/VBox/Devices/Graphics/…
користувач5434231

2
Сам Білл Аткінсон пишався б цим. Чудова робота.
Wossname

4
-2 байти видалити останній int 0x10, замість цього jmpдругий int 0x10. Зсув jmpзалишається незмінним, коригуйте адресу вmov dx
berendi - протестуючи

25

Скретч, 10 байт скретч

Scratch був практично розроблений для таких речей.

Спробуйте в Інтернеті!


Це насправді робить пікселі? Крім того, якщо швидко натиснути на мишу проти трохи утримувати її, вона дає різні результати (звичайно, не переміщуючи її). Я думаю, що це визнає недійсним.
Rɪᴋᴇʀ

19
Це не 10 байт скретч, відповідно до скорингу, який ми використовуємо.
Оккс

2
Можливо, ви повинні скористатися додатком скретчблоків для перетворення тексту або розміру файлу SB2.
Меттью Ро

2
Я використовую бали, які я використовував у попередніх відповідях на Scratch. Чи може хтось, будь ласка, зв’язати мене з поточним балом? @Okx
dkudriavtsev

8
@ Менделєєв Я не впевнений, але він, мабуть, має на увазі цю систему оцінок Scratch .
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 байти завдяки Густаво Родрігесу та 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викидає речі на кілька пікселів.
Кудлатий

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
Я не можу перевірити зараз, але я думаю, ви можете злити декларацію hв forініціалізатор, щоб зберегти два байти :)
Квентін,

Я розумію , що це код для гольфу і може бути бажаними тут, але LOWORDі HIWORDє НЕ правильним способом вилучення координат курсору з насадок LPARAM. Ви повинні використовувати GET_X_LPARAMі GET_Y_LPARAM, в іншому випадку ви отримаєте неправильні результати з декількома моніторами.
Коді Грей

@Quentin, який буде працювати в c ++, але не в c. Я міг би використовувати c ++, але тоді я би написав, int mainщо додало б ще 4 байти.
Йохан дю Тойт

@Cody, Справедливий коментар. У мене немає системи мультимонітори для тестування, але ви вважаєте, що використання (short)LOWORD()та (short)HIWORD()вирішило б це питання?
Йохан дю Тойт

Що запропонував Квентін, працює чудово у будь-якій сучасній версії C, включаючи C99. Звичайно, ви використовуєте компілятор C C Microsoft, який застряг у C89 / 90, з його обмеженими правилами змінного масштабування. C89 також чому вам дозволяється опускати mainтип повернення функції (через intправило неявного ). Єдина проблема полягає в тому, щоб опустити return 0;причини невизначеної поведінки у C89 та MSVC. У C99 та C ++ вам потрібен тип повернення для main, але значення return 0;є неявним і, таким чином, непотрібним. Ну, мова не була створена для кодового гольфу. :-)
Коді Грей

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 click


@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

Редагувати: @ перестало повертати проти годинника, мені розповіли про найновішу версію блиску, яка економить 5 байт при використанні повноекранних вікон. Дякую!


FullScreenє nullary в gloss> = 1.11, зменшуючи бал на 5. ( unknown GLUT entry glutInitХоча я отримую помилку , але, ймовірно, моя настройка глуха просто не працює; ніколи не використовувала її на цій машині.)
перестала повертати зустрічний годинник

@ceasedtoturncounterclockwis: ах, дякую за підказку. У мене в системі 1.10.2.3 і тепер оновлено до останньої версії.
німі

5

SmileBASIC 2, 52 51 байт

Це один працює в папочку 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
Привіт! Наступного разу слід замінити стару відповідь, а не робити нову відповідь. Також я боюся, що це має працювати у визначеному середовищі - якщо це ванільний javascript, вам доведеться включити кількість байтів jQuery до вашої подачі. Ви можете назвати це подання "JavaScript + jQuery", і це було б добре: там ви можете припустити, що jQuery встановлений. Наразі ця відповідь стоїть, її відповідь більше "HTML", а не javascript.
Conor O'Brien

1
@ ConorO'Brien Я переконуюсь, що робити це наступного разу. Я оновив відповідь, використовуючи ваші пропозиції.
Ніл

4

SpecBAS - 61 59 байт

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

Чорний колір вже є кольором ручки за замовчуванням, але фон, як правило, неприємний відтінок сірого, тому CLS 15встановлює його на яскраво-білий.

введіть тут опис зображення


Більшість базових варіантів не потребують пробілу між номером команди та кодом у цьому рядку.
Павло

SpecBAS додає всі пробіли після того, як ви повернетесь (включаючи GOTOстати GO TO)
Брайан

1
Але чи можете ви вилучити пробіли, і все-таки добре виконати? Якщо так, ви їх не рахуєте.
Павло

Якщо користувач не заперечує лише фарбуванням з чорним кольором, то чому він буде проти сірого фону?
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 є обгорткою для обробки 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();}}

Безголівки:

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, це не дуже погано :)

Безголівки:

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

від імпорту черепахи *; вгору (); onclick (лямбда * х: goto (* x) або крапка (1)); done ()
бездарно

Це 70 байт
бездарно

2

Excel VBA, 62 байти

Функція негайного вікна Anonymous 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

Безголівки:

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 байт

версія для гольфу

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

неозорий

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 байт

Стара публікація, але це було цікавим.
Оскільки обробка вже зроблена, я вирішив зробити щось інше.

Це показує, натискається чи ні миша, тож не те, про що попросили підуїди, але майже.

#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 на сучасному Linux (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]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.