รวดเร็วถูกและดี - เลือกสองแบบ


43

ในฐานะโปรแกรมเมอร์เราทุกคนรู้ว่า: "คุณสามารถทำให้มันเร็วและดี แต่มันจะไม่ถูกคุณสามารถทำให้มันถูกและดี แต่มันจะไม่เร็วหรือคุณสามารถทำได้เร็วและราคาถูก แต่มันจะไม่ดีเลย "

สำหรับความท้าทายนี้คุณกำลังใช้เครื่องมือกำหนดค่าจินตภาพสำหรับบริการการเขียนโปรแกรมแบบกำหนดเองของคุณ คุณควรแสดงกล่องกาเครื่องหมายสามชุดโดยมีหัวเรื่องเป็น "SELECT ANY TWO":

SELECT ANY TWO  
☐ FAST  
☐ CHEAP  
☐ GOOD

เมื่อเลือกสองรายการแล้วรายการที่สามจะต้องปิดการใช้งาน เมื่อยกเลิกการเลือกหนึ่งในสองรายการที่เลือกแล้วตัวเลือกทั้งหมดจะต้องเปิดใช้งานอีกครั้ง ใส่อีกวิธีหนึ่งหากเลือกศูนย์หรือหนึ่งรายการรายการทั้งหมดจะยังคงเปิดใช้งานอยู่ แต่หากเลือกสองรายการรายการที่สามจะต้องปิดใช้งาน

ไม่อนุญาตการควบคุมพิเศษ กล่องกาเครื่องหมายควรเป็นกล่องกาเครื่องหมายมาตรฐานในภาษาที่คุณเลือก ตัวอย่างเช่นอย่าใช้การควบคุม "CheckBoxList" หากภาษาของคุณมีตัวควบคุม ฉันจินตนาการว่ารายการส่วนใหญ่จะเป็น HTML / jQuery แต่นั่นไม่ใช่กฎ นี่คือรหัสกอล์ฟที่กำลังมองหารายการที่สั้นที่สุด

ผู้ชนะดังนั้นไกล

ฉันจะแบ่งมันออกเป็นหมวดหมู่ มีผู้ชนะที่ชัดเจนบางส่วน:

jQuery: ขีดเส้นใต้Mr. Tenacityต่ำกว่า 100b เมื่อคุณแยกข้อความ "ทรัพยากร" ออก การกล่าวถึงผู้มีเกียรติควรไปที่ Matt เพื่อแนะนำแนวคิด jQuery ที่หลายคนได้รับแรงบันดาลใจมาจาก

Dyalog APL: marinus, aka Mr. Unicodeคุณพิมพ์ทุกสิ่งเหล่านี้อย่างไร? ฉันเห็นว่าทำไมคุณถึงต้องการเขียนโปรแกรมสั้น ๆ

PHP: SuperScriptฉันเชื่อว่านี่เป็นรายการที่สั้นที่สุดที่ปิดการใช้งานจริงมากกว่ายกเลิกการเลือกตัวเลือกที่สามตามการตีความที่เข้มงวดที่สุดของกฎ


ฉันสามารถทำได้เพียงเพื่อให้สามารถเลือกได้ครั้งละสองรายการเท่านั้น ดังนั้นการเลือกตัวที่สามยกเลิกการเลือกอันใดอันหนึ่ง? หรืออาจเพิ่มปุ่มยอมรับที่เป็นสีเทาหากเลือก 3 ตัวเลือก?
Justin

7
@Quincunx - เนื่องจากไม่มีฮิวริสติก (นอกการอ่านใจ) ที่สามารถตัดสินใจได้ว่าจะเลือกใครจึงทำให้ผู้ใช้สับสน ... ดังนั้นฉันจะต้องบอกว่าไม่เพราะเราไม่ต้องการความประทับใจแรกของ บริการซอฟต์แวร์ที่กำหนดเองของเราจะไม่ดี ;)
Bruce Pierson

คำถามนี้สนใจฉันใน tkinter ของ Python 3 ดังนั้นฉันพยายามที่จะเรียนรู้ว่าตอนนี้ IMO วิธีที่ดีที่สุดในการเรียนรู้ GUI คือการลองผิดลองถูก ฉันพยายามนี้: ideone.com/YHLZIQ ผลลัพธ์: การเปิด GUI ใหม่อย่างรวดเร็ว ฉันต้องเปิดตัวจัดการงานเพื่อปิด :-) รูปภาพ (จำนวนเพิ่มขึ้นเร็ว ๆ นี้เป็น 340: i.stack.imgur.com/c9wQi.png )
Justin

