Chương trình vẽ ngắn


13

Bạn vừa mời một chuyên gia nghệ thuật tự do đến nhà bạn và bạn đang nói với anh ấy / cô ấy

"Bạn biết đấy, tôi là một lập trình viên tuyệt vời và tôi có thể làm x và y và z ..."

Anh ấy nhanh chóng chán nản và hỏi bạn:

"Nếu bạn thực sự là một lập trình viên tuyệt vời, bạn có thể tạo một chương trình để cho tôi vẽ không, tôi chỉ cần vẽ các đường trên màn hình bằng cách sử dụng chuột và chọn các màu khác nhau theo bất kỳ cách nào".

Mã của bạn có thể nhập các thư viện tiêu chuẩn. Mã của bạn có thể yêu cầu màu sắc được chọn thông qua bàn phím.

Đây là ; mã ngắn nhất thắng.

Điểm đạn

  • Các đường được vẽ bằng cách di chuyển chuột xung quanh trong khi nhấn nút bên trái.

  • Thuật toán dòng của Bresenham là không cần thiết, bất kỳ thuật toán tích hợp nào cũng sẽ thực hiện được

  • Nếu người dùng có thể thay đổi độ dày của đường theo bất kỳ cách nào bạn nhận được phần thưởng * 0,8 nhưng điều đó không bắt buộc.

  • Tôi đoán nó sẽ đẹp hơn khi tự thực hiện vẽ đường thẳng, nhưng nếu bạn muốn, bạn có thể nhập một thư viện cho điều đó chỉ cần nói nó trong mô tả mã.

  • Tối thiểu là 5 màu khác nhau (đỏ, xanh lá cây, xanh dương, trắng, đen). Nếu bạn làm cho họ thay đổi ngẫu nhiên, bạn sẽ bị phạt * 1.2. Bạn có thể thay đổi chúng theo bất kỳ cách nào bạn muốn (cả hai nút và phím bấm đều ổn).

  • Vẽ chúng bằng cách ấn chuột giữa các điểm hoặc tự do sẽ là tốt nhất (nghĩa là bạn làm trong sơn) và cho bạn phần thưởng * 0,7, nhưng bất kỳ phương pháp nào khác đều ổn: (ví dụ) nhấp vào hai điểm và vẽ một đường thẳng giữa các điểm đó ?

  • Canvas vẽ phải là 600x400

  • Thay đổi màu chỉ nên thay đổi màu của các đường sẽ được vẽ trong tương lai.

  • Việc thực hiện lệnh "Xóa tất cả" là không bắt buộc nhưng nếu bạn thực hiện điều đó bạn sẽ nhận được * 0,9 tiền thưởng.


2
Làm thế nào là dòng yêu cầu được vẽ? Thuật toán dòng của Bresenham ? Các dòng cần phải có độ dày thay đổi? Chúng ta có cần phải tự thực hiện vẽ đường thẳng không? Vui lòng ghi rõ hơn. Và thông thường người ta cho rằng mã của chúng tôi có thể "nhập thư viện chuẩn". Có bao nhiêu màu sắc phải được lựa chọn? 2 có ổn không? Hoặc làm thế nào về việc chọn màu ngẫu nhiên mỗi lần nhấn nút bàn phím?
Justin

2
Một số làm rõ thêm cần thiết: Làm thế nào là các đường được vẽ? Bạn có bấm hai điểm và vẽ một đường thẳng giữa các điểm đó không? Làm thế nào lớn vải vẽ phải được? Có bao nhiêu màu phải được hỗ trợ? Có thể thay đổi màu sắc cũng thay đổi màu sắc của mỗi dòng khác? V.v. Thách thức này hiện chưa được xác định rõ.
Doorknob

@Quincunx Tôi đã đặt một câu hỏi và trả lời trong câu hỏi cho tôi biết bây giờ có ổn không.
Caridorc

2
1. Hãy ngưng tụ Q & A. Loại bỏ các câu hỏi và làm cho các câu trả lời tự đứng vững như các gạch đầu dòng. Lưu ý rằng bình luận đôi khi có thể bị xóa. Điểm thuật toán của Bresenham không có ý nghĩa gì nếu không đọc bình luận. Tôi giả sử những gì bạn đang nói là thuật toán của Bresenham là không bắt buộc và bất kỳ thuật toán hoặc chức năng thư viện / tiêu chuẩn nào cũng sẽ làm được. 2. Chiến thắng cuối cùng phụ thuộc vào ngôn ngữ nào dễ dàng truy cập API và truy cập nút Phải (thay vì nút trái thông thường.)
Level River St

