Nhanh, rẻ và tốt - Chọn bất kỳ hai


43

Là lập trình viên, tất cả chúng ta đều biết câu nói: "Bạn có thể có nó nhanh và tốt, nhưng nó sẽ không rẻ, bạn có thể có nó rẻ và tốt, nhưng nó sẽ không nhanh, hoặc bạn có thể có nó nhanh và rẻ , nhưng nó sẽ không tốt đâu. "

Đối với thử thách này, bạn đang triển khai một công cụ cấu hình tưởng tượng cho các dịch vụ lập trình tùy chỉnh của mình. Bạn nên kết xuất một bộ ba hộp kiểm, với tiêu đề "CHỌN BẤT CỨ HAI":

SELECT ANY TWO  
☐ FAST  
☐ CHEAP  
☐ GOOD

Khi hai mục đã được chọn, mục thứ ba phải bị vô hiệu hóa. Khi bỏ chọn một trong hai mục đã chọn, tất cả các tùy chọn phải được bật lại. Nói cách khác, nếu không hoặc một mục nào được chọn, tất cả vẫn được bật, nhưng nếu hai mục được chọn, mục thứ ba phải bị vô hiệu hóa.

Không có điều khiển đặc biệt được phép. Các hộp kiểm phải là hộp kiểm tiêu chuẩn trong ngôn ngữ bạn chọn. Ví dụ: không sử dụng điều khiển "CheckBoxList", nếu ngôn ngữ của bạn có. Tôi đang tưởng tượng hầu hết các mục sẽ là HTML / jQuery, nhưng đó không phải là quy tắc. Đây là mã golf, tìm kiếm mục nhập ngắn nhất.

NGƯỜI CHIẾN THẮNG

Tôi sẽ chia nó thành các loại. Có một số người chiến thắng rõ ràng:

jQuery: nderscore, Mr. Tenacity Dưới 100b khi bạn loại trừ "tài nguyên" văn bản. Đề cập đến danh dự cũng nên đến Matt để giới thiệu các khái niệm jQuery mà nhiều người lấy cảm hứng từ đó.

Dyalog APL: marinus, còn gọi là ông Unicode Làm thế nào để bạn gõ tất cả những thứ đó? Tôi có thể thấy lý do tại sao bạn muốn viết chương trình ngắn.

PHP: SuperScript Tôi tin rằng đây là mục ngắn nhất thực sự vô hiệu hóa thay vì bỏ chọn tùy chọn thứ ba, tuân theo sự diễn giải chặt chẽ nhất của các quy tắc.


Tôi có thể làm cho nó để chỉ có thể chọn hai cái cùng một lúc không? Vì vậy, việc chọn thứ ba bỏ chọn một trong những cái khác? Hoặc có thể thêm một nút chấp nhận bị mờ đi nếu 3 tùy chọn được chọn?
Justin

7
@Quincunx - Vì không có heuristic (ngoài việc đọc suy nghĩ) có thể quyết định bỏ chọn cái nào, điều này sẽ gây nhầm lẫn cho người dùng ... vì vậy tôi sẽ phải nói không, vì chúng tôi không muốn ấn tượng đầu tiên về dịch vụ phần mềm tùy chỉnh của chúng tôi là một xấu. ;)
Bruce Pierson

Câu hỏi này khiến tôi quan tâm đến tkinter của Python 3, vì vậy tôi đang cố gắng học nó ngay bây giờ. IMO, cách tốt nhất để học GUI là dùng thử và lỗi. Tôi đã thử điều này: ideone.com/YHLZIQ . Kết quả: nhanh chóng mở GUI mới. Tôi đã phải mở trình quản lý tác vụ để đóng chúng. :-). Hình ảnh (con số sớm tăng lên 340: i.stack.imgur.com/c9wQi.png )
Justin

Cuộc thi phần thưởng nên là một câu hỏi khác vì không có tiêu chí chiến thắng chính khách quan hay bất kỳ mô tả nào về "phần thưởng". Nó nói rằng mã phải là "... thanh lịch và linh hoạt ..." và "... ngắn gọn và rõ ràng ..." trái với mã golf . VTC như không rõ những gì bạn đang yêu cầu. Xin đừng thay đổi hoàn toàn các câu hỏi sau khi chúng được hỏi.
user80551

1
@BrucePierson Thật ra là có. Chúng tôi có thể bỏ chọn hộp kiểm cũ nhất được chọn. Tuy nhiên, mã cho điều đó sẽ nhiều hơn mã bạn yêu cầu.
Justin

Câu trả lời:


23

Javascript ( ES5 ) với jQuery - 143 ( Bản trình diễn )

Tôi đã sửa đổi giải pháp của Matt và đánh gôn đến mức tôi nghĩ nó có thể đi được:

$("*").html(["SELECT ANY TWO","FAST","GOOD","CHEAP"].join("<input type=checkbox onclick=(a=$('input:not(:checked)')).prop('disabled',!a[1])>"))

Javascript ( ES5 ) không có jQuery - 185 175 ( Bản trình diễn )

Sử dụng jQuery là một kiểu gian lận, vì vậy đây là một giải pháp không có nó:

(d=document).write(["SELECT ANY TWO","FAST","GOOD","CHEAP"].join("<input type=checkbox onclick='for(b in a=d.querySelectorAll(\"input:not(:checked)\"))a[b].disabled=!a[1]'>"))

Nếu chúng tôi được phép ngăn người dùng kiểm tra hộp thứ 3 thay vì thực sự vô hiệu hóa trường, chúng tôi có thể làm cho nó ngắn hơn nữa:

Với jQuery - 126 123 ( Bản trình diễn )

$("*").html(["SELECT ANY TWO","FAST","GOOD","CHEAP"].join("<input type=checkbox onclick=this.checked*=!$(':checked')[2]>"))

Không có jQuery - 150 147 ( Bản trình diễn )

(d=document).write(["SELECT ANY TWO","FAST","GOOD","CHEAP"].join("<input type=checkbox onclick=this.checked*=!d.querySelectorAll(':checked')[2]>"))

Mát mẻ. Sử dụng .joinlà một mẹo hay!
Robbie Wxyz