การประกวดโบนัสควรเป็นคำถามอื่นเนื่องจากไม่มีเกณฑ์การชนะหลักอย่างมีวัตถุประสงค์หรือคำอธิบายใด ๆ ของ "โบนัส" มันบอกว่ารหัสที่ควรจะเป็น "... สง่างามและมีความยืดหยุ่น ..." และ "... กระชับและชัดเจน ..." ซึ่งเป็นการขัดกับรหัสกอล์ฟ VTC ไม่ชัดเจนในสิ่งที่คุณถาม โปรดอย่าเปลี่ยนคำถามอย่างรุนแรงหลังจากคำถามถูกถาม
user80551

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

คำตอบ:


23

Javascript ( ES5 ) กับ jQuery - 143 ( สาธิต )

ฉันปรับเปลี่ยนวิธีการแก้ปัญหาของแมตต์และเล่นกอล์ฟให้ไกลที่สุดเท่าที่จะทำได้:

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

Javascript ( ES5 ) โดยไม่มี jQuery - 185 175 ( สาธิต )

การใช้ jQuery เป็นวิธีการโกงดังนั้นนี่เป็นวิธีแก้ปัญหาที่ไม่มี:

(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]'>"))

หากเราได้รับอนุญาตให้ป้องกันผู้ใช้จากการทำเครื่องหมายในช่องที่ 3 แทนที่จะเป็นการปิดการใช้งานจริงเราสามารถทำให้มันสั้นลงได้:

ด้วย jQuery - 126 123 ( สาธิต )

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

ไม่มี jQuery - 150 147 ( สาธิต )

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

เย็น. การใช้.joinเป็นเคล็ดลับที่ดี!
Robbie Wxyz

1
"SELECT ANY TWO0FAST0GOOD0CHEAP".replace(/0/g,เป็นอีกวิธีที่จะทำให้เกิดความยาวเท่ากัน
ขีดล่าง

เพียงแค่จู้จี้จุกจิกรุ่น jquery ควรใช้เสาไม่ใช่ attr
Einacio

@Einacio ความปรารถนาของคุณคือคำสั่งของฉัน!
ขีดล่าง

5
@Einacio แต่ codegolf เป็นเรื่องเกี่ยวกับการปฏิบัติที่เลวร้ายที่สุด! : P
nderscore

29

JavaScript - 184 169 (พร้อม 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/

แก้ไข: ปรับปรุงด้วยความช่วยเหลือจาก @Daniel Lisik - https://codegolf.stackexchange.com/a/26805/16278


5
ดี! ตัวแทนไม่เพียงพอที่จะโหวต ... แต่คุณได้รับการว่าจ้าง!
Bruce Pierson

2
ยิ่งฉันมองสิ่งนี้มากเท่าไหร่ฉันก็ยิ่งเรียนรู้มากขึ้นเท่านั้น ความฉลาดของการกำหนดตัวแปรภายในตัวเลือก jQuery เด็ดมาก นอกจากนี้คุณช่วยอธิบายว่า "double bang" (!!) กำลังทำอะไรได้บ้าง?
Bruce Pierson

1
ปังเดี่ยว, coerces ค่าบูลีนและสองเท่าจะคว่ำที่ชัดเจน undefinedcoerces เป็นจริง นั่นและการกำหนดตัวแปรอาจเป็นเทคนิคเล็ก ๆ น้อย ๆ ที่ใช้จริงๆ
Matt

รหัสของคุณสามารถลดลงได้ถึง 179 ตัวอักษรเช่นนี้: 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
display-name-is-missing


12

Dyalog APL (บน Windows) (169)

นี้เป็นฟังก์ชั่นแบบคงที่ในการทดสอบถ้าคุณไม่ทราบว่า APL พิมพ์และวางนี้ในหน้าต่างแก้ไขให้ทำงานแล้ว)ed CC

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}

บิตใหม่ของ APL มีคำหลักยาว ฉันยังคงเอาชนะ HTML ได้