2
1. "Vẽ chúng bằng cách ấn chuột giữa 2 điểm là tốt nhất nhưng bất kỳ phương pháp nào khác đều ổn" Còn việc vẽ tự do như thế nào với công cụ bút chì trong sơn? Tôi đề nghị bạn làm cho nó rõ ràng hơn hoặc loại bỏ "mọi phương pháp khác đều ổn". 2. Phương pháp thay đổi màu sắc nên được chỉ định tốt hơn. Ví dụ, nó có thể được thực hiện từ bàn phím, bằng cách xoay qua các màu bằng nút chuột khác, hoặc có phải bằng cách nhấp vào một pallete trên màn hình không?
Cấp sông St

Câu trả lời:


9

HTML + jQuery + CSS - 507 x (0,7 x 0,8 x 0,9) = 255,528

Không ngắn như tôi nghĩ, nhưng tôi thích kết quả.

Đặc trưng:

  • Chế độ vẽ nhấp và kéo. ( 0,7 )
  • Bảy màu (đen + cầu vồng).
  • Chiều rộng bàn chải thay đổi (điều khiển thanh trượt). ( 0,8 )
  • Xóa tất cả chức năng. ( 0,9 )

Demo trực tiếp: http://jsfiddle.net/onsLkh8y/9/


HTML - 84 byte

<input id="r" type="range" min="1" max="9"><canvas id="c" width="600" height="400"/>

CSS - 35 byte

#c{border:1px solid;cursor:pointer}

jQuery - 388/444 byte

Các trình duyệt tuân thủ W3C (ví dụ: Chrome) - 388 byte

var t=c.getContext('2d');$.each('black0red0orange0yellow0green0blue0purple0clear'.split(0),function(k,v){
$(r).before($('<button>'+v+'</button>').click(function(){k>6?t.clearRect(0,0,600,400):t.strokeStyle=v}))})
$(c).mousedown(function(e){t.lineWidth=$(r).val();t.beginPath();t.moveTo(e.offsetX,e.offsetY)})
.mousemove(function(e){if(e.which==1){t.lineTo(e.offsetX,e.offsetY);t.stroke()}})

Phiên bản trình duyệt chéo (bản sửa lỗi cho Firefox, Safari, IE) - 446 byte

var t=c.getContext('2d');$.each('black0red0orange0yellow0green0blue0purple0clear'.split(0),function(k,v){
$(r).before($('<button>'+v+'</button>').click(function(){k>6?t.clearRect(0,0,600,400):t.strokeStyle=v}))})
var d,p=$(c).offset();$(c).mousedown(function(e){d=t.lineWidth=$(r).val();t.beginPath()t.moveTo(e.pageX-p.left,
e.pageY-p.top)}).mousemove(function(e){if(d){t.lineTo(e.pageX-p.left,e.pageY-p.top);t.stroke()}}).mouseup(function(){d=0})

Sửa lỗi:

  • FireFox - event.offset[X|Y]không xác định.
  • Safari - event.whichevent.buttonskhông được định nghĩa một cách có ý nghĩa trên mousemove.
  • Internet Explorer - hoạt động với cả hai bản sửa lỗi trên, mặc dù sử dụng e.buttonssẽ là đủ.

1
$ (tài liệu). đã có trong codegolf?
edc65

bạn không cần trích dẫn id=và có thể cả những người khác nữa (đã không thực hiện html trong một thời gian)
Cyoce

10

Đang xử lý - 93 · 0,9 = 83,7

Bên cạnh không có chi phí để vẽ, nhưng cú pháp rất dài dòng, trong Xử lý điểm số tốt nhất có thể đạt được mà không có bất kỳ tính năng hay nào và chỉ có một phần thưởng:

void setup(){
size(600,400);
}
void draw(){
if(mousePressed)line(mouseX,mouseY,pmouseX,pmouseY);
}

Điểm: 93 · 0,9 = 83,7 (Dòng mới chỉ dành cho khả năng đọc và không được tính vào điểm số.)

Tuy nhiên, điều đó thú vị hơn nhiều với tất cả các phần thưởng tại chỗ:

