빠르고 저렴하며 좋음-둘 중 하나를 선택하십시오


43

프로그래머로서 우리는 모두 다음과 같은 말을 알고 있습니다. "하지만 좋지 않습니다."

이 문제를 해결하기 위해 사용자 지정 프로그래밍 서비스를위한 가상 구성 도구를 구현하고 있습니다. "두 가지 선택"이라는 제목으로 세 개의 확인란 세트를 렌더링해야합니다.

SELECT ANY TWO  
☐ FAST  
☐ CHEAP  
☐ GOOD

두 항목을 선택한 후에는 세 번째 항목을 비활성화해야합니다. 선택한 두 항목 중 하나를 선택 취소하면 모든 옵션을 다시 활성화해야합니다. 다시 말해, 0 개 또는 하나의 항목을 선택하면 모든 항목이 계속 활성화되지만 두 항목을 선택한 경우 세 번째 항목을 비활성화해야합니다.

특별한 통제는 허용되지 않습니다. 확인란은 선택한 언어의 표준 확인란이어야합니다. 예를 들어, 언어에 "CheckBoxList"컨트롤이 있으면 사용하지 마십시오. 대부분의 항목이 HTML / jQuery가 될 것이라고 생각하지만 이는 규칙이 아닙니다. 이것은 가장 짧은 엔트리를 찾는 코드 골프입니다.

당첨자

카테고리로 분류하겠습니다. 확실한 승자가 있습니다 :

jQuery : nderscore, Mr. Tenacity 텍스트 "resources"를 제외하면 100b 미만입니다. 많은 사람들이 영감을 얻은 jQuery 개념을 소개하기 위해 Matt에게도 언급해야합니다.

Dyalog APL : marinus, aka Mr. Unicode 어떻게 모든 것을 입력합니까? 짧은 프로그램을 작성하려는 이유를 알 수 있습니다.

PHP : SuperScript 나는 이것이 규칙의 가장 엄격한 해석에 따라 세 번째 옵션을 선택 취소하는 대신 실제로 비활성화하는 가장 짧은 항목이라고 생각합니다.


한 번에 두 개만 선택할 수 있도록 만들 수 있습니까? 세 번째를 선택하면 다른 것 중 하나의 선택이 해제됩니까? 또는 3 개의 옵션을 선택한 경우 회색으로 표시되는 수락 버튼을 추가 하시겠습니까?
Justin

7
@Quincunx-선택 해제 할 것을 결정할 수있는 휴리스틱 (마음 읽기 외)이 없기 때문에 사용자를 혼란스럽게 할 것입니다. 우리의 맞춤형 소프트웨어 서비스는 나쁜 것입니다. ;)
Bruce Pierson

이 질문은 Python 3의 tkinter에 관심이 있으므로 지금 배우려고합니다. GUI를 배우는 가장 좋은 방법은 시행 착오입니다. 나는 이것을 시도했다 : ideone.com/YHLZIQ . 결과 : 새로운 GUI가 빠르게 열립니다. 작업 관리자를 열어서 닫아야했습니다. :-). 이미지 (수는 곧 340으로 올라갔습니다 : i.stack.imgur.com/c9wQi.png )
Justin

보너스 컨테스트는 객관적인 주요 우승 기준이나 "보너스"에 대한 설명이 없기 때문에 또 다른 질문입니다. 코드는 "... 우아하고 유연하다 ..."와 "... 간결하고 명확하다 ..."는 code-golf 에 맞지 않아야한다고 말했다 . VTC는 당신이 무엇을 요구하는지 명확하지 않습니다. 질문을받은 후에도 근본적으로 질문을 변경하지 마십시오.
user80551

1
@BrucePierson 실제로는 있습니다. 가장 오래된 선택란을 선택 해제 할 수 있습니다. 그러나 그 코드는 필요한 코드보다 훨씬 많습니다.
Justin

답변:


23

jQuery가 포함 된 Javascript ( ES5 )-143 ( 데모 )

Matt의 솔루션을 수정 하고 가능한 한 멀리 골프를 쳤습니다.

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

자바 스크립트 ( 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]'>"))