คำอธิบาย:

  • 'R'⎕WC'Form' 'Select any two',2/⊂S←2/20: สร้างฟอร์มRที่มีชื่อเลือกที่สอง20 20และขนาดและตำแหน่ง ยังมีร้านค้าใน20 20S
  • 1 21 41{... }¨'Fast' 'Cheap' 'Good': สำหรับแต่ละคู่ของข้อมูลเหล่านี้ (ชื่อและพิกัด y ซึ่งเป็นตัวแปรเดียวที่แตกต่างกันระหว่างช่องทำเครื่องหมาย:
    • ('R.',⊃⍵)⎕WC'Button': สร้างปุ่มภายในRด้วยตัวอักษรตัวแรกของชื่อ
    • ⍵(⍺1)S'Check': ด้วยอาร์กิวเมนต์ที่ถูกต้องเป็นชื่อเรื่อง(left arg, 1)เป็นตำแหน่งนำมาใช้ใหม่Sเป็นขนาดและCheckเป็นสไตล์
    • ('Event' 'Select' 'F')ซึ่งเรียกใช้ฟังก์ชันFเมื่อคลิก
  • B←R.(F C G): ใช้Bเป็นตัวย่อสำหรับช่องทำเครื่องหมายสามช่องที่เราสร้างขึ้น
  • F←{... }: กำหนดฟังก์ชั่นการโทรกลับเป็น:
    • X←B.State: ได้รับรัฐสำหรับแต่ละช่องทำเครื่องหมายและเก็บไว้ในX,
    • X∨2≠+/X: sum X หากไม่เท่ากับสองช่องทำเครื่องหมายทั้งหมดต้องเปิดใช้งานหากเท่ากับสองช่องทำเครื่องหมายที่เลือกไว้เท่านั้นจะต้องเปิดใช้งาน
    • B.Active←: เปิดหรือปิดช่องทำเครื่องหมาย

ผลลัพธ์:

ภาพหน้าจอ


คำอธิบายที่ดีขอบคุณ!
Bruce Pierson

11

Python 3 2, 454 434 ... 393 392 ไบต์

ฉันคิดว่าPython จะต้องสั้นกว่า Java นี่คือ "หลักฐาน" ( แก้ไข:ตอนนี้มันสั้นกว่าจริงๆ ):

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

สำหรับคนที่คุณอยากรู้ว่าexecนิพจน์ทำอะไรมันเรียกใช้สิ่งนี้ (นี่คือสิ่งที่แทนที่ทำกับสตริงบรรทัดใหม่ที่เพิ่มเข้ามาสำหรับการอ่าน):

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

ใช้ตรรกะเดียวกับคำตอบ Java ของฉัน: ยกเลิกการเลือกช่องทำเครื่องหมายถ้ามันทำให้มากกว่า 2 ช่องที่จะเลือก UNF โชคดีแต่น่าเสียดายที่ผมใช้เวลามากขึ้น น้อยไบต์มากขึ้นการทำเช่นนี้

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

การแก้ไข:

  1. การปรับขนาดใหญ่ของรหัสที่จะใช้execช่วยประหยัดมหันต์ 1 ไบต์!
  2. เปลี่ยนเป็น python 2 เพื่อบีบสองไบต์จากexec(ลบวงเล็บ)
  3. กอล์ฟมากขึ้น รวมถึงการเปลี่ยนrange(3)ไป0,1,2และการเปลี่ยนแปลงเยื้องจะมีหนึ่งชั้นของแท็บ ไม่แน่ใจว่า\t\tจะใช้งานได้หรือไม่\t__( _คืออักขระเว้นวรรค) ในที่สุดก็มาถึงคำตอบ Java ที่ยาวที่สุดของฉัน
  4. ใช้แทนที่เคล็ดลับ
  5. ใช้คำแนะนำของ Bakiruและออกไปเล่นกอล์ฟเพิ่มเติม จริงๆแล้วมันสั้นกว่า Java! แต่ตอนนี้คำตอบของจาวาเพิ่มมากขึ้นดังนั้นนี่จึงนานขึ้น :-(
  6. ใช้ปรับปรุงแทนที่เคล็ดลับ
  7. การเปลี่ยนแปลงสำหรับ!=-

แนวทางที่น่าสนใจ +1
cjfaure

ฉันสามารถโกงกับโหมดเทอร์โบบนแป้นพิมพ์ของฉัน ก่อนอื่นฉันตรวจสอบสองกล่อง ประการที่สองฉันใช้ Tab เพื่อเน้นสีที่สาม ตอนนี้ฉันถือ Space Bar ในโหมดเทอร์โบไม่กี่วินาที บางครั้งสิ่งนี้จะตรวจสอบกล่องที่สาม!
kernigh

@ kernigh ฉันเชื่อว่าเป็นเพราะรหัสของฉันไปถึงจุดที่รู้ว่ากล่องถูกเปิดใช้งาน แต่รหัสไม่ถึงจุดที่มีการสลับกล่องอีกครั้ง ดังนั้นหากคุณสลับกล่องในช่วงเวลานั้น (ปิด) รหัสของฉันจะใส่เครื่องหมายถูกลง
Justin

1
คุณสามารถหลีกเลี่ยงบล็อกเยื้องที่เริ่มต้นด้วยif p[i]การใช้andแทน:if if p[i]:s>1 and B[i].toggle();s+=1
Bakuriu

@ kernigh ฉันผิด แทนที่B[i].toggle()ด้วยB[i].deselect()จะไม่เปลี่ยนแปลงอะไรเลย ฉันไม่รู้ว่าทำไมถึงเป็นเช่นนั้น บางทีมันอาจจะเป็นข้อบกพร่องด้วยtkinter
Justin

10

Rebol, 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]]

Ungolfed:

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]
]

นี่คือภาษาถิ่น Rebol 3 View (r3-gui) Screendump ด้านล่างจาก Ubuntu Linux:

ตัวอย่างของ rebol 3 view