void setup(){
size(600,400);
}
int i,x,y;
void draw(){
stroke(7*i%256,5*i%256,i%256);
strokeWeight(i%9);
if(keyPressed)i++;
if(!mousePressed){x=mouseX;y=mouseY;if(x<0)background(0);}
}
void mouseReleased(){
line(x,y,mouseX,mouseY);
}

Điểm: 221 · 0,8 · 0,7 · 0,9 = 111,4

Nó được sử dụng như thế này:

  • Nhấp và kéo chuột để vẽ một đường thẳng.

  • Trong khi nhấp, kéo chuột ra khỏi phía bên trái của cửa sổ và nhả nút chuột để xóa màn hình.

  • Giữ phím bất kỳ sẽ chuyển qua các giá trị đỏ, lục và lam của màu vẽ và qua các độ dày nét khác nhau. Vì thời gian đạp xe là khác nhau, thực tế tất cả các kết hợp có thể đạt được (với một chút cố gắng).

đầu ra đầy màu sắc 1

Biên tập:

Vì bản vẽ tự do cũng cho phần thưởng 0,7, đây là một giải pháp khác:

void setup(){
size(600,400);
}
int i;
void draw(){
stroke(7*i%256,5*i%256,i%256);
strokeWeight(i%9);
if(keyPressed)i++;
if(key>9)background(0);
if(mousePressed)line(mouseX,mouseY,pmouseX,pmouseY);
}

Điểm: 188 · 0,8 · 0,7 · 0,9 = 94,8

Nó được sử dụng như thế này:

  • Nhấp và kéo để vẽ các đường tự do.

  • Giữ phím tab để thay đổi màu sắc và độ dày nét. Điều này cũng có thể được thực hiện trong khi vẽ (xem hình).

  • Nhấn bất kỳ phím nào nhưng tab và sau đó tab để xóa màn hình.

đầu ra đầy màu sắc 2


Freehand cũng cung cấp cho bạn tiền thưởng.
Caridorc

@Caridorc: À, tuyệt. Tôi sẽ cập nhật câu trả lời của tôi sau đó.
Emil

2
Điều đó sẽ rất khó để đánh bại.
primo

if(key>0)ngắn hơnif(keyPressed)
Kritixi Lithos

9

Python 2.7 - 339 197 324 * (0,7 * 0,8 * 0,9) = 163

Chỉnh sửa: Tôi phát hiện ra pygame có thể vẽ các đường có chiều rộng thay đổi nên đây là bản cập nhật.

Một thử nghiệm trong việc sử dụng các mô-đun PyGame.

Một chương trình vẽ đơn giản vẽ các đường từ sự kiện MOUSEDOWN (giá trị 5) đến sự kiện MOUSEUP (giá trị 6). Nó sử dụng hàm pygame.gfxdraw.line (). Nhấn phím TAB sẽ chuyển qua 8 màu. Nhấn phím BACKSPACE sẽ xóa màn hình thành màu trắng giấy được làm cẩn thận. Phím ENTER sẽ xoay vòng kích thước cọ qua chiều rộng 0-7 pixel.

Tôi mới chơi code-golf nên có thể tôi đã bỏ lỡ một số phương pháp giảm kích thước mã.

import pygame as A,pygame.draw as G
P=A.display
D=P.set_mode((600,400))
C=(0,255)
S=[(r,g,b) for r in C for g in C for b in C]
w=n=1
while n:
 e=A.event.wait()
 t=e.type
 if t==12:n=0
 if t==2:
  if e.key==9:n+=1
  if e.key==13:w+=1
  if e.key==8:D.fill(S[7])
 if t==5:p=e.pos
 if t==6:G.line(D,S[n%8],p,e.pos,w%8)
 P.flip()

Ảnh mẫu 1:

Hình ảnh khủng khiếp của một chiếc máy bay

Ảnh mẫu 2:

Phong cảnh


9
Bây giờ tôi có một tập tin trên máy tính của tôi có tên ms-paint.py.
Primo

1
Tận hưởng tốc độ và GUI sạch. Làm thế nào MS-Paint có nghĩa là. Tôi hy vọng tôi không bị kiện bởi một công ty phần mềm lớn nào đó ...
Logic Knight

5

C # 519 x 0,7 x 0,8 x 0,9 = 261,6 Sử dụng phương pháp DrawLine.