1
"SELECT ANY TWO0FAST0GOOD0CHEAP".replace(/0/g,là một cách khác để làm điều đó dẫn đến cùng một chiều dài.
nderscore

Chỉ cần kén chọn, phiên bản jquery nên sử dụng prop chứ không phải attr
Einacio

@Einacio điều ước của bạn là mệnh lệnh của tôi!
nderscore

5
@Einacio Nhưng codegolf là về thực hành tồi tệ nhất! : P
nderscore

29

JavaScript - 184 169 (với jQuery)

b="input",a="<input type=checkbox>",c=":checked";$("body").html("SELECT ANY TWO"+a+"FAST"+a+"GOOD"+a+"CHEAP").click(function(){$(b).not(c).attr("disabled",!!$(b+c)[1])})

http://jsfiddle.net/L33JK/16/

EDIT: được cải thiện với sự trợ giúp từ @Daniel Lisik - https://codegolf.stackexchange.com/a/26805/16278


5
Đẹp! Không đủ đại diện để nâng cấp ... nhưng bạn đã được tuyển dụng!
Bruce Pierson

2
Tôi càng nhìn vào điều này, tôi càng học hỏi nhiều hơn. Sự thông minh của phép gán biến trong bộ chọn jQuery. Rất tuyệt. Ngoài ra, bạn có thể giải thích "cú đúp" (!!) đang làm gì không?
Bruce Pierson

1
Một tiếng nổ đơn lẻ, ép buộc một giá trị boolean, và gấp đôi rõ ràng sẽ đảo ngược điều đó. undefinedép buộc thành sự thật. Điều đó và việc gán biến có lẽ là những thủ thuật nhỏ duy nhất được sử dụng thực sự.
Matt

Mã của bạn có thể được giảm xuống còn 179 ký tự như thế này: a="<input type='checkbox'>",b="input",c=":checked",$("body").html("SELECT ANY TWO"+a+"FAST"+a+"GOOD"+a+"CHEAP").change(function(){$(b+":not("+c+")").attr("disabled",!!$(b+c)[1])}) jsfiddle.net/L33JK/15
tên hiển thị bị thiếu


12

Thuốc nhuộm APL (trên Windows) (169)

Đây là một hàm tĩnh, để kiểm tra nó nếu bạn không biết APL, nhập )ed Cvà dán cái này vào cửa sổ chỉnh sửa, sau đó chạy C.

C
'R'⎕WC'Form' 'Select any two',2/⊂S←2/20
1 21 41{('R.',⊃⍵)⎕WC'Button'⍵(⍺1)S'Check'('Event' 'Select' 'F')}¨'Fast' 'Cheap' 'Good'
B←R.(F C G)
F←{B.Active←X∨2≠+/X←B.State}

Các bit mới hơn của APL có các từ khóa dài . Tôi vẫn đánh bại HTML mặc dù.