อัปเดต - ขอบคุณ Earl & Graham จาก Rebol SO Chatroom สำหรับการโกนโค้ด 22 ตัวอักษร - http://chat.stackoverflow.com/transcript/message/16345039#16345039


มันเป็นคำตอบที่ไม่ถูกต้องเนื่องจากบุคคลที่สามถูกปิดใช้งาน แต่ยังตรวจสอบด้วยนั่นหมายความว่าทั้ง 3 คนได้รับการตรวจสอบดังนั้นโปรดแก้ไข
ST3

2
@ ST3 - คุณไม่ถูกต้องฉันกลัว ช่องทำเครื่องหมาย "GOOD" ไม่ได้ถูกทำเครื่องหมายหรือไม่ได้ใช้งานจริง นี่คือวิธีที่มุมมอง Rebol 3 แสดงกล่องที่ไม่ถูกตรวจสอบ (โดยค่าเริ่มต้น)
draegtun

1
@ ST3 et al - นี่คือลิงค์แสดงช่องทำเครื่องหมายเริ่มต้นที่ฉันได้อธิบายไว้ข้างต้น (ภาพที่ 1 แสดงให้เห็นว่าไม่มีการคลิกที่ช่องทำเครื่องหมายที่สองเพียงแค่ "ดี") - plus.google.com/u/0/104216037702741908932/posts/Z2EbuQX67aq
draegtun

ดี ... ฉันมองไปที่หน้าจอการพิมพ์ที่คุณเพิ่มและฉันเห็นช่องทำเครื่องหมายทั้งสามที่เลือกเพียงอันเดียวไม่สามารถยกเลิกการเลือกได้
ST3

3
@ ST3 - ช่องทำเครื่องหมายเป็นสีเทาเป็นเพียง Rebol 3 ดูวิธีแสดงว่าเป็นช่องทำเครื่องหมายที่สามารถตรวจสอบได้ เห็บกลายเป็นสีเขียวเมื่อทำเครื่องหมายและเปลี่ยนกลับเป็นสีเทาเมื่อไม่ได้ทำเครื่องหมาย นี่คือค่าเริ่มต้น ในภาพจากคำตอบข้างต้นคุณจะเห็นว่า "ดี" เป็นโฟกัสเข้า (เบลอสีน้ำเงิน) เพราะมันเป็น "คลิก" แต่มันยังคงเป็นสีเทาและไม่ใช่สีเขียว (ดังนั้นจึงไม่ได้ตรวจสอบ)
draegtun

10

Java, 421 ... 369 351 ไบต์

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 ... เพราะ Java โค้ดที่ดูดีกว่า:

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

ตัวอย่างการรัน (ขนาดต่างกันของหน้าต่างสิ่งแรกคือเมื่อเริ่มต้น):

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

ช่องทำเครื่องหมายถูกจัดเรียงในแนวนอน นี้ได้รับอนุญาต มันจะใช้เวลามากขึ้นในการจัดตำแหน่งอย่างถูกต้อง นอกจากนี้ฉันยังปิดใช้งานโดยยกเลิกการทำเครื่องหมายที่กล่องเมื่อมีการคลิกไม่ใช่ด้วยการทำให้เป็นไปไม่ได้ที่จะคลิก

การแก้ไข:

  1. บันทึก 3 Checkboxไบต์โดยการทำให้ระดับหลักขยาย
  2. อ่านแลมบ์ดานิพจน์อีกครั้งและทราบว่าชื่อประเภทไม่จำเป็น ใช้ Python นั้น!
  3. แปลงwhileลูปเป็นลูป foreach (ขอบคุณลี ); ทำไมฉันไม่คิดอย่างนั้นมาก่อน
  4. บันทึก 18 ไบต์โดยใช้ระดับที่ไม่ระบุชื่อและ initalizer อินสแตนซ์ทั้งในและFramePanel

ไม่มีข้อ จำกัด ในการจัดตำแหน่ง (ดังนั้นฉันคิดว่า Matt สามารถลดเขาลงได้ 5 ตัวอักษร) อุปกรณ์ประกอบฉากสำหรับโปรแกรมที่ทำงานอย่างสมบูรณ์ ... แต่ฉันไม่เห็นว่าตัวเลือกที่สามถูกปิดใช้งาน
Bruce Pierson

@BrucePierson มันถูกปิดการใช้งาน ไม่สามารถคลิกได้ หากมีการคลิกจะไม่มีอะไรเกิดขึ้น
Justin

2
อาฉันคิดว่าฉันเห็น คุณกำลัง "ยกเลิกการตั้งค่า" สถานะที่ตรวจสอบทันทีโดยไม่ต้องปิดใช้งานหรือไม่ นั่นจะเป็นที่ยอมรับ
Bruce Pierson