Chơi gôn

using System;using System.Drawing;using System.Windows.Forms;class f:Form{[STAThread]static void Main(){f F=new f{Width=600,Height=400};Point s=default(Point);sbyte[]c={0,0,0,1};F.MouseDown+=(_,e)=>{s=new Point(e.X,e.Y);};F.MouseUp+=(_,e)=>{F.CreateGraphics().DrawLine(new Pen(Color.FromArgb(255,c[0],c[1],c[2]),c[3]),s.X,s.Y,e.X,e.Y);};F.KeyPress+=(a,e)=>{unchecked{switch(e.KeyChar){case'r':c[0]++;break;case'g':c[1]++;break;case'b':c[2]++;break;case't':c[3]++;break;case'c':F.Invalidate();break;}}};F.ShowDialog();}}

Có thể đọc được

using System;
using System.Drawing;
using System.Windows.Forms;

class f : Form
{
    [STAThread]
    static void Main()
    {
        f F = new f { Width = 600, Height = 400 };
        Point s = default(Point);
        sbyte[] c = { 0, 0, 0, 1 };
        F.MouseDown += (_, e) => { s = new Point(e.X, e.Y); };
        F.MouseUp += (_, e) => { F.CreateGraphics().DrawLine(new Pen(Color.FromArgb(255, c[0], c[1], c[2]), c[3]), s.X, s.Y, e.X, e.Y); };
        F.KeyPress += (a, e) =>
        {
            unchecked
            {
                switch (e.KeyChar)
                {
                    case 'r': c[0]++; break;
                    case 'g': c[1]++; break;
                    case 'b': c[2]++; break;
                    case 't': c[3]++; break;
                    case 'c': F.Invalidate();break;
                }

            }
        };
        F.ShowDialog();
    }
}

Bằng cách giữ r , g hoặc b trên bàn phím của bạn, nó sẽ thay đổi màu của dòng tiếp theo bằng cách tăng một mảng sbyte ở chỉ mục tương ứng. Nó sẽ bắt đầu từ 0 lần nữa khi tràn. Vì vậy, điều này cho chúng ta nhiều màu sắc. Tương tự với độ dày của đường được tăng lên bằng cách giữ t . Nhấn c xóa biểu mẫu.


5

Toán học - 333 x 0,7 x 0,8 x 0,9 = 168

l = {}; c = Black; s = .01;
ColorSetter@Dynamic@c
Dynamic@s~Slider~{0, .02}
Button["Clear", l = {}]
"/" Checkbox@Dynamic@b
EventHandler[
 Dynamic@Graphics@{White, Rectangle@{600, 400}, l},
 {"MouseDown" :> 
   AppendTo[l, p = {}; {c, Thickness@s, Line@Dynamic@p}], 
  "MouseDragged" :> (p = 
     Append[p, MousePosition@"Graphics"][[If[b, {1, -1}, All]]]),
  "MouseUp" :> (l[[-1, 3]] = Line@p)
  }
 ]

nhập mô tả hình ảnh ở đây


Điều này có thể vẽ các đường từ điểm này đến điểm khác? Nó xuất hiện để chỉ cho phép vẽ tay miễn phí.
trichoplax

@githubphagocyte Vâng, chỉ rảnh tay vào lúc này.
swish

1
@githubphagocyte Đã thêm tùy chọn đường thẳng
swish

câu trả lời tốt nhất cho đến nay.
primo

Tôi thích bản vẽ mặc dù.
tomsmeding

4

Tcl / Tk, 252

x 0,8 x 0,7 x 0,9

= 127,008

253 x 0,8 x 0,7 x 0,9 = 127,512

254 x 0,8 x 0,7 x 0,9 = 128,016

255 x 0,8 x 0,7 x 0,9 = 128,52

grid [canvas .c -w 600 -he 400]
set c red
incr t
lmap k {1
B1-Motion
3
MouseWheel
2} s {{set L [.c cr l %x %y %x %y -f $c -w $t]}
{.c coo $L "[.c coo $L] %x %y"}
{set c [tk_chooseColor]}
{if $t|%D>0 {incr t [expr %D/120]}}
{.c de all}} {bind . <$k> $s}

Tcl / Tk, 267

x 0,8 x 0,7 x 0,9

= 134,568

