速くて、安くて、良い-2つ選択してください


43

プログラマとして、私たちは皆、「あなたはそれを速くて良いものにすることができますが、安くはありません、あなたはそれを安くて良いものにすることができますが、それは速くありません、またはあなたはそれを速くて安いものにすることができます、それは良くないでしょう。」

この課題のために、カスタムプログラミングサービス用の架空の構成ツールを実装しています。「SELECT ANY TWO」という見出しの3つのチェックボックスのセットをレンダリングする必要があります。

SELECT ANY TWO  
☐ FAST  
☐ CHEAP  
☐ GOOD

2つのアイテムを選択したら、3番目のアイテムを無効にする必要があります。選択した2つのアイテムのいずれかを選択解除すると、すべてのオプションを再び有効にする必要があります。別の言い方をすれば、0個または1個のアイテムが選択された場合、すべてが有効になりますが、2個のアイテムが選択された場合、3番目のアイテムは無効にする必要があります。

特別なコントロールは許可されていません。チェックボックスは、選択した言語の標準チェックボックスである必要があります。たとえば、言語に「CheckBoxList」コントロールがある場合は、使用しないでください。ほとんどのエントリはHTML / jQueryになると想像していますが、それはルールではありません。これはコードゴルフで、最短のエントリーを探しています。

勝者はとても遠い

これをカテゴリに分類します。明確な勝者がいくつかいます:

jQuery: テキスト「リソース」を除外した場合の100b未満のnderscore、Mr。Tenacity。また、多くの人からインスピレーションを受けたjQueryの概念を紹介するために、Mattに敬意を表するべきです。

Dyalog APL: marinus、別名Mr.Unicodeこれらすべてをどのように入力しますか?短いプログラムを作成する理由がわかります。

PHP: SuperScriptこれは、ルールの最も厳密な解釈に従って、3番目のオプションを選択解除するのではなく、実際に無効にする最短のエントリだと思います。


一度に2つしか選択できないようにできますか?3番目を選択すると、他の1つが選択解除されますか?または、3つのオプションが選択されている場合にグレー表示される[承認]ボタンを追加しますか?
ジャスティン

7
@Quincunx-どちらを選択解除するかを決定できるヒューリスティックな(心の読み取り以外)がないため、これはユーザーを混乱させることになります...私たちのカスタムソフトウェアサービスは悪いものです。;)
ブルースピアソン