@BrucePierson ถูกต้อง หากต้องการปิดใช้งานจริงฉันต้องเปลี่ยนif(x>2)((Checkbox)e.getSource()).setState(1<0);เป็นif(x>2){Checkbox b=(Checkbox)e.getSource();b.setState(1<0);b.setEnabled(1<0);}
Justin

1
@BrucePierson เมื่อใดก็ตามที่คุณคิดว่ามันดูตลกเมื่อมันเกี่ยวข้องกับการใช้การแสดงตัวอักษรของสิ่งกราฟิกให้มองหายูนิโค้ด อีกทางเลือกหนึ่งสำหรับสิ่งที่ออกแบบกราฟิกหันไปใช้ประสบการณ์ผู้ใช้ SE : i.stack.imgur.com/xFkzy.png
Justin

7

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

เพราะเหตุใด

อย่างน่าตกใจ ณ ตอนนี้เราสั้นกว่า Python และ non-buggy C # และผูกติดกับ Java!

มอบเครดิตให้ EveBird สำหรับการลดจาก 561 ถึง 481

และอีกหนึ่งวัน EveBird สั้นลงจาก 481 เป็น 433!

เอาไม่กี่ออกด้วยการเชื่อมต่อแลมบ์ดา

ลงไปที่ 389 ด้วย initializer C ++ 11

และ 373 โดยไม่ต้องแยกชั้น

ลบช่องว่างบางส่วน - 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();}

ประเภทของ Un-Golfed:

#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 สำหรับการตั้งค่าสถานะตนเองว่า "ทำไมไม่" :)
Bruce Pierson

สามารถปรับปรุงอีกเล็กน้อย: แทนที่QWidget mด้วยQDialog mและมีm.show();a.exec() m.exec()
Toby Speight

6

CoffeeScript - 167, 154

พอร์ต CoffeeScript ของคำตอบของ@Matt

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]

ค่อนข้าง ungolfed:

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

ฉันชื่นชมคำตอบของ @ nderscore แต่หลังจากนั้นฉันตัดสินใจคัดลอกและนำเข้า

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

โดยทั่วไปฉันแทนที่.joinเคล็ดลับของเขาด้วย PHP Hypertext Preprocessing


เมื่อคุณพิจารณาว่าจำเป็นต้องใช้ 27 ไบต์สำหรับข้อความ "ทรัพยากร" ในโปรแกรมสิ่งนี้กำลังเข้าใกล้โปรแกรม 100b ทำได้ดี!
Bruce Pierson

1
ฉันไม่ได้เป็นนักกอล์ฟ PHP มากนัก แต่ฉันตัดให้คุณไม่กี่ไบต์: (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 ไบต์

ฉันใช้วิดเจ็ต Tk เดียวกับPython 3 คำตอบโดย Quincunx

โปรแกรมนี้จะแบ่งกฎเพราะมีรายการกล่องกา (กฎกล่าวว่า "อย่าใช้รายการกล่องกาเครื่องหมาย") ใช่aเป็นอาร์เรย์ของวัตถุ TkCheckButton 3 ชุดและฉันเชื่อว่าอาร์เรย์เป็นรายการ การป้องกันของฉันคือฉันไม่ได้ใช้กล่องกาเครื่องหมายใด ๆ ที่มีอยู่ แต่ฉันใช้กล่องกาเครื่องหมายมาตรฐานและสร้างรายการของฉันเอง

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

ตรวจสอบราคาถูกและดี แต่ปิดใช้งาน FAST

ฉันทดสอบกับ Ruby 2.1.0 และ Tk 8.5.15

  • o[c]เป็นเพรดิเคตเพื่อทดสอบว่าเลือกปุ่มcเลือกหรือไม่ กับสตริงเริ่มต้นc.variable.valueเป็น'0'หรือเพื่อเปรียบเทียบสตริงเป็นจริงเฉพาะในกรณีที่'1' '1'>'0'แก้ไข: ฉันบันทึก 1 ไบต์ (219 ลงไปที่ 218) โดยการเปลี่ยนไป'0' ?0ใน Ruby ?0เป็นค่าคงที่ตัวละคร
  • a.count(&o) ใช้เพรดิเคตเพื่อนับปุ่มเลือก
  • เมื่อผู้ใช้สลับปุ่มตรวจสอบคำสั่งเรียกa.mapห่วงสำหรับปุ่มทั้งหมดทำให้พวกเขาหรือ:normal:disabled

1
ดีมาก. ไม่มีการแบ่งกฎที่นี่ - ฉันอ้างถึงตัวควบคุมกล่องรายการที่อาจเกิดขึ้นเป็นส่วนหนึ่งของกรอบงานภาษา ฉันเชื่อว่าคำตอบทั้งหมดใช้แผนที่หรือตัวเลือกบางประเภทดังนั้นนี่เป็นสิ่งที่ถูกต้องทั้งหมด
Bruce Pierson

5

ขอบคุณ Rotem และ Johnbot สำหรับความช่วยเหลือด้านการเล่นกอล์ฟ!

C # 343 334

อันนี้ใช้คำว่า "cheat" เดียวกันกับคำตอบ Javaของ Quincunx - ช่องทำเครื่องหมายไม่ได้ปิดใช้งานจริง พวกเขาแค่ไม่อนุญาตให้คุณตรวจสอบพวกเขาหากการตรวจสอบนั้นทำให้ 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);}}