Giải trình:

  • 'R'⎕WC'Form' 'Select any two',2/⊂S←2/20: tạo một biểu mẫu R, với tiêu đề Chọn bất kỳ hai và kích thước và vị trí 20 20. Cũng cửa hàng 20 20trong S.
  • 1 21 41{... }¨'Fast' 'Cheap' 'Good': cho mỗi cặp dữ liệu này (tên và tọa độ y, là các biến duy nhất khác nhau giữa các hộp kiểm:
    • ('R.',⊃⍵)⎕WC'Button': tạo một nút bên trong Rvới chữ cái đầu tiên của tên,
    • ⍵(⍺1)S'Check': với đối số đúng là tiêu đề, (left arg, 1)theo vị trí, sử dụng lại Stheo kích thước và Checktheo kiểu,
    • ('Event' 'Select' 'F'), gọi hàm Fkhi nhấp.
  • B←R.(F C G): sử dụng Bnhư một từ viết tắt cho ba hộp kiểm chúng tôi đã tạo
  • F←{... }: xác định chức năng gọi lại là:
    • X←B.State: lấy trạng thái cho mỗi hộp kiểm và lưu chúng vào X,
    • X∨2≠+/X: sum X, nếu giá trị này không bằng hai hộp kiểm tất cả phải được kích hoạt, nếu nó bằng hai hộp kiểm tra duy nhất phải được kích hoạt
    • B.Active←: bật hoặc tắt các hộp kiểm

Kết quả:

ảnh chụp màn hình


Giải thích tuyệt vời, cảm ơn!
Bruce Pierson

11

Python 3 2, 454 434 ... 393 392 byte

Tôi nghĩ, Python phải ngắn hơn Java. Đây là "bằng chứng" ( EDIT: bây giờ nó thực sự ngắn hơn ):

from Tkinter import*
t=Tk()
r=str.replace
exec r(r(r(r('a@b@c@l=Label(t,text="SELECT ANY TWO");A`FAST|a);B`CHEAP|b);C`GOOD|c);l^A^B^C^','`','=Checkbutton(t,text="'),'|','",v='),'^','.pack();'),'@','=IntVar();')
def f(p,b,B,s):
 for i in 0,1,2:
    y=b[i].get()
    if p[i]-y:
     p[i]=y;s-=1
     if p[i]:s>0and B[i].toggle();s+=2
 t.after(1,f,p,b,B,s)
t.after(1,f,[0]*3,[a,b,c],[A,B,C],0)
t.mainloop()

Đối với những người bạn tò mò về những gì execbiểu thức thực sự thực thi, nó thực thi điều này (đây là những gì thay thế làm cho chuỗi. Các dòng mới được thêm vào để dễ đọc):

a=IntVar();
b=IntVar();
c=IntVar();
l=Label(t,text="SELECT ANY TWO");
A=Checkbutton(t,text="FAST",v=a);
B=Checkbutton(t,text="CHEAP",v=b);
C=Checkbutton(t,text="GOOD",v=c);
l.pack();
A.pack();
B.pack();
C.pack();

Điều này sử dụng logic giống như câu trả lời Java của tôi: bỏ chọn hộp kiểm nếu nó khiến nhiều hơn 2 hộp kiểm được chọn. UNF May mắn thay Thật không may, tôi đã dành hơn ít nhiều byte làm điều này.

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

CHỈNH SỬA:

  1. điều chỉnh lớn mã để sử dụng exec, tiết kiệm được 1 byte!
  2. chuyển sang python 2 để ép hai byte khỏi exec(loại bỏ dấu ngoặc đơn).
  3. chơi golf nhiều hơn. Bao gồm thay đổi range(3)để 0,1,2và thay đổi thụt đầu dòng để có một lớp tab. Không chắc chắn nếu \t\tsẽ làm việc thay vì \t__( _là nhân vật không gian). Cuối cùng cũng đạt được câu trả lời Java dài nhất của tôi từ trước đến nay.
  4. sử dụng thủ thuật thay thế
  5. đã sử dụng đề nghị của Bakiru và đánh gôn thêm. Thực tế làm cho nó ngắn hơn Java! Nhưng bây giờ, câu trả lời Java đã được đánh gôn nhiều hơn, vì vậy điều này một lần nữa dài hơn. :-(
  6. sử dụng cải tiến thay thế lừa .
  7. thay đổi a !=cho a -.

Cách tiếp cận thú vị. +1
cjfaure

Tôi có thể gian lận với chế độ turbo trên bàn phím. Đầu tiên, tôi kiểm tra hai hộp. Thứ hai, tôi sử dụng Tab để làm nổi bật thứ ba. Bây giờ tôi giữ Space Bar ở chế độ turbo trong vài giây. Đôi khi, điều này kiểm tra hộp thứ ba!
hạt nhân

@kernigh Tôi tin rằng đó là vì mã của tôi đạt đến điểm mà nó biết rằng hộp đã được bật, nhưng mã chưa đạt đến điểm mà nó bật lại hộp. Vì vậy, nếu bạn chuyển hộp trong thời gian đó (tắt), mã của tôi sẽ đánh dấu vào đó.
Justin

1
Bạn có thể tránh khối thụt lề bắt đầu bằng if p[i]cách sử dụng andthay vì if: if p[i]:s>1 and B[i].toggle();s+=1.
Bakuriu

@kernigh Tôi đã sai; thay thế B[i].toggle()bằng B[i].deselect()không thay đổi bất cứ điều gì. Tôi không biết tại sao điều này là như vậy. Có lẽ đó là một lỗ hổng vớitkinter
Justin

10

Nổi loạn, 219 197

load-gui p: func[p][p/state/value]x: func[v][if all[p a p b p c][set-face v false]] view [title"SELECT ANY TWO"a: check"FAST"on-action[x a]b: check"CHEAP"on-action[x b]c: check"GOOD"on-action[x c]]

Ung dung:

load-gui    ;; this is temporary while r3-gui is in beta

p: func [p] [p/state/value]

x: func [v] [
    if all [p a p b p c] [set-face v false]
]

view [
    title "SELECT ANY TWO"
    a: check "FAST" on-action [x a]
    b: check "CHEAP" on-action [x b]
    c: check "GOOD" on-action [x c]
]

Đây là phương ngữ Rebol 3 View (r3-gui). Screendump dưới đây từ Ubuntu Linux:

ví dụ về rebol 3 view

Cập nhật - Cảm ơn Earl & Graham từ Rebol SO Chatroom để cạo 22 ký tự mã - http://chat.stackoverflow.com/transcript/message/16345039#16345039


Đó là câu trả lời không hợp lệ, vì thứ ba bị vô hiệu hóa nhưng cũng được kiểm tra, điều đó có nghĩa là cả 3 đều được kiểm tra, vì vậy vui lòng sửa nó.
ST3

2
@ ST3 - Bạn không chính xác, tôi sợ. Hộp kiểm "TỐT" không được chọn hoặc thực tế bị vô hiệu hóa (mã của tôi chỉ đơn giản là đánh dấu vào ô thứ ba được chọn TẮT). Đây là cách chế độ xem Rebol 3 hiển thị hộp không được chọn (theo mặc định).
Drainegtun

1
@ ST3 et al - Đây là một liên kết hiển thị hộp kiểm mặc định tôi đã mô tả ở trên (hình ảnh thứ nhất cho thấy không có hộp kiểm nào được nhấp, thứ 2 chỉ là "TỐT") - plus.google.com/u/0/104216037702741908932/posts/Z2EbuQX67aq
Drainegtun

Chà ... tôi nhìn vào màn hình in mà bạn đã thêm và tôi thấy cả ba hộp kiểm được chọn, chỉ một cái không thể được chọn.
ST3

3
@ ST3 - Hộp kiểm có màu xám chỉ là Rebol 3 Xem cách hiển thị rằng đó là hộp kiểm có thể được kiểm tra. Đánh dấu chuyển sang màu xanh lá cây khi được chọn và chuyển sang màu xám khi không được chọn. Đây là những mặc định. Trong hình ảnh trong câu trả lời ở trên, bạn có thể thấy "TỐT" là tiêu điểm đầu vào (màu xanh mờ) vì nó được "nhấp" nhưng nó vẫn có màu xám và không có màu xanh lá cây (vì vậy không được kiểm tra).
Drainegtun

10

Java, 421 ... 369 351 byte

import java.awt.*;class F extends Checkbox{F(String s){super(s);}public static void main(String[]a){new Frame(){{add(new Panel(){{add(new Label("SELECT ANY TWO"));F[]c={new F("FAST"),new F("CHEAP"),new F("GOOD")};for(F b:c){add(b);b.addItemListener(e->{int x=0;for(F d:c)x+=d.getState()?1:0;if(x>2)((F)e.getSource()).setState(1<0);});}}});}}.show();}}

Java ... vì Java. Mã tìm kiếm Nicer:

import java.awt.*;

class F extends Checkbox {
    F(String s) {
        super(s);
    }

    public static void main(String[] a) {
        new Frame() {
            {
                add(new Panel() {
                    {
                        add(new Label("SELECT ANY TWO"));
                        F[] c = {new F("FAST"), new F("CHEAP"), new F("GOOD")};
                        for (F b: c) {
                            add(b);
                            b.addItemListener(e -> {
                                int x = 0;
                                for (F d: c) {
                                    x += d.getState() ? 1 : 0;
                                }
                                if (x > 2) ((F) e.getSource()).setState(1 < 0);
                            });
                        }
                    }
                });
            }
        }.show();
    }
}

Chạy mẫu (các cách khác nhau của cửa sổ, đầu tiên là khi khởi động):

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

Các hộp kiểm được sắp xếp theo chiều ngang; này được phép . Nó sẽ mất nhiều hơn để sắp xếp nó đúng. Ngoài ra, tôi vô hiệu hóa bằng cách bỏ chọn hộp khi nó được nhấp , không phải bằng cách làm cho nó không thể được bấm.

CHỈNH SỬA:

  1. lưu 3 byte bằng cách mở rộng lớp chính Checkbox.
  2. đọc lại Lambda Expressions và nhận ra rằng tên loại là không cần thiết. Lấy con trăn đó đi!
  3. chuyển đổi một whilevòng lặp thành một vòng lặp foreach (cảm ơn Lee ); Tại sao tôi không nghĩ về điều đó trước đây?
  4. đã lưu 18 byte bằng cách sử dụng một lớp ẩn danh và một trình khởi tạo thể hiện cho cả FramePanel.

Không hạn chế về căn chỉnh (vì vậy tôi cho rằng Matt có thể giảm 5 ký tự của mình). Đạo cụ cho một chương trình đang chạy hoàn chỉnh ... nhưng tôi không thấy tùy chọn thứ ba bị vô hiệu hóa.
Bruce Pierson

@BrucePierson Nó bị vô hiệu hóa. Nó không thể được bấm vào. Nếu nó được bấm, không có gì xảy ra.
Justin

2
Ah, tôi nghĩ rằng tôi thấy. Bạn ngay lập tức "bỏ đặt" trạng thái đã chọn mà không tắt? Điều đó sẽ được chấp nhận.
Bruce Pierson

@BrucePierson Đúng vậy. Để thực sự vô hiệu hóa, tôi phải đổi if(x>2)((Checkbox)e.getSource()).setState(1<0);thànhif(x>2){Checkbox b=(Checkbox)e.getSource();b.setState(1<0);b.setEnabled(1<0);}
Justin

1
@BrucePierson Bất cứ khi nào bạn nghĩ, Điều này có vẻ buồn cười khi nó phải làm với việc sử dụng một đại diện nhân vật của một số đồ họa, tìm kiếm unicode. Ngoài ra, đối với những thứ thiết kế đồ họa, hãy chuyển sang Trải nghiệm người dùng SE : i.stack.imgur.com/xFkzy.png
Justin

7

C ++ 11 / Qt5.2 - 561 481 433 423 369

Vì tại sao không.

Thật đáng kinh ngạc, tính đến thời điểm hiện tại, chúng ta ngắn hơn Python và C # không có lỗi và được gắn với Java!

Tín dụng cho EveBird để cắt giảm từ 561 xuống còn 480.

Và một lần nữa, EveBird rút ngắn nó từ 480 xuống còn 433!

Mất vài phút với kết nối lambda

Xuống 389 với trình khởi tạo C ++ 11

Và 373 không có lớp riêng

Đã xóa một vài khoảng trắng - 369

Golf'd:

#include<QtWidgets>
#define C(x,y,z)z.setEnabled(x.isChecked()+y.isChecked()<2);
#define S(x)l.addWidget(&x);
#define X(x)S(x);x.connect(&x,&QCheckBox::clicked,[&](){C(g,f,c)C(g,c,f)C(f,c,g)});
int main(int n,char**v){QApplication a(n,v);QWidget m;QLabel t{"Select any two"};QCheckBox g{"Good"},f{"Fast"},c{"Cheap"};QVBoxLayout l(&m);S(t)X(g)X(f)X(c)m.show();a.exec();}

Loại không chơi gôn:

#include<QtWidgets>

#define C(x,y,z)z.setEnabled(x.isChecked()+y.isChecked()<2);
#define S(x)l.addWidget(&x);
#define X(x)S(x);connect(&x, &QCheckBox::clicked, [&](){C(g,f,c)C(g,c,f)C(f,c,g)});

int main(int n,char**v){ 
    QApplication a(n,v);
    QWidget m;
    QLabel t{"Select any two"};
    QCheckBox g{"Good"},f{"Fast"},c{"Cheap"};
    QVBoxLayout l(&m);
    S(t)X(g)X(f)X(c)m.show();
    a.exec();
}

GFC


1
+1 cho tự đánh dấu "tại sao không" :)
Bruce Pierson

Có thể cải thiện thêm một chút: thay thế QWidget mbằng QDialog mm.show();a.exec()bằng m.exec().
Toby Speight

6

CoffeeScript - 167, 154

Cổng CoffeeScript của @ Matt câu trả lời 's.

b="input";a="<input type=checkbox>";c=":checked";$("body").html("SELECT ANY TWO#{a}FAST#{a}GOOD#{a}CHEAP").click ->$(b).not(c).attr "disabled",!!$(b+c)[1]

Hơi vô dụng:

b = "input"
a = "<input type=checkbox>"
c = ":checked"

$( "body" ).html( "SELECT ANY TWO#{a}FAST#{a}GOOD#{a}CHEAP" ).click ->
    $( b ).not( c ).attr "disabled", !!$( b + c )[1]

JSFiddle .


5

PHP, Javascript, jQuery - 135b

Tôi đã ngưỡng mộ câu trả lời của @ nderscore, nhưng sau đó tôi quyết định sao chép và một lần lên anh ta.

<?echo"SELECT ANY TWO".($m="<input type=checkbox onclick=(a=$('input:not(:checked)')).prop('disabled',!a[1])>")."FAST$m GOOD$m CHEAP"?>

Về cơ bản, tôi đã thay thế .jointhủ thuật của anh ta bằng một số tiền xử lý siêu văn bản PHP.


Khi bạn xem xét rằng 27 byte được yêu cầu cho "tài nguyên" văn bản trong chương trình, điều này đang tiến rất gần đến chương trình 100b. Làm tốt!
Bruce Pierson

1
Tôi không phải là một tay golf PHP, nhưng tôi đã cắt giảm một vài byte cho bạn: (128)SELECT ANY TWO<?=($m="<input type=checkbox onclick=(a=$('input:not(:checked)')).prop('disabled',!a[1])>").FAST.$m.GOOD.$m.CHEAP;
nderscore

5

Ruby, 219 218 byte

Tôi sử dụng các widget Tk giống như câu trả lời Python 3 của Quincunx.

Chương trình này phá vỡ các quy tắc vì nó có một danh sách hộp kiểm . (Các quy tắc nói: "Không sử dụng danh sách hộp kiểm.") Có, alà một mảng gồm 3 đối tượng TkCheckButton và tôi tin rằng một mảng là một danh sách. Bảo vệ của tôi là tôi đã không sử dụng bất kỳ danh sách hộp kiểm hiện có, nhưng tôi đã sử dụng các hộp kiểm tiêu chuẩn và tạo danh sách của riêng tôi.

require'tk'
o=->(c){c.variable.value>?0}
TkLabel.new{text'SELECT ANY TWO'
pack}
a=%w[FAST CHEAP GOOD].map{|t|TkCheckButton.new{text t
command{a.map{|c|c.state a.count(&o)<2||o[c]?:normal: :disabled}}
pack}}
Tk.mainloop

Đã kiểm tra GIÁ RẺ và TỐT, nhưng NHANH CHÓNG

Tôi đã thử nghiệm với Ruby 2.1.0 và Tk 8.5.15.

  • o[c]là một vị ngữ để kiểm tra nếu nút kiểm tra cđược chọn. Với các chuỗi mặc định, c.variable.value'0'hoặc '1', do đó, so sánh chuỗi chỉ đúng nếu '1'>'0'. EDIT: Tôi đã lưu 1 byte (219 xuống còn 218) bằng cách thay đổi '0'thành ?0. Trong Ruby, ?0là một hằng số ký tự.
  • a.count(&o) sử dụng vị ngữ để đếm các nút kiểm tra đã chọn.
  • Khi người dùng bật nút kiểm tra, lệnh sẽ gọi a.mapvòng lặp cho tất cả các nút, tạo chúng :normalhoặc :disabled.

1
Rất tốt. Không vi phạm quy tắc ở đây - Tôi đã đề cập đến một điều khiển danh sách hộp kiểm có thể xảy ra là một phần của khung ngôn ngữ. Tôi tin rằng tất cả các câu trả lời cho đến nay đều sử dụng một số loại bản đồ hoặc bộ chọn, vì vậy điều này là hoàn toàn hợp pháp.
Bruce Pierson

5

Cảm ơn Rotem và Johnbot đã giúp đỡ chơi golf!

C # 343 334

Câu hỏi này sử dụng cùng một "mánh gian lận" như câu trả lời Java của Quincunx - các hộp kiểm không thực sự bị vô hiệu hóa; họ chỉ không cho phép bạn kiểm tra nếu kiểm tra đó làm 3.

using System.Windows.Forms;using System.Linq;class P:Form{static void Main(){P p=new P();p.Text="SELECT ANY TWO";int y=0;var a=new CheckBox[3];foreach(var n in "FAST CHEAP GOOD".Split()){var c=new CheckBox();a[y]=c;c.Top=y++*50;c.Text=n;c.Validating+=(s,e)=>{if(a.Count(b=>b.Checked)>1)e.Cancel=true;};p.Controls.Add(c);}Application.Run(p);}}

Ngoài ra còn có một lỗi nhỏ mà bạn không thể đóng cửa sổ sau khi chọn hộp kiểm thứ ba trừ khi bạn bỏ chọn, vì xác thực sẽ không vượt qua. Nhưng đây là , vậy ai quan tâm? ;)