사용자가 실제로 필드를 비활성화하는 대신 세 번째 상자를 선택하지 못하게 할 경우 더 짧게 만들 수 있습니다.

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은 좋은 트릭입니다!
로비 Wxyz

1
"SELECT ANY TWO0FAST0GOOD0CHEAP".replace(/0/g,길이가 같은 다른 방법입니다.
nderscore

그냥 까다롭기 때문에, jquery 버전은 attr이 아닌 prop을 사용해야합니다
Einacio

@ Einacio 당신의 소원은 나의 명령입니다!
nderscore

5
@ Einacio 그러나 codegolf는 최악의 방법에 관한 것입니다! :피
nderscore

29

자바 스크립트 - 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 선택기 내의 변수 할당의 영리함. 매우 시원합니다. 또한, "더블 뱅"(!!)이 무엇을하는지 설명 할 수 있습니까?
브루스 피어슨

1
단일 강타는 부울 값을 강제하고 이중은 분명히 그것을 반전시킵니다. undefined진실로 강요하다. 그와 변수 할당은 실제로 사용되는 유일한 작은 트릭입니다.
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 C하고 편집 창에 입력 하여 붙여 넣은 다음 실행하십시오 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}

최신 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: 합계 X, 이것이 두 개와 같지 않으면 모든 확인란이 활성화되어 있어야합니다. 두 개만 선택된 확인란 만 활성화되어 있어야합니다.
    • B.Active←: 확인란을 활성화 또는 비활성화

결과:

screenshot


좋은 설명 감사합니다!
Bruce Pierson

11

파이썬 3 2, 454 434 ... 393 392 바이트

파이썬은 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 답변과 동일한 논리를 사용합니다. 확인란을 두 개 이상 선택하려면 확인란을 선택 취소하십시오. UNF는 다행히 불행하게도, 나는 동안 적은 이 일을 더 바이트.

enter image description here

EDITS :

  1. 사용할 코드의 대규모 조정 exec, 무려 1 바이트 절약!
  2. python 2로 전환하여 exec(제거 괄호) 에서 2 바이트를 짜십시오 .
  3. 더 많은 골프. 변경 포함 range(3)0,1,2와 탭의 한 층을 가지고 들여 쓰기를 변경. () \t\t대신 작동 하는지 확실하지\t___ 공백 문자 임) . 마침내 내 Java 답변이 가장 길었습니다.
  4. 사용 된 트릭 교체
  5. Bakiru의 제안을 사용 하고 더 골프를 쳤다. 실제로 Java보다 짧았습니다! 그러나 이제 Java 답변이 더 골프화되어 다시 길어졌습니다. :-(
  6. 사용되는 트릭을 대체 개선 .
  7. 을 변경 !=A에 대한 -.

재미있는 접근법. +1
cjfaure

키보드의 터보 모드로 속임수를 쓸 수 있습니다. 먼저 두 개의 확인란을 선택합니다. 둘째, Tab을 사용하여 세 번째를 강조 표시합니다. 이제 스페이스 바를 몇 초 동안 터보 모드로 유지합니다. 때때로 이것은 세번째 박스를 체크합니다!
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
저스틴

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

언 골프 드 :

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). Ubuntu Linux에서 아래 스크린 덤프 :

example of rebol 3 view

업데이트 - 코드의 면도 (22 개) 문자에 대한 REBOL SO 채팅방에서 얼 & 그레이엄 덕분에 - http://chat.stackoverflow.com/transcript/message/16345039#16345039


세 번째가 비활성화되었지만 확인 되었기 때문에 잘못된 답변입니다. 즉, 3 개가 모두 확인되었으므로 수정하십시오.
ST3

2
@ ST3-당신이 틀 렸습니다. "GOOD"체크 상자가 체크되어 있지 않거나 실제로 비활성화되어 있습니다 (제 코드는 체크 된 세 번째 상자를 단순히 깜빡입니다). 이것이 Rebol 3보기에 체크되지 않은 상자가 표시되는 방식입니다 (기본적으로).
draegtun