นอกจากนี้ยังมีข้อผิดพลาดเล็กน้อยที่คุณไม่สามารถปิดหน้าต่างหลังจากเลือกช่องทำเครื่องหมายที่สามยกเว้นว่าคุณยกเลิกการเลือกเนื่องจากการตรวจสอบจะไม่ผ่าน แต่นี่คือดังนั้นใครจะสน? ;)

C # 403 397 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)=>{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);}}

ภาพหน้าจอ

ค่อนข้างไม่ดีเลย:

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
ไม่สามารถif(a.Count(b=>b.Checked)==2)e.Cancel=true;เขียนใหม่เป็นe.Cancel=a.Count(b=>b.Checked)==2;?
Rotem

@Remem ใช่ใช่มันทำได้ ฉันเป็นใบ้ และมีการเพิ่มประสิทธิภาพที่คล้ายกันสำหรับอีกอันหนึ่ง ขอบคุณ!
Bob

เดี๋ยวก่อนไม่มีอีกแล้ว เอ๊ะยังคงบันทึกบางตัวอักษร
Bob

1
หากคุณเปลี่ยนมรดกเพื่อกล่องกาเครื่องหมาย initializers ใช้วัตถุและละเมิด Linq บิตคุณจะได้รับหนึ่งที่เหมาะสมลงไปที่ 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 ถ้าคุณใช้ตัวดำเนินการแบบมีเงื่อนไขแทนที่คำสั่ง if แทนที่if(a.Count(b=>b.Checked)>1){a.First(b=>!b.Ch‌​ecked).Enabled=1<0;}else a.All(b=>b.Enabled=0<1);ด้วยa.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>

ฉันพยายามนี้ออกที่ JSFiddle แต่ไม่ประสบความสำเร็จใดคุณสามารถให้ตัวอย่างการทำงานได้หรือไม่?
ossifrage คลื่นไส้


คุณไม่ได้พูดถึง "ng-app" ตรวจสอบ <head> ในตัวอย่างของฉัน
user12345

1
อ้าโอเค :-) คุณสามารถตีมันลงได้เล็กน้อยโดยลบเครื่องหมายอัญประกาศ
ossifrage คลื่นไส้

4

JavaScript (พร้อม 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)})

ขอบคุณที่คอมเม้นต์จาก brilliant @Matt ฉันลดรหัสได้ 27 ตัวอักษร

JSFiddle


บันทึก 25 หรือมากกว่านั้นโดยย้ายเงื่อนไขของคุณ$(e+c).length>1ไปที่การมอบหมายเช่นนี้$(e).not(c).attr(f,$(e+c).length>1)เนื่องจากคุณเปลี่ยนบูลีนเองเท่านั้น
Matt

1
ได้รับการจัดการเพื่อลงไปที่ 169 โดยใช้ส่วนผสมของคุณและของฉัน การ!!บีบบังคับและการเล่นกอล์ฟเพิ่มอีกเล็กน้อยโดยไม่กำหนดร่างกายให้กับ 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

มาติกา

รุ่นที่เขียนโค้ดเพิ่มเติมตามที่ David แนะนำ255 ตัวอักษร :

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"
   }
 ]

h=Checkbox;i=Dynamic;j=Enabledคุณสามารถบันทึกตัวอักษรบางอย่างโดยใช้
DavidC

@DavidCarraher ขอบคุณฉันสามารถเห็นตัวเองโดยใช้เทคนิคสำหรับคำถามการเล่นกอล์ฟรหัสอื่น ๆ ในอนาคตเช่นกัน

1
ไม่จำเป็นต้องรวมทั้งสองเวอร์ชัน และอย่าลืมที่จะใช้hและเพื่อปรับจำนวนถ่านของคุณในส่วนหัว
DavidC

4

สคริปต์ mIRC ( 727 719 ไบต์)

ลืมภาษานี้ไปจนกว่าจะมีบทสนทนาเมาเมื่อคืนนี้

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
  }
}

ควรเขียนโค้ดเพิ่มเติมในภาษานี้! แต่จะต้องมีวิธีที่จะทำให้เรื่องนี้เป็นเรื่องยุ่งเหยิงจริงดังนั้นมันจึงเป็นสิ่งที่ดีเท่า Perl

แก้ไข: สังเกตว่า Python-isms ของฉันมีการรั่วไหลและสามารถลดรหัสได้ 8 ไบต์!