この質問はPython 3のtkinterに興味があったので、今それを学ぼうとしています。IMO、GUIを学ぶ最良の方法は試行錯誤によるものです。私はこれを試してみました:ideone.com/YHLZIQを。結果:新しいGUIをすばやく開きます。それらを閉じるには、タスクマネージャーを開く必要がありました。:-)。画像(番号はすぐに340まで上昇しました:i.stack.imgur.com/c9wQi.png
ジャスティン

客観的な主要な勝利基準または「ボーナス」の説明がないため、ボーナスコンテストは別の質問である必要があります。コードは、「...エレガントで柔軟...」であり、「...簡潔で明確...」である必要があり、これはcode-golfに反するものです。VTCは、あなたが何を求めているのか不明です。質問された後、質問を根本的に変更しないでください。
user80551

1
@BrucePierson実際にあります。最も古い選択済みチェックボックスを選択解除できます。ただし、そのためのコードは、必要なコードよりもはるかに多くなります。
ジャスティン

回答:


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は良いトリックです!
ロビーWxyz

1
"SELECT ANY TWO0FAST0GOOD0CHEAP".replace(/0/g,同じ長さになる別の方法です。
アンダースコア

ちょうど気難しされ、jqueryのバージョンではありませんattrに、小道具を使用する必要があります
Einacio

@Einacioあなたの願いは私の命令です!
nderscore

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/

EDIT:@Daniel Lisikからの助けを借りて改善- https://codegolf.stackexchange.com/a/26805/16278


5
いいね!投票するのに十分な担当者がいません...しかし、あなたは雇われています!
ブルースピアソン

2
これを見れば見るほど、学んでいます。jQueryセレクター内の変数割り当ての賢さ。とてもかっこいい。また、「ダブルバング」(!!)が何をしているのか説明してもらえますか?
ブルースピアソン

1
単一のbangはブール値を強制し、doubleはそれを明らかに反転させます。undefined真に強制します。それと変数の割り当ては、おそらく実際に使用される唯一の小さなトリックです。
マット

コードは次のように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タイトルで任意の2つとサイズと位置を選択します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作成した3つのチェックボックスの略語として使用
  • F←{... }:コールバック関数を次のように定義します:
    • X←B.State:各チェックボックスの状態を取得して保存しX
    • X∨2≠+/X:合計X、これが2に等しくない場合、すべてのチェックボックスがアクティブである必要があり、2に等しい場合、チェックされているチェックボックスのみがアクティブである必要がある
    • B.Active←:チェックボックスを有効または無効にします

結果:

スクリーンショット


素晴らしい説明、ありがとう!
ブルースピアソン

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の答えと同じロジックを使用します。3つ以上のチェックボックスが選択されるようになる場合は、チェックボックスの選択を解除します。Unf 幸いなことに、私はこれを行うためにより 少ないバイトを費やしました。

ここに画像の説明を入力してください

編集:

  1. 使用するコードを大幅に調整してexec、なんと1バイト節約!
  2. exec(括弧を削除して)から2バイトを圧縮するためにPython 2に切り替えました。
  3. より多くのゴ​​ルフ。インデントへの変更およびインデントの変更range(3)を含み0,1,2、タブの1つのレイヤーを含みます。の\t\t代わりに機能するかどうかは不明です\t___スペース文字です)。最後に、私のJavaの答えがこれまでで最長になりました。
  4. 使用される置換トリック
  5. バキルの提案を使用して、さらにゴルフをしました。実際、Javaよりも短くしました!しかし今では、Javaの答えがもっとゴルフに取り入れられたため、これもまた長くなりました。:-(
  6. 改良れた置換トリックを使用しました
  7. をに変更し!=ました-

興味深いアプローチ。+1
cjfaure

キーボードのターボモードをごまかすことができます。最初に、2つのボックスをオンにします。次に、Tabを使用して3番目を強調表示します。今、私は数秒間ターボモードでスペースバーを保持します。時々、これは3番目のボックスをチェックします!
カーニグ

@kernighそれは、コードがボックスが切り替えられたことを認識しているが、コードがボックスを再度切り替えるポイントに到達していないためだと考えています。そのため、その時間にボックスを切り替えた場合(オフにした場合)、コードにチェックマークが付けられます。
ジャスティン

1
:の代わりにをif p[i]使用することで、インデントされたブロックを回避できます。andifif p[i]:s>1 and B[i].toggle();s+=1
バクリウ

@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からの以下のスクリーンダンプ:

Rebol 3ビューの例

更新 -22文字のコードを削除したRebol SO ChatroomのEarl&Grahamに感謝-http ://chat.stackoverflow.com/transcript/message/16345039#16345039


3番目は無効ですがチェックもされているため、無効な回答です。つまり、3つすべてがチェックされているので、修正してください。
ST3

2
@ ST3-あなたは間違っています。「GOOD」チェックボックスがチェックされていないか、実際に無効になっています(私のコードは、オフになっている3番目のボックスを単にフリックします)。これは、Rebol 3ビューが未チェックのボックスを表示する方法です(デフォルト)。
draegtun

1
@ ST3他-上記のデフォルトのチェックボックスの外観を示すリンクがあります(1番目の画像はチェックボックスがクリックされていない、2番目は「GOOD」)- plus.google.com/u/0/104216037702741908932/posts/Z2EbuQX67aq
draegtun

さて...追加した印刷画面を見ると、3つすべてのチェックボックスがオンになっているのがわかります。チェックを外すことができないのは1つだけです。
ST3

3
@ ST3-灰色のチェックボックスは、チェック可能なチェックボックスであることを示すRebol 3 Viewの方法です。チェックを付けると目盛りが緑色に変わり、チェックを外すと灰色に戻ります。これらがデフォルトです。上記の回答の画像では、「クリック」されているため入力フォーカス(青色のぼかし)として「GOOD」が表示されますが、緑色ではなく灰色のままです(チェックされていません)。
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. Lambda Expressionsを読み直し、型名が不要であることに気付きました。そのPythonを使ってください!
  3. whileループをforeachループに変換しました(Leeに感謝)。なぜ私は前にそれを考えなかったのですか?
  4. との両方に匿名クラスとインスタンス初期化子を使用して18バイトを節約FrameしましたPanel

配置に制限はありません(Mattが5文字減らすことができると思います)。完全な実行プログラムの小道具...しかし、3番目のオプションが無効になっていることはわかりません。
ブルースピアソン

@BrucePierson無効になっています。クリックできません。クリックしても何も起こりません。
ジャスティン

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);}
ジャスティン