C # 403 397 374

Đây là một cái thích hợp thực sự vô hiệu hóa hộp kiểm thứ ba.

using System.Windows.Forms;using System.Linq;class P:CheckBox{static void Main(){var p=new Form{Text="SELECT ANY TWO"};P[]a=null;a="FAST CHEAP GOOD".Split().Select((x,i)=>{var c=new P{Top=i*50,Text=x};c.Click+=(s,e)=>{a.First(b=>!b.Checked).Enabled=a.Count(b=>b.Checked)>1?1<0:a.All(b=>b.Enabled=0<1);};p.Controls.Add(c);return c;}).ToArray();Application.Run(p);}}

Ảnh chụp màn hình

Kinda vô dụng:

using System.Windows.Forms;
using System.Linq;

class P:Form
{
    static void Main()
    {
        P p = new P();
        p.Text = "SELECT ANY TWO";
        int y = 0;
        var a = new CheckBox[3];
        foreach (var n in "FAST CHEAP GOOD".Split())
        {
            var c = new CheckBox(); a[y] = c; c.Top = y++ * 50; c.Text = n; c.Click += (s, e) =>
            {
                if (a.Count(b => b.Checked) == 2)
                {
                    a.First(b => !b.Checked).Enabled = false;
                }
                else
                {
                    foreach (var b in a) b.Enabled = true;
                }
            };
            p.Controls.Add(c);
        }
        Application.Run(p);
    }
}