ฮ่าฮ่าฉันชอบคำนำของอันนี้ แม้ว่ามันจะเป็น verbose - เบียร์พูดได้มั้ย = c)
Bruce Pierson

3

C #, 335 333 326 320 308

จากคำตอบของ Bobs เหมืองของฉันใช้ตัวละครน้อยกว่า (335 v 342) แต่ฉันอาจไม่เข้าใจวิธีการนับอย่างสมบูรณ์

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

Ungolfed

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

การใช้งานฟังก์ชั่นที่ดีของอานนท์และ Linq Selectที่นี่โดยเฉพาะอย่างยิ่งเช่น
Bruce Pierson

คุณสามารถบันทึกอักขระได้อีกสองสามตัวโดยแทนที่==2ด้วย a >1และtruea 1>0ด้วย นอกจากนี้คุณยังสามารถใช้AllแทนและWhere นอกจากนี้ยังเป็นที่สั้นกว่า LastToListToArray
บ๊อบ

@Bob โทรดีไม่ทราบว่าฉันพลาด All () และโบนัสกลับกลายเป็นว่าคุณไม่ต้องทำให้เป็นจริงประหยัดมากยิ่งขึ้น
iamkrillin

3

Groovy - 357 221 217 ตัวอักษร

ฉันได้พอร์ตโซลูชันของ Quincunxไปยัง Groovy 2.2.1 โดยใช้SwingBuilder (และทำให้ Groovier มากยิ่งขึ้น):

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

Ungolfed:

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 ไบต์

ต่อไปนี้เป็นรุ่น QML (QtQuick 2.0) ที่ให้เฉพาะเนื้อหาไฟล์. qml รหัสนี้ต้องใช้ Qt 5.1 อย่างน้อยจึงจะสามารถทำงานได้ ไม่ใช่เรื่องใหญ่เมื่อเทียบกับโซลูชั่นอื่น ๆ ( 248 ไบต์ ) แต่มันเป็นแอพพลิเคชั่นข้ามแพลตฟอร์มเต็มรูปแบบ (รวมถึง Android และ iOs)! : D

    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}}

ไดอะล็อกเค้าโครงแนวนอน

หากต้องการเรียกใช้ให้บันทึกรหัสเป็นไฟล์. qml ติดตั้ง Qt 5.1 และเรียกใช้ qmlscene.exe (หรือเพียง qmlscene บน linux) ซึ่งจะแสดงกล่องโต้ตอบเปิดไฟล์ เลือกไฟล์. qml ที่คุณบันทึกรหัสไว้และดูผลลัพธ์ที่ยอดเยี่ยม! : D


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

รหัสอยู่ที่นี่

เรียกใช้ตัวอย่าง
(ที่มา: nsl.com )


บรรทัดที่ 1: พจนานุกรมที่มีสามตัวแปร บรรทัดที่ 2: แต่ละตัวแปรคือปุ่มกด บรรทัดที่ 3: ติดป้ายพจนานุกรม บรรทัดที่ 4: หากตรวจสอบสามตัวแปรให้รีเซ็ตตัวแปรสุดท้ายที่ทำเครื่องหมายเป็น 0; บรรทัดที่ 5: แสดงพจนานุกรม
Stevan Apter

ดี! เช่น k4 โศกนาฏกรรมไม่มี GUI ...
mollmerx

k wins (แต่ oh irony! ต้องมีตัวละครเพิ่มอีก 9 ตัวเพื่อโพสต์!)
Stevan Apter

2

JavaScript / jQuery 237 234 229

วิธีการที่คล้ายกันมากเช่นเดียวกับคำตอบของ Mattแม้ว่าจะนานกว่าเล็กน้อย

$(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 (เดิมคือ 346)

สั้นลง: ขอบคุณสำหรับความคิดเห็น

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;}}}}

ฟังก์ชั่น golfed:

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;
}
}
}
}

รูปแบบ HTML: จัดเตรียมอินพุตและเรียกใช้ฟังก์ชัน * แบบฟอร์มนี้ใช้ class = x เพื่ออินพุตกลุ่ม

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

ทดสอบกับ NetBeans และ Chrome


คุณสามารถตีกอล์ฟฟังก์ชั่นเพิ่มเติมและลดเหลือ 264 ตัวอักษรโดยรวมทั้งหมดของคุณvarเอาวงเล็บปีกกาที่ไม่จำเป็นและช่องว่าง (รวมถึงตัวอักษรขึ้นบรรทัดใหม่) คุณอาจทำให้มันเล็กลงถ้าคุณใช้แลมบ์ดา ES6
Tony Ellis

นอกเหนือจากการตีกอล์ฟที่ชัดเจนยิ่งขึ้นแล้วให้พิจารณาใช้คลาสเพื่อดึงองค์ประกอบอินพุตทั้งหมดลงในอาเรย์หนึ่งครั้งแทนการใช้getElementsByClassNameเช่น a=document.getElementsByClassName('q').
Matt