1
@BrucePiersonあなたが考えるときはいつでも、何かグラフィカルなものの文字表現を使用することに関係しているとき、これは面白いように見えます、ユニコードを探してください。また、グラフィカルなデザインのもののために回すユーザーエクスペリエンスSEi.stack.imgur.com/xFkzy.png
ジャスティン

7

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

理由はありません。

驚いたことに、今のところ私たちはPythonよりも短く、バギーのないC#であり、Javaと結びついています!

EveBirdを561から481に削減したことに対するクレジット。

また、EveBirdは481から433に短縮します!

ラムダ接続でいくつかを取りました

C ++ 11イニシャライザーで389まで

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

未分類の種類:

#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自己鞭打ち「なぜない」:)
ブルースピアソン

もう少し向上させることができます置き換えるQWidget mQDialog mしてm.show();a.exec()m.exec()
トビー・スペイト

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、Javascript、jQuery-135b

@nderscoreの答えを賞賛していましたが、それから彼をコピーして1対1にすることにしました。

<?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プログラムに非常に近づいています。よくやった!
ブルースピアソン

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

ルビー、219 218バイト

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.valueは、'0'または'1'であるため、文字列比較はの場合にのみ真になります'1'>'0'。編集:に変更して1バイト(219から218まで)を保存'0'しました?0。Rubyでは?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);}}

また、3番目のチェックボックスを選択しないと、検証がパスしないため、選択しない限りウィンドウを閉じることができないという小さなバグもあります。しかし、これはなので、誰が気にしますか?;)

C#403 397 374

これは、実際に3番目のチェックボックスを無効にする適切なものです。

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はい、できます。私はダムです。そして、もう1つにも同様の最適化があります。ありがとう!
ボブ

待って、いや、もう片方にはありません。ええ、まだいくつかの文字を保存しました。
ボブ

1
:あなたは少し、チェックボックスの継承を切り替える使用するオブジェクト初期化子と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でこれを試しましたが、成功しませんでした。実用的な例を提供できますか?
きしむオッシファージュ


「ng-app」には言及していません。私の例では<head>を確認してください。
user12345

1
ああ、OK :-) 引用符と余分な改行を削除することで、少しゴルフをすることができます。
squeamish ossifrage

4

(jQueryを使って)JavaScriptを- 224222210205、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)できます。
マット

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])})
マット

4

Mathematica

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主義が漏れていることに気づき、コードを8バイト減らすことができました!


ハハ、私はこれのイントロが好きです。それは一種の冗長です-ビールを話すことができますか?= c)
ブルースピアソン

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、そしてtrue持ちます1>0。およびのAll代わりにを使用することもできます。もより短いです。WhereLastToListToArray
ボブ

