ペイントプログラムを作成します!


51

前書き

ある日、あなたはあなたの子供にコンピューターで描く方法を見せていました。mspaint.exe実行バーに入力します。恐ろしいことに、「検索に一致するアイテムはありません」と表示されます。あなたの子供が描くことができるように、ペイントのシンプルなバージョンを作成する必要があります!

チャレンジ

簡単な描画プログラムを作成する必要があります。これを行うには、白いディスプレイウィンドウ(99x99ピクセルより大きい)を開きます。マウスが押されるたびに、マウスがオンになっているピクセルを黒に変更します。

これはなので、バイト単位の最短回答が勝ちです!


8
ピクセルである必要がありますか?または、99x99の正方形にできますか?
fənɛtɪk

2
どのくらいの期間実行する必要がありますか?
Rɪᴋᴇʀ

2
TI-Basicのは、ときPenO:まさにこのない
Timtech

1
@Riker少なくとも10秒間、できれば永久に実行する必要があります
-pydude

1
99×99より大きいので、各次元に10進表記で3桁を使用する必要がありますか?99×100または100×99は有効ですか?
セバスチャンサイモン

回答:


86

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互換マウスドライバーの存在を想定しています。

@berendiに感謝-2バイト!

スクリーンショット

使い方:

            |   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 33h0を返します。BXこれは予想どおりFFFFhに減分されますが、線はまだ描画されています。おそらくこれは、モード11hにビデオページが1つしかなく、無効なページ番号が自動的に修正されるためでしょうか?私はVM VirtualBoxでテストしているので、たぶんそれはBIOS実装が行っていることです。
コーディグレー

2
:VirtualBoxのように見えますが、それは単に完全にページ番号を無視し、ここに責任があるvirtualbox.org/browser/vbox/trunk/src/VBox/Devices/Graphics/...
user5434231

2
ビル・アトキンソン自身もこれを誇りに思っています。素晴らしい仕事。
Wossname

4
-2バイトは最後を除去int 0x10jmp第2のバックにint 0x10代わり。オフセット入力jmpは同じままで、アドレスを調整しますmov dx
berendi-17年

25

スクラッチ、10スクラッチバイト

スクラッチは、実際にこのようなもののために設計されました。

オンラインでお試しください!


これは実際にピクセルを実行しますか?また、マウスを高速でクリックした場合とマウスを少し押したままにすると、異なる結果が得られます(もちろん移動しません)。私はこれが無効になると思います。
Rɪᴋᴇʀ

19
現在使用しているスコアによると、これは10 Scratchバイトではありません。
Okx

2
スクラッチブロックアプリを使用して、テキストまたはSB2ファイルサイズに変換する必要があります。
マシュー

2
以前のスクラッチ回答で使用したスコアリングを使用しています。誰かが私を現在の得点にリンクできますか?@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)

Gustavo Rodriguesのおかげで2バイト、Shaggyから2バイト節約されました。

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>
グスタボロドリゲス

2
これにより、実際にカーソルが移動する場所ではなく、矢印の右下にドットが配置されます。これは意図的なものですか?
アノプレキシアン

c.JSの先頭からをドロップして2バイト節約します。@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
私は今テストすることはできません、府私はあなたがの宣言をマージすることができると思うhfor2バイト:)を保存するために初期化
クエンティン・

私は、これはコードのゴルフで実現し、それはここが望ましいかもしれないが、LOWORDHIWORDしているではないパックからカーソル座標を抽出するための正しい方法LPARAM。とを使用する必要がGET_X_LPARAMありますGET_Y_LPARAM。そうしないと、複数のモニターで誤った結果が表示されます。
コーディグレー

@ Quentin、c ++では機能しますが、cでは機能しません。私はc ++を使用することもできましたが、それからint mainさらに4バイトを追加することを書きました。
ヨハンデュトワ

@Cody、公正なコメント。テストするマルチモニターシステムはありませんが、使用(short)LOWORD()(short)HIWORD()て問題を解決すると思いますか?
ヨハンデュトワ

Quentinが提案したものは、C99を含むCの最新バージョンで問題なく動作します。もちろん、あなたは、C89 / 90に戻されたMicrosoftのCコンパイラを使用しています。C89はmain、(暗黙のintルールのために)関数の戻り値の型を省略できる理由でもあります。唯一の問題は、return 0;C89およびMSVCで未定義の動作の原因を省略することです。C99およびC ++では、あなたはの戻り値の型を必要としmainますが、return 0;暗黙のため、不要です。まあ、この言語はコードゴルフ用に作られたものではありません。:-)
コーディグレー

10

処理中、98 79バイト

@dzaimaのおかげで19バイト節約

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

ハスケル、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

編集:@ceasedがcounterclockwisをオンにすると、フルスクリーンウィンドウを使用したときに5バイトを節約する最新バージョンの光沢について説明されました。ありがとう!


FullScreengloss> = 1.11ではnullaryで、スコアは5減少します(unknown GLUT entry glutInitただし、エラーが発生しますが、おそらく、私のglutセットアップは機能しません。このマシンでは使用しません。)
counterclockwisを

@ceasedtoturncounterclockwis:ああ、ヒントをありがとう。システムに1.10.2.3がありましたが、最新バージョンに更新されました。
-nimi

5

SmileBASIC 2、52の 51バイト

この1つのSmileBASICのお父さん、プティ・コンピュータで実行さ(とある1 2バイト短いです。)

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

GPSET TCHX,TCHY:GOTO@Aデフォルトの色は0(透明)なので、1バイト節約できます。
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の回答ではありません。
コナーオブライエン

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
しかし、スペースを削除しても、問題なく実行できますか?もしそうなら、あなたはそれらを数えません。
パベル

ユーザーが黒でペイントするだけを気にしない場合、なぜ灰色の背景を気にするのでしょうか?
シーズティマーマン

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バイト

useインポートを縮小するために使用できることを指摘してくれた@cfrickに感謝します。

(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それは「適切ではない」のでいつも忘れています。ありがとうございました。
発がん性物質


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

from turtle import *; up(); onclick(lambda * x:goto(* x)or dot(1)); done()
イニスフリー

それは70バイトです
イニスフリー

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

ゴルフをしていない:

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 CalcのほとんどのユーザーはこのPenコマンドを考えていたと思いますが、トークン化されていないため、3バイトとしてカウントするのが最も理にかなっています。あなたは、対話型バージョンのについて読むことができますPt-Change(http://tibasicdev.wikidot.com/pt-change


これは課題に答えません。TIcalcは、私の知る限り、マウス入力を処理できません。
グリムミー

2
@Grimy主張するなら、代わりにいつでもusb8xライブラリを使用してUSBマウス入力を取得できます。しかし、デフォルトのカーソルナビゲーションで十分であると確信しています。
ティムテック

1

Lua(love2dフレームワーク)、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を使用して答えを投稿するためにここに来ました。とにかく、このようにもう少し短くすることができると思います: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)end169バイトになります!
DimP

1
私は同じような理由でここに来ました。それを知っている他の人がここにいるのを見てうれしいです:Dありがとう:)
リセ


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)。したがって、プログラムを中断せずに1番目のスペースを削除することはできませんが、2番目のスペースは安全に削除できるため、スコアは92バイトになります。
dzaima

0

wxWidgetsを使用したUCBlogo、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ビルドでのみ機能するようであり、現代のLinuxでwxWidgetsを使用してUCBLogoを構築するのに苦労しています(waddyaはポインタをキャストすることはできませんintか?)

wxWidgetsなしのUCBlogo、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.