1
Không thể if(a.Count(b=>b.Checked)==2)e.Cancel=true;được viết lại như e.Cancel=a.Count(b=>b.Checked)==2;?
Rotem

@Rotem Vâng, vâng, nó có thể. Tôi ngốc thật. Và có một tối ưu hóa tương tự cho cái khác. Cảm ơn!
Bob

Đợi, không, không có cho người khác. Eh, vẫn còn lưu một số ký tự.
Bob

1
Nếu bạn chuyển đổi kế thừa sang CheckBox, hãy sử dụng công cụ khởi tạo đối tượng và lạm dụng Linq một chút, bạn có thể nhận được quyền thừa kế xuống còn 374:using System.Windows.Forms;using System.Linq;class P:CheckBox{static void Main(){var p=new Form{Text="SELECT ANY TWO"};P[]a=null;a="FAST CHEAP GOOD".Split().Select((x,i)=>{var c=new P{Top=i*50,Text=x};c.Click+=(s,e)=>{if(a.Count(b=>b.Checked)>1){a.First(b=>!b.Checked).Enabled=1<0;}else a.All(b=>b.Enabled=0<1);};p.Controls.Add(c);return c;}).ToArray();Application.Run(p);}}
Johnbot

1
364 nếu bạn sử dụng toán tử điều kiện thay cho câu lệnh if. Thay thế if(a.Count(b=>b.Checked)>1){a.First(b=>!b.Ch‌​ecked).Enabled=1<0;}else a.All(b=>b.Enabled=0<1);bằnga.First(b=>!b.Checked).Enabled=a.Count(b=>b.Checked)>1?1<0:a.All(b=>b.Enabled=0<1);
Johnbot

5

AngularJS - 214

<input type=checkbox ng-model=fast ng-disabled=cheap&&good>FAST</input>
<input type=checkbox ng-model=cheap ng-disabled=fast&&good>CHEAP</input>
<input type=checkbox ng-model=good ng-disabled=fast&&cheap>GOOD</input>

Tôi đã thử điều này tại JSFiddle, nhưng không thành công . Bạn có thể cung cấp một ví dụ làm việc?
squossish ossifrage


Bạn đã không đề cập đến "ng-app". Kiểm tra <head> trong ví dụ của tôi.
user12345

1
À, OK :-) Bạn có thể đánh gôn xuống một chút bằng cách xóa dấu ngoặc kép và ngắt dòng thêm.
squossish ossifrage

4

JavaScript (với jQuery) - 224 , 222 , 210 , 205 , 178

a="<input type=checkbox>",c=":checked",e="input",f="disabled",d=$("body").html("SELECT ANY TWO"+a+" FAST"+a+"CHEAP"+a+"GOOD").click(function(){$(e).not(c).attr(f,$(e+c).length>1)})