grid [canvas .c -w 600 -he 400]
set c red
set t 0
bind .c <1> {set L [.c cr l %x %y %x %y -f $c -w $t]}
bind .c <B1-Motion> {.c coo $L "[.c coo $L] %x %y"}
bind .c <3> {set c [tk_chooseColor]}
bind .c <MouseWheel> {if $t||%D>0 {incr t [expr %D/120]}}
bind .c <2> {.c de all}

Để dùng nó:

  • Nút chuột trái hoạt động như yêu cầu câu hỏi
  • Màu ban đầu là màu đỏ. Chuột phải hiển thị hộp thoại cho phép người dùng chọn màu sẽ được sử dụng vào lần tiếp theo. Luôn nhấn nút OK, nếu không màu sẽ không được xác định. Tôi có thể sửa cái này, nhưng nó sẽ tiêu tốn byte
  • Để điều chỉnh độ dày của dòng sẽ được sử dụng vào lần tới, bạn có thể xoay bánh xe chuột: Up = thicker, Down = mỏng hơn
  • Để xóa hình ảnh, nhấn nút chuột giữa

Một bài kiểm tra đơn giản:

nhập mô tả hình ảnh ở đây


2

DarkBASIC Pro - 318 x 0,7 x 0,9 = 200,34

Điều thú vị nhất ở đây là sử dụng một số logic bitwise trên scancode bàn phím hiện tại để thay đổi màu sắc. Tôi sử dụng hai bit khác nhau từ scancode cho mỗi kênh - vì vậy hầu như bất kỳ màu 6 bit nào đều có thể.

  • Giữ phím bất kỳ trên bàn phím của bạn để sử dụng màu (trên bàn phím Mỹ của tôi: Trắng = F5, Đen = không có phím, Đỏ = 2, Xanh = - (trừ), Xanh = b)
  • Nhấp chuột phải để xóa

Đây là một EXE được biên dịch: Tải xuống

#constant a set current bitmap
set display mode 800,400,32
create bitmap 1,800,400
do
s=scancode()
ink rgb((s&&3)*85,((s/4)&&3)*85,((s>>4)&&3)*85),0
m=mousex()
n=mousey()
o=mouseclick()
if o*(d=0) then d=1:x=m:y=n
a 1
if (o=0)*d then d=0:line x,y,m,n
if o=2 then cls
a 0
cls
copy bitmap 1,0
if d then line x,y,m,n
loop

1

BBC BASIC - 141 không có tiền thưởng

Ngôn ngữ lập trình đầu tiên của tôi và thường không bao giờ được sử dụng bởi tôi nữa :)

SYS "SetWindowPos",@hwnd%,0,0,0,600,400,6:VDU 26
1 MOUSE X,Y,b
IF b=4 THEN GOTO 4
GOTO 1
4 MOUSE x,y,b
IF b=0 THEN LINE X,Y,x,y:GOTO 1
GOTO 4

1

Python 2.7 - 384 * .8 * .7 = 215.04

from Tkinter import*;o=1
a='0f';C=['#'+r+g+b for r in a for g in a for b in a]
def i(a):global o;o+=1
def d(a):global o;o-=1
def I(a):global u;u+=1
def D(a):global u;u-=1
m=Tk();u=0;c=Canvas(width=600,height=400);c.bind("<B1-Motion>",lambda x:c.create_rectangle((x.x,x.y,x.x+o,x.y+o),fill=C[u],outline=C[u]));m.bind("q",i);m.bind("w",d);m.bind("x",D);m.bind("z",I);c.pack();mainloop()

Với tất cả tiền thưởng: 462 * .9 * .8 * .7 = 232.848

from Tkinter import*;o=1
a='0f';C=['#'+r+g+b for r in a for g in a for b in a]
def i(a):global o;o+=1
def d(a):global o;o-=1
def I(a):global u;u+=1
def D(a):global u;u-=1
m=Tk();u=0;c=Canvas(width=600,height=400);c.bind("<B1-Motion>",lambda x:c.create_rectangle((x.x,x.y,x.x+o,x.y+o),fill=C[u],outline=C[u]));m.bind("q",i);m.bind("w",d);m.bind("x",D);m.bind("z",I);m.bind("m",lambda _:c.create_rectangle((0,0,602,402),fill=C[7],outline=C[5]));c.pack();mainloop()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.