1
@ ST3 등 - 여기에 내가 (더 체크 박스를 클릭하지 첫번째 이미지 쇼, 2 단지 "좋은") 위에 설명한 링크 보여주는 기본 체크 박스의 모습입니다 - plus.google.com/u/0/104216037702741908932/posts/Z2EbuQX67aq
draegtun

글쎄 ... 추가 한 인쇄 화면을 살펴보면 세 개의 확인란이 모두 선택되어 있습니다. 하나만 선택 취소 할 수는 없습니다.
ST3

3
@ ST3-회색으로 표시된 체크 박스는 단지 Rebol 3입니다. 체크 박스가 체크 박스임을 보여주는 방법입니다. 체크하면 체크 표시가 녹색으로 바뀌고 체크 표시가 없으면 회색으로 돌아갑니다. 이것이 기본값입니다. 위의 이미지에서 "GOOD"는 "클릭"되었기 때문에 입력 초점 (파란색 흐림)으로 표시되지만 녹색으로 표시되지 않고 회색으로 유지됩니다 (확인되지 ​​않음).
draegtun

10

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

자바. 왜냐하면 자바 때문이다. 더 멋진 코드 :

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

샘플 실행 (창 크기가 다르며, 처음 시작시) :

enter image description here
enter image description here
enter image description here

체크 박스는 가로로 정렬됩니다. 이것은 허용 됩니다. 제대로 맞추려면 훨씬 더 많은 시간이 걸립니다. 또한 클릭 할 수 없도록하는 것이 아니라 클릭 할 때 확인란의 선택을 취소하여 사용 중지하고 있습니다.

EDITS :

  1. 메인 클래스를 확장하여 3 바이트를 절약했습니다 Checkbox.
  2. Lambda Expressions를 다시 읽고 형식 이름이 필요하지 않다는 것을 깨달았습니다. 그 파이썬을 가져 가라!
  3. while루프를 foreach 루프 로 변환했습니다 ( Lee 덕분에 ). 내가 왜 그렇게 생각하지 않았습니까?
  4. 익명 클래스와 모두를위한 인스턴스 initalizer 사용하여 18 바이트를 저장 FramePanel.

정렬에 제한이 없습니다 (따라서 Matt가 5자를 줄일 수 있다고 가정합니다). 완전한 실행중인 프로그램을 제안합니다 ...하지만 세 번째 옵션이 비활성화되어 있지 않습니다.
브루스 피어슨

@BrucePierson 비활성화되어 있습니다. 클릭 할 수 없습니다. 클릭하면 아무 일도 일어나지 않습니다.
Justin

2
아, 내 생각 엔 비활성화하지 않고 체크 상태를 즉시 "설정 해제"하고 있습니까? 괜찮습니다.
브루스 피어슨

@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 당신이 생각할 때마다, 이것은 그래픽적인 것의 문자 표현을 사용하는 것과 관련이있을 때 웃기게 보입니다 . 유니 코드를 찾으십시오. 또는 그래픽 디자인에 대해서는 User Experience SE : i.stack.imgur.com/xFkzy.png
Justin

7

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

왜 안돼?

놀랍게도 현재 우리는 Python과 버그가없는 C #보다 짧으며 Java와 묶여 있습니다!

이를 561에서 481로 줄인 EveBird의 공로입니다.

그리고 다시 한번 EveBird가 481에서 433으로 줄입니다!

람다 연결로 몇 가지 할인

C ++ 11 이니셜 라이저로 최저 389

별도의 수업이없는 373

몇 개의 공백을 제거했습니다-369

골프 :

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

골퍼가 아닌 종류 :

#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 mQDialog mm.show();a.exec()함께 m.exec().
Toby Speight

6

CoffeeScript- 167, 154

@Matt 의 답변 의 CoffeeScript 포트 .

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]

언 골프 :

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, 자바 스크립트, 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 하이퍼 텍스트 전처리 로 대체했습니다 .


프로그램의 텍스트 "리소스"에 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

루비, 219218 바이트

Quincunx 의 Python 3 답변 과 동일한 Tk 위젯을 사용합니다 .