Nhờ một bình luận từ @Matt xuất sắc, tôi đã giảm được 27 ký tự.

Câu đố


Tiết kiệm 25 hoặc hơn bằng cách chuyển điều kiện của bạn $(e+c).length>1vào bài tập như vậy: $(e).not(c).attr(f,$(e+c).length>1)vì bạn chỉ thay đổi chính boolean.
Matt

1
Quản lý để giảm xuống 169 bằng cách sử dụng kết hợp của bạn và của tôi. Sự !!ép buộc và thêm một chút chơi golf mà không gán cơ thể cho d. a="<input type=checkbox>",c=":checked",e="input";$("body").html("SELECT ANY TWO"+a+"FAST"+a+"CHEAP"+a+"GOOD").click(function(){$(e).not(c).attr("disabled",!!$(e+c)[1])})
Matt

4

Toán học

Một phiên bản có nhiều mã hơn theo đề xuất của David, 255 ký tự :

h = Checkbox;
i = Dynamic;
j = Enabled;
t = True;
i[
 If[Total@Boole@{a, b, c} == 2,
  {d, e, f} = {a, b, c},
  {d, e, f} = {t, t, t}
  ];
 Row@{
   "SELECT ANY TWO",
   h[i@a, j -> d], "FAST",
   h[i@b, j -> e], "CHEAP",
   h[i@c, j -> f], "GOOD"
   }
 ]

Bạn có thể lưu một số ký tự bằng cách sử dụng h=Checkbox;i=Dynamic;j=Enabled.
DavidC

@DavidCarraher Cảm ơn, tôi có thể thấy bản thân mình sử dụng kỹ thuật đó cho câu hỏi đánh gôn mã khác trong tương lai.

1
Không cần bao gồm cả hai phiên bản. Và đừng quên sử dụng hvà điều chỉnh số char của bạn trong tiêu đề.
DavidC

4

tập lệnh mIRC ( 727 719 byte)

Quên ngôn ngữ này cho đến khi một cuộc nói chuyện say rượu đêm qua.

alias select_two {
  dialog -m s2 s2
}

dialog s2 {
  title "Select any two:"
  size -1 -1 200 100
  check "Fast",1, 5 10 170 25
  check "Cheap",2, 5 30 170 25
  check "Good",3, 5 50 170 25 
}

on *:dialog:s2:sclick:*: {
  if ($did(s2, $did).state = 1) {
    if ($did = 1) {
      if ($did(s2, 2).state = 1) { did -b s2 3 }
      if ($did(s2, 3).state = 1) { did -b s2 2 }
    }
    if ($did = 2) {
      if ($did(s2, 1).state = 1) { did -b s2 3 }
      if ($did(s2, 3).state = 1) { did -b s2 1 }
    }
    if ($did = 3) {
      if ($did(s2, 1).state = 1) { did -b s2 2 }
      if ($did(s2, 2).state = 1) { did -b s2 1 }
    }
  }
  if ($did(s2, $did).state = 0) {
    did -e s2 1
    did -e s2 2
    did -e s2 3
  }
}

Nhiều hơn nên được mã hóa trong ngôn ngữ này! Nhưng cần phải có một cách để biến điều này thành một mớ hỗn độn thực sự để nó có thể tốt như Perl.

Chỉnh sửa: nhận thấy rằng các Python-isms của tôi bị rò rỉ và có thể giảm mã xuống 8 byte!


Haha, tôi thích phần giới thiệu này. Mặc dù đó là một loại dài dòng - đó có thể là bia nói không? = c)
Bruce Pierson

3

C #, 335 333 326 320 308

Dựa trên Bobs Trả lời, tôi sử dụng ít ký tự hơn anh ta (335 v 342), nhưng tôi có thể không hiểu đầy đủ cách tính số này.

using System.Linq;using System.Windows.Forms;class P:Form{static void Main(){new P();}P(){Text="SELECT ANY TWO";var a="FAST CHEAP GOOD".Split().Select(r=>new CheckBox{Text=r,Top=r[0]%9*20}).ToList();a.All(r=>{r.Validating+=(b,c)=>c.Cancel=a.Count(z=>z.Checked)>1;Controls.Add(r);return 1>0;});ShowDialog();}}

Bị đánh cắp

using System.Linq;
using System.Windows.Forms;

class P : Form
{
    static void Main()
    {
        new P();
    }

    P()
    {
        Text = "SELECT ANY TWO";

        var a = "FAST CHEAP GOOD".Split().Select(r => new CheckBox
        {
            Text = r,
            Top = r[0] % 9 * 20
        }).ToList();

        //loops, I dont need no stinking loops
        a.All(r => { r.Validating += (b, c) => c.Cancel = a.Count(z => z.Checked) > 1; Controls.Add(r); return 1 > 0; });
        ShowDialog();
    }
}

Sử dụng tuyệt vời các chức năng anon và Linq ở đây, đặc biệt là như Select.
Bruce Pierson

Bạn có thể lưu thêm một vài ký tự bằng cách thay thế ==2bằng a >1truebằng a 1>0. Bạn cũng có thể sử dụng Allthay thế WhereLast. ToListcũng ngắn hơn ToArray.
Bob

@Bob Cuộc gọi tốt, không biết làm thế nào tôi đã bỏ lỡ Tất cả () và như một phần thưởng, hóa ra với Tất cả bạn không phải thực hiện nó, tiết kiệm hơn nữa
iamkrillin

3

Groovy - 357 221 217 ký tự

Tôi đã chuyển giải pháp của Quincunx sang Groovy 2.2.1, bằng cách sử dụng SwingBuilder (và làm cho nó trở nên Groovier hơn nữa):

c=[];new groovy.swing.SwingBuilder().frame(){panel(){label("SELECT ANY TWO");f={if(c.count{it.isSelected()}>2)it.source.setSelected(1<0)};["FAST","CHEAP","GOOD"].each{c<<checkBox(label:it,itemStateChanged:f)}}}.show()

Ung dung:

c=[]
new groovy.swing.SwingBuilder().frame() {
    panel() {
        label("SELECT ANY TWO")
        f = { if (c.count{it.isSelected()} > 2) it.source.setSelected(1<0) }
        ["FAST","CHEAP","GOOD"].each { c << checkBox(label: it, itemStateChanged: f) }
    }
}.show()

3

QML - 369 315 254 251 248 byte