@Bobグッドコールは、)私はすべてを(逃したのか分からない、とボーナスとして、さらに多くの節約、あなたがそれを具現化する必要はありませんすべてで判明
iamkrillin

3

Groovyの- 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(QtQuick 2.0)バージョンでは、.qmlファイルの内容のみが与えられます。このコードを実行するには、少なくともQt 5.1が必要です。他のソリューション(248バイト)に比べて大きなものではありませんが、フル機能のクロスプラットフォームアプリケーション(AndroidおよびiOを含む)です!: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(またはLinuxではqmlscene)を実行します。これにより、ファイルを開くダイアログが表示されます。コードを保存した.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行目:3つの変数を持つ辞書。2行目:各変数はチェックボタンです。3行目:辞書にラベルを付けます。行4:3つの変数がチェックされた場合、最後にチェックされた変数を0にリセットします。5行目:辞書を表示します。
ステヴァンアプター

いいね!このような悲劇のK4は...何のGUIを持っていない
mollmerx

kが勝ちます(ただし、皮肉です!投稿するにはさらに9人のキャラクターが必要です!)
ステバンアプター

2

JavaScriptを/ jQueryの237 234 229

マットの答えと非常によく似たアプローチですが、もう少し長くなります。

$(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フォーム:入力を提供し、関数を呼び出します。*フォームは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でテスト済み。


関数をさらにゴルフし、すべてのvarsを統合し、不要なブレースと空白(改行文字を含む)を削除することにより、264文字に減らすことができます。ES6ラムダを使用すれば、おそらく小さくすることができます。
トニーエリス

いくつかのより明確なゴルフとは別に、代わりにクラスを使用して、すべての入力要素を1回のヒットで配列にプルすることを検討してgetElementsByClassNameください。a=document.getElementsByClassName('q')
マット

名前にIDを変更するだけでそれらを呼び出すdocument.adocument.cdocument.cまた、[]の中に直接入れて
frieder

2

グルーヴィー

Javaバージョンに基づいていますが、大幅にスリム化されています;)

タイプは「def」に置き換えられ、セミコロンは削除され、追加は<<に置き換えられ、1 <0は0に置き換えられ、チェックボックスを作成するために収集され、itemeventタイプが削除され、チェックボックスのキャストが削除され、ループが強化されました。

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ではありません。つまり、これらすべての機能強化はそれほど重要ではありません。削除したものはすべてJavaで必要でしたが、グルーヴィーではありませんでした。
ジャスティン

1
そうです、GroovyはJavaではありません。そのため、Groovyと呼ばれています。ここで何を言おうとしているのかわかりません。
エリックプラット14年

1

TCL 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

注:1つのチェックボックスを選択してすぐに選択を解除すると、エラーが発生します。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

Javascript +ノックアウト:〜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バイト(これは少し不正です...)

次の2つの問題があります。

  • AppleScriptにはチェックボックスはなく、リストのみがあります。
  • リストから1つまたは任意の金額を選択するオプションのみがあります。

回避策:

  • リスト内の項目が2つだけ選択されたときに2つだけが終了するように、ブレークポイントを使用して無限繰り返しループを使用します。
  • display alert余分な30バイトの長さを与えるコンポーネントで自分を罰しました。

これを投稿する私の背後にある理由:

  • それはあるのAppleScriptでこれを行う方法。
  • コードは3つのオプションが選択された状態では完了できないため、3番目のオプションはextensionによって選択解除されます。

主にこれを投稿して、Aqua / GUI相互作用におけるAppleScriptの力を示します。

繰り返す
リストから選択{「高速」、「安い」、「良い」}「プロンプトを選択」「複数選択可能」
結果のアイテムの番号<= 2の場合
繰り返しを終了
他に
警告を表示してください「2つ選んでください」
終わり
終わり

実行gif

これがあまりにもオフであると思われる場合は、削除するよう依頼してください。


これはワイルドです!それは私が今まで見た中で最も英語に似た言語です。
ブルースピアソン

彼らが「2つの選択が必要」のようなものやそれらの線に沿ったものを持っていないのは本当に残念です。
ブルースピアソン

@BrucePiersonええ、AppleScriptは奇妙な言語です。¯\ _(ツ)_ /¯私は今まで小さなものにしか使っていませんが、実際に何かをするのはかなり難しいです。
アディソンクランプ

これらはチェックボックスが付いていないため、この回答はルールから「あまりにも」外れています。削除するようにお願いします。
pppery

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.