이 프로그램에는 확인란 목록 이 있으므로 규칙을 위반합니다 . (규칙은 "체크 박스 목록을 사용하지 마십시오."라고 말했습니다. 예, a3 개의 TkCheckButton 객체로 구성된 배열이며 배열은 목록이라고 생각합니다. 내 방어는 기존 확인란을 사용하지 않았지만 표준 확인란을 사용하고 자체 목록을 만들었습니다.

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

CHEAP 및 GOOD가 확인되었지만 FAST가 비활성화 됨

Ruby 2.1.0 및 Tk 8.5.15로 테스트했습니다.

  • o[c]확인 단추 c가 선택되어 있는지 테스트하기위한 술어 입니다. 기본 문자열 인 c.variable.valueis '0'또는 '1'을 사용하면 문자열 비교는 if 인 경우에만 true '1'>'0'입니다. 편집 :로 변경 '0'하여 1 바이트 (219에서 218로)를 저장 했습니다 ?0. 루비에서는 ?0문자 상수입니다.
  • a.count(&o) 술어를 사용하여 선택된 확인 단추를 계산합니다.
  • 사용자가 확인 버튼을 전환하면 명령이 호출 a.map을 만들고, 모든 버튼에 대한 루프 :normal:disabled.

1
아주 좋아요 여기서 규칙을 어 기지 않음- 언어 프레임 워크의 일부가 될 수 있는 선택란 목록 제어 를 언급하고있었습니다 . 나는 지금까지 모든 대답이 일종의지도 또는 선택기를 사용한다고 믿습니다. 그래서 이것은 완전히 합법적입니다.
브루스 피어슨

5

골프를 도와 준 Rotem과 Johnbot에게 감사합니다!

C 번호 343 (334)

이것은 Quincunx의 Java 답변 과 동일한 "속임수"를 사용합니다. 확인란은 실제로 비활성화되어 있지 않습니다. 그 검사로 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

@Rotem 예, 가능합니다. 난 바보 야. 그리고 다른 것에 대해서도 비슷한 최적화가 있습니다. 감사!

아냐, 다른 쪽은 없어 어, 아직도 숯을 구 했어요

1
상속을 CheckBox로 전환하면 객체 이니셜 라이저를 사용하고 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
if 문 대신 조건부 연산자를 사용하는 경우 364입니다. 교체 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에서 시도했지만 성공하지 못했습니다 . 실제 사례를 제시 할 수 있습니까?
squeamish ossifrage


"ng-app"에 대해서는 언급하지 않았습니다. 내 예에서 <head>를 확인하십시오.
user12345

1
Ah, OK :-) 따옴표와 여분의 줄 바꿈을 제거하여 약간 아래로 내릴 수 있습니다 .
squeamish ossifrage

4

자바 스크립트 (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)})

화려한 @Matt의 의견 덕분에 코드를 27 자로 줄였습니다.

JSFiddle


부울 자체 만 변경하므로 조건 $(e+c).length>1을 할당으로 이동하여 25 정도를 절약하십시오 $(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
  }
}

이 언어로 더 많은 것을 코딩해야합니다! 그러나 이것을 펄처럼 좋게 만들 수있는 방법이 필요합니다.

편집 : 내 Python-ism이 누출되어 코드를 8 바이트 줄일 수 있음을 알았습니다!


하하, 나는 이것에 대한 소개를 좋아한다. 그래도 장황합니다-맥주 말하기가 될 수 있습니까? = c)
Bruce Pierson

3

C #을, (335) 333 (326) 320 308

Bobs Answer를 기준으로 내 (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();}}

언 골프

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

특히 Anon 함수와 Linq를 많이 사용합니다 Select.
브루스 피어슨

당신은 대체하여 두 개 이상의 문자를 저장할 수 있습니다 ==2>1하고, trueA를 1>0. 및 All대신에 사용할 수도 있습니다 . 보다 짧습니다 . WhereLastToListToArray

좋은 전화를 @Bob, 나는 모든 () 놓친, 그리고 보너스로, 당신은 더 많은 절약을 실현하지 않아도 모든으로 밝혀 방법을 모른다
iamkrillin

3

그루비 - 357 (221) 217 문자