เปลี่ยนรหัสกับชื่อและเพียงแค่เรียกพวกเขาด้วยdocument.a, document.c, document.cนอกจากนี้ยังทำให้พวกเขาโดยตรงลงใน []
Frieder

2

Groovy

ขึ้นอยู่กับรุ่น Java แต่ลดขนาดลงมาก;)

ประเภทที่ถูกแทนที่ด้วย 'def' ลบเครื่องหมายอัฒภาคเพิ่มแทนที่ด้วย <<, 1 <0 แทนที่ด้วย 0 รวบรวมสำหรับการสร้างช่องทำเครื่องหมายลบประเภทรายการเหตุการณ์ลบออกหล่อช่องทำเครื่องหมายเพิ่มลูป

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 ไม่ใช่ java นั่นหมายความว่าการปรับปรุงเหล่านั้นจะไม่นับรวมเท่าที่ควร ทุกสิ่งที่คุณลบออกเป็นสิ่งจำเป็นในภาษาจาวา แต่ไม่จำเป็นต้องมีความมัน
Justin

1
คุณพูดถูกแล้ว Groovy ไม่ใช่ Java นั่นคือสาเหตุที่เรียกว่า Groovy ฉันไม่แน่ใจว่าคุณกำลังพยายามพูดอะไรที่นี่
Erik Pragt

1

ทีซีแอล 347

อย่างน้อยก็เต้น Python และ 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

หมายเหตุ: หากคุณเริ่มต้นด้วยการเลือกช่องทำเครื่องหมายหนึ่งช่องและยกเลิกการเลือกทันทีคุณจะได้รับข้อผิดพลาด คุณสามารถแก้ไขได้โดยเพิ่ม110ไปที่ท้ายบรรทัดแรก

Ungolfed:

# 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 ตัวอักษร

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 ( สาธิต )

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}}

เวอร์ชันที่ไม่ดีงาม:

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

AppleScript, 194 190 ไบต์ (ค่อนข้างแน่ใจว่านี่เป็นการโกง ... )

มีสองปัญหา:

  • ไม่มีช่องทำเครื่องหมายใน AppleScript เฉพาะรายการเท่านั้น
  • มีตัวเลือกให้เลือกหนึ่งรายการจากรายการหรือจำนวนใดก็ได้

Circumventions:

  • ใช้วนซ้ำที่ไม่มีที่สิ้นสุดกับจุดพักเพื่อให้มีการออกเมื่อ 2 และเพียง 2 รายการในรายการจะถูกเลือก
  • ลงโทษตัวเองด้วยdisplay alertส่วนประกอบที่ให้ความยาวเพิ่มอีก 30 ไบต์

เหตุผลที่อยู่เบื้องหลังฉันโพสต์สิ่งนี้:

  • มันเป็นวิธีการทำเช่นนี้ใน AppleScript
  • รหัสไม่สามารถดำเนินการกับสามตัวเลือกที่เลือกเพื่อให้ตัวเลือกที่สามจะถูกยกเลิกโดยส่วนขยาย

ส่วนใหญ่โพสต์สิ่งนี้เพื่อแสดงพลังของ AppleScript ในการโต้ตอบ Aqua / GUI

ทำซ้ำ
เลือกจากรายการ {"FAST", "CHEAP", "GOOD"} พร้อมข้อความ "เลือกได้สองแบบ" ที่มีให้เลือกหลายแบบ
ถ้าจำนวนรายการผลลัพธ์ <= 2
ออกจากการทำซ้ำ
อื่น
การแจ้งเตือนการแสดงผล "โปรดเลือกสอง"
ปลาย
ปลาย

GIF การดำเนินการ

หากคุณเชื่อว่าสิ่งนี้ปิดเกินไปโปรดขอให้ฉันลบ


นี่มันบ้าจัง! นั่นเป็นภาษาที่เหมือนอังกฤษมากที่สุดที่ฉันเคยเห็น
Bruce Pierson

มันแย่เกินไปจริง ๆ ที่พวกเขาไม่มีอะไรแบบ "ต้องมี 2 ตัวเลือก" หรือบางอย่างในสายเหล่านั้น
Bruce Pierson

@BrucePierson ใช่แล้ว AppleScript เป็นภาษาแปลก ๆ ¯ \ _ (ツ) _ / ¯ฉันใช้มันเพื่อสิ่งของเล็ก ๆ เท่านั้นมันค่อนข้างยากที่จะทำสิ่งที่เกิดขึ้นจริงกับมัน
Addison Crump

0

FLTK, 303 ตัวอักษร

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--;}}}

Ungolfed:

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--;
        }
    }
}

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

ภาพหน้าจอหน้าต่าง FLTK

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.