Ở đây có phiên bản QML (QtQuick 2.0), chỉ được cung cấp nội dung tệp .qml. Mã này yêu cầu Qt 5.1 ít nhất để chạy. Không phải là một vấn đề lớn vì nó rất lớn so với các giải pháp khác ( 248 byte ), nhưng đó là một ứng dụng đa nền tảng đầy đủ tính năng (bao gồm cả Android và iOs)! :CƯỜI MỞ MIỆNG

    import QtQuick 2.0;import QtQuick.Controls 1.1;Row{Text{text:"SELECT ANY TWO"}CheckBox{id:a;text:"FAST";enabled:!b.checked|!c.checked}CheckBox{id:b;text:"CHEAP";enabled:!a.checked|!c.checked}CheckBox{id:c;text:"GOOD";enabled:!b.checked|!a.checked}}

Hộp thoại bố trí ngang

Để chạy nó, hãy lưu mã vào tệp .qml, cài đặt Qt 5.1 và chạy qmlscene.exe (hoặc chỉ qmlscene trên linux), sẽ hiển thị hộp thoại mở tệp. Chọn tệp .qml bạn đã lưu mã và xem kết quả tuyệt vời! :CƯỜI MỞ MIỆNG


3

k3 - 95

a[`FAST`CHEAP`GOOD]:0
a[.;`c]:`check
a..l:"SELECT ANY TWO"
a..t:"if[3=+/a[];.[_v;_i;:;0]]"
`show$`a

mã ở đây

chạy mẫu
(nguồn: nsl.com )


dòng 1: một từ điển có ba biến; dòng 2: mỗi biến là một nút chọn; dòng 3: nhãn từ điển; dòng 4: nếu ba biến đã được kiểm tra, đặt lại biến cuối cùng được chọn thành 0; dòng 5: hiển thị từ điển.
Stevan Apter

Đẹp! Một thảm kịch k4 như vậy không có GUI ...
mollmerx

k thắng (nhưng thật trớ trêu! Cần thêm 9 ký tự để đăng!)
Stevan Apter

2

JavaScript / jQuery 237 234 229

Cách tiếp cận rất giống với câu trả lời của Matt , mặc dù lâu hơn một chút.

$(function(){var e="input ",t="disabled",n,r;$("body").html("SELECT ANY TWO|FAST|CHEAP|GOOD".replace(/\|/g,"<"+e+'type="checkbox">'));n=$(e);n.change(function(){n.removeAttr(t);r=$(":checked");if(r.length>1)n.not(r).attr(t,t)})})

2

JavaScript 209 (là 346)

Rút gọn: cảm ơn cho ý kiến.

function f(){var a=document.getElementsByClassName("x"),n=0,i=0;for(i in a){if(a[i].checked)n++;}if(n<2){for(i in a){a[i].disabled=false;}}else{for(i in a){i(false===a[i].checked){a[i].disabled=true;break;}}}}

Chức năng đánh gôn:

function f(a,b,c){
var x=document.getElementById(a);
var y=document.getElementById(b);
var z=document.getElementById(c);
var n=0,i=0;
var a=[x,y,z];
for(i in a)
{
if(a[i].checked) n++;
}
if(n<2)
{
for(i in a)
{
a[i].disabled=false;
}
}
else
{
for(i in a)
{
if(false===a[i].checked)
{
a[i].disabled=true;
break;
}
}
}
}

Biểu mẫu HTML: cung cấp đầu vào và gọi hàm. * Biểu mẫu hiện sử dụng lớp = x để nhập nhóm.

<form>
        SELECT ANY TWO<br>
        FAST <input id="a" type="checkbox" class="x" value="0" onchange="f()"><br>
        CHEAP <input id="b" type="checkbox" class="x" value="1" onchange="f()"><br>
        GOOD <input id="c" type="checkbox" class="x" value="2" onchange="f()"><br>
    </form>

Đã thử nghiệm với NetBeans và Chrome.


Bạn có thể chơi golf chức năng hơn nữa và giảm xuống còn 264 ký tự bằng cách hợp nhất tất cả các vars của bạn , loại bỏ các dấu ngoặc và khoảng trắng không cần thiết (bao gồm cả ký tự dòng mới). Bạn có thể có thể làm cho nó nhỏ hơn nếu bạn sử dụng lambda ES6.
Tony Ellis

Ngoài một số môn đánh gôn rõ ràng hơn, hãy xem xét sử dụng một lớp để kéo tất cả các phần tử đầu vào thành một mảng trong một lần nhấn, thay vào đó bằng cách sử dụng getElementsByClassName. a=document.getElementsByClassName('q').
Matt

thay đổi id tên và chỉ cần gọi chúng với document.a, document.c, document.ccũng đặt chúng trực tiếp vào một []
Frieder

2

Groovy

Dựa trên phiên bản Java, nhưng đã giảm xuống rất nhiều;)

Các loại đã được thay thế bằng 'def', dấu chấm phẩy bị xóa, thêm thay thế bằng <<, 1 <0 được thay thế bằng 0, thu thập để tạo các hộp kiểm, loại bỏ loại vật phẩm, loại bỏ việc chọn hộp kiểm, tăng cường các vòng lặp.

import java.awt.*
class F {
    def static main(a) {
        def f = new Frame()
        def p = new Panel()
        f << p
        p << new Label("SELECT ANY TWO")
        def c = ['FAST','CHECK','GOOD'].collect { new Checkbox(it) }
        c.each { b ->
            p << b
            b.addItemListener { e->
                int x = 0, i = 0
                3.times {
                    x += c[it].state ? 1 : 0
                }
                if (x > 2) {
                    e.source.state = 0                        
                }
            }
        }
        f.show()
    }
}

Groovy không phải là java. Điều đó có nghĩa là tất cả những cải tiến đó không được tính là nhiều. Tất cả mọi thứ bạn loại bỏ là cần thiết trong java, nhưng không hấp dẫn.
Justin

1
Bạn nói đúng, Groovy không phải là Java, đó là lý do tại sao nó được gọi là Groovy. Tôi không chắc những gì bạn đang cố gắng nói ở đây.
Erik Pragt

1

TCL 347

Ít nhất là nó đánh bại Python và Java.

set d .
proc a v {upvar f f c c g g d d $v x
if $x&&$f+$c+$g==2 {set d .$f$c$g
$d configure -state disabled} 
if !$x {$d configure -state normal}}
set z -variable
set y -command
set x checkbutton
label .l -text {SELECT ANY TWO}
$x .011 -text FAST $z f $y a\ f
$x .101 -text CHEAP $z c $y a\ c
$x .110 -text GOOD $z g $y a\ g
pack .l .011 .101 .110

Lưu ý: nếu bạn bắt đầu bằng cách chọn một hộp kiểm và bỏ chọn ngay lập tức, bạn sẽ gặp lỗi. Bạn có thể sửa nó bằng cách thêm 110vào cuối dòng đầu tiên.

Ung dung:

# Keep track of the last disabled button. Set it to something valid to start with.
set last .110

proc toggled name {
        # Access some globals
        upvar fast  fast
        upvar cheap cheap
        upvar good  good
        upvar last  last
        upvar $name value

        # Just toggled one on, check if exactly two are now on
        if {$value == 1 && ($fast + $cheap + $good) == 2} {
                set last .$fast$cheap$good
                $last configure -state disabled
        }
        # Just toggled one off. Re-enable disabled one.
        if {$value == 0} {
                $last configure -state normal
        }
}

label .label -text {SELECT ANY TWO}

checkbutton .011 -text FAST  -variable fast  -command {toggled fast}
checkbutton .101 -text CHEAP -variable cheap -command {toggled cheap}
checkbutton .110 -text GOOD  -variable good  -command {toggled good}

pack .label .011 .101 .110

1

Javascript + Knockout: ~ 250 ký tự

a=function(i){return "<input type=checkbox data-bind='value: "+i+", checked: x, disable: x().length>=2 && x().indexOf(\""+i+"\")==-1'>"},document.body.innerHTML = "SELECT ANY TWO"+a(0)+"Fast"+a(1)+"Good"+a(2)+"Cheap"; ko.applyBindings({x:ko.observableArray([])})

0

AngularJS - 155 ( Bản trình diễn )

SELECT ANY TWO :<i ng-init=t=[]><p ng-repeat="(i,v) in ['FAST','CHEAP','GOOD']"><input type=checkbox ng-disabled=t[(i+1)%3]&&t[(i+2)%3] ng-model=t[i]>{{v}}

Phiên bản chưa được chỉnh sửa:

SELECT ANY TWO :
<i ng-init="checkedArray = []" /> <!-- A useless tag to initialize the array (which can't be done on the `input` tag, unfortunately) -->
<p ng-repeat="(key, value) in ['FAST', 'CHEAP', 'GOOD']">
    <input
        type="checkbox"
        ng-model="checkedArray[key]"
        ng-disabled="checkedArray[(key + 1) % 3] && checkedArray[(key + 2) % 3]"
    />
    {{value}}
</p>

0

Ruby với Giày, 133 ký tự

Shoes.app{para'SELECT ANY TWO'
$o=%w{FAST GOOD CHEAP}.map{|q|c=check{|c|$o[c]=!$o[c];$o.values.all?&&c.checked=p}
para q
[c,p]}.to_h}

Đầu ra mẫu:

Ảnh chụp màn hình cửa sổ giày


0

AppleScript, 194 190 Byte (khá chắc chắn rằng điều này là gian lận một chút ...)

Hai vấn đề tồn tại:

  • Không có hộp kiểm trong AppleScript, chỉ có danh sách.
  • Chỉ có tùy chọn để chọn MỘT từ danh sách hoặc MỌI số tiền.

Hoàn cảnh:

  • Sử dụng vòng lặp lặp vô hạn có điểm dừng để có lối ra khi 2 và chỉ có 2, các mục trong danh sách được chọn.
  • Trừng phạt bản thân với một display alertthành phần giúp tôi có thêm 30 byte chiều dài.

Lý do đằng sau tôi đăng bài này:

  • Đây cách để làm điều này trong AppleScript.
  • Mã không thể hoàn thành với ba tùy chọn được chọn, vì vậy tùy chọn thứ ba được bỏ chọn bởi tiện ích mở rộng .

Chủ yếu đăng bài này để thể hiện sức mạnh của AppleScript trong tương tác Aqua / GUI.

nói lại
chọn từ danh sách {"NHANH CHÓNG", "GIÁ RẺ", "TỐT"} với lời nhắc "CHỌN MỌI HAI" với nhiều lựa chọn được cho phép
nếu kết quả là số của vật phẩm <= 2
thoát lặp lại
khác
hiển thị cảnh báo "XIN HAI PICK"
kết thúc
kết thúc

thực thi gif

Nếu bạn tin rằng điều này là quá tắt, xin vui lòng yêu cầu tôi xóa.


Điều này thật hoang dã! Đó là ngôn ngữ giống tiếng Anh nhất mà tôi từng thấy.
Bruce Pierson

Thật tệ khi họ không có thứ gì đó như "với 2 lựa chọn bắt buộc" hoặc thứ gì đó dọc theo những dòng đó.
Bruce Pierson

@BrucePierson Vâng, AppleScript là một ngôn ngữ kỳ lạ. ¯ \ _ () _ / Tôi chỉ sử dụng nó cho những thứ nhỏ nhặt, thật khó để có được bất cứ điều gì thực sự được thực hiện với nó.
Addison Crump

Những điều này không được đánh dấu, làm cho câu trả lời này "quá tắt" từ các quy tắc. Tôi yêu cầu bạn xóa.
pppery

0

FLTK, 303 ký tự

decl{int c;}Function{}{}{Fl_Window{}{xywh {9 9 195 195}}{Fl_Pack{}{label{SELECT ANY TWO}}{Fl_Check_Button{}{callback{e(o);}label FAST}Fl_Check_Button{}{callback{e(o);}label GOOD}Fl_Check_Button{}{callback{e(o);}label CHEAP}}}}Function{e(Fl_Button*o)}{}{code{if((c+=o->value()*2-1)>2){o->value(0);c--;}}}

Ung dung:

decl { int c; }

Function {} {} {
    Fl_Window {} {
        xywh {9 9 195 195}
    } {
        Fl_Pack {} {
            label {SELECT ANY TWO}
        } {
            Fl_Check_Button {} {
                callback { e(o); }
                label FAST
            }
            Fl_Check_Button {} {
                callback { e(o); }
                label GOOD
            }
            Fl_Check_Button {} {
                callback { e(o); }
                label CHEAP
            }
        }
    }
}

Function { e(Fl_Button* o) } {} {
    code {
        if ((c += o->value() * 2 - 1) > 2) {
            o->value(0);
            c--;
        }
    }
}

Đầu ra mẫu:

Ảnh chụp màn hình cửa sổ FLTK

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.