SwingBuilder를 사용하여 Quincunx의 솔루션 을 Groovy 2.2.1 로 포팅 했습니다 (그리고 더 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()

언 골프 드 :

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 파일 내용 만 제공되는 QML (QtQuick 2.0) 버전으로 이동합니다. 이 코드를 실행하려면 최소한 Qt 5.1이 필요합니다. 다른 솔루션 ( 248 바이트 ) 과 비교할 때 큰 문제는 아니지만 모든 기능을 갖춘 크로스 플랫폼 응용 프로그램입니다 (Android 및 iO 포함)! :디

    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 (또는 Linux에서는 qmlscene)를 실행하면 열린 파일 대화 상자가 표시됩니다. 코드를 저장 한 .qml 파일을 선택하고 멋진 결과를 확인하십시오! :디


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 행 : 변수가 3 개인 사전; 2 행 : 각 변수는 체크 버튼입니다. 3 행 : 사전에 라벨을 붙인다. 4 행 : 3 개의 변수를 확인한 경우 마지막으로 확인 된 변수를 0으로 재설정하십시오. 5 행 : 사전을 보여줍니다.
Stevan Apter

좋은! 그런 비극 k4에는 GUI가 없습니다.
mollmerx

k 승 (하지만 아이러니! 게시하려면 9 명의 캐릭터가 더 필요합니다!)
Stevan Apter

2

자바 스크립트 / 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;}}}}

골프 기능 :

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 양식 : 입력을 제공하고 함수를 호출합니다. * 이제 Form은 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에서 테스트되었습니다.


var불필요한 모든 중괄호와 공백 (줄 바꿈 문자 포함)을 제거 하여 모든 기능을 통합하여 기능을 더 골프화하고 264 자로 줄일 수 있습니다 . ES6 람다를 사용하면 더 작아 질 수 있습니다.
Tony Ellis

좀 더 명백한 골프와는 별도로 클래스를 사용하여 모든 입력 요소를 getElementsByClassName예 를 들어 한 번의 히트로 배열로 가져 오는 것을 고려하십시오 . a=document.getElementsByClassName('q').
Matt

이름으로 ID를 변경하고 단지로 전화 document.a, document.c, document.c또한 []에 직접 넣어
frieder

2

멋진, 근사한

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는 자바가 아니다. 즉, 모든 향상된 기능은 그다지 중요하지 않습니다. 자바에서 제거 한 모든 것이 필요했지만 그루비는 아닙니다.
Justin

1
맞습니다. Groovy는 Java가 아니므로 Groovy라고 불리는 이유가 있습니다. 당신이 여기서 무엇을 말 하려는지 잘 모르겠습니다.
Erik Pragt

1

TCL 347

적어도 파이썬과 자바를 능가합니다.

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첫 번째 줄의 끝에 하여 .

언 골프 드 :

# 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

자바 스크립트 + 녹아웃 : 최대 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

신발이 담긴 루비, 133 자

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}

샘플 출력 :

신발 창 스크린 샷


0

AppleScript, 194 190 바이트 (정말로 이것이 부정 행위인지 확인하십시오 ...)

두 가지 문제가 있습니다.

  • AppleScript에는 확인란이 없으며 목록 만 있습니다.
  • 목록 또는 금액에서 하나를 선택하는 옵션 만 있습니다.

우회 :

  • 목록에서 2 개 항목 만 선택 될 때 종료 점이있는 무한 반복 루프를 사용하여 종료합니다.
  • display alert길이가 30 바이트 인 구성 요소로 자신을 처벌했습니다 .

이 게시물을 게시하는 이유 :

  • 그것은 이다 AppleScript로이 작업을 수행하는 방법.
  • 코드는 세 가지 옵션을 선택하여 완료 할 수 없으므로 세 번째 옵션은 확장자 로 선택 해제됩니다 .

주로 아쿠아 / GUI 상호 작용에서 AppleScript의 힘을 보여주기 위해 이것을 게시합니다.

반복
목록에서 선택 "{FAST", "CHEAP", "GOOD"} 프롬프트 "CHOOSE ANY TWO"(다중 선택 가능)
결과 항목 번호가 <= 2 인 경우
이탈 반복
그밖에
경고 표시 "PLEASE PICK TWO"
종료
종료

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

언 골프 드 :

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.