快速,廉价和良好-选择任意两个


43

作为程序员,我们都知道这样一句话:“您可以快速而好用,但它不会便宜,您可以廉价而好,但它不会很快,或者您可以快速而又便宜。 ,但这不会很好。”

为了应对这一挑战,您正在为您的自定义编程服务实现一种虚拟配置工具。您应该呈现一组三个复选框,标题为“ SELECT ANY TWO”(选择两个):

SELECT ANY TWO  
☐ FAST  
☐ CHEAP  
☐ GOOD

选择两项后,必须禁用第三项。取消选择两个选定项目之一后,必须再次启用所有选项。换句话说,如果选择了零个或一个项目,则仍将全部启用,但是如果选择了两个,则必须禁用第三个。

不允许特殊控制。复选框应该是您选择的语言中的标准复选框。例如,如果您的语言只有一个,则不要使用“ CheckBoxList”控件。我想象大多数条目将是HTML / jQuery,但这不是规则。这是代码高尔夫,正在寻找最短的入场券。

优胜者

我将其分为几类。有一些明显的赢家:

jQuery: nderscore,在排除文本“资源”时,韧度低于100b的先生。值得一提的是,Matt介绍了许多受启发的jQuery概念。

Dyalog APL: marinus,又名Unicode先生您如何键入所有这些内容?我明白了您为什么要编写简短的程序。

PHP: SuperScript我认为这是最短的条目,实际上是按照最严格的规则解释,实际上是禁用而不是取消选择第三个选项。


我能做到一次只能选择两个吗?这样,选择第三个会取消选择另一个?还是添加一个接受按钮,如果选择了3个选项,该按钮将显示为灰色?
贾斯汀

7
@Quincunx-由于没有启发式的方法(头脑之外)可以决定取消选择哪个方法,这会使用户感到困惑……所以我不得不说不,因为我们不希望第一印象我们的自定义软件服务会很糟糕。;)
布鲁斯·皮尔森

这个问题使我对Python 3的tkinter感兴趣,所以我现在尝试学习它。IMO,学习GUI的最好方法是反复试验。我尝试了这个:ideone.com/YHLZIQ。结果:快速打开新的GUI。我不得不打开任务管理器以将其关闭。:-)。图片(数量很快攀升至340:i.stack.imgur.com/c9wQi.png
贾斯汀

奖金竞赛应该是另一个问题,因为没有客观的主要获胜标准或对“奖金”的任何描述。它说代码应该“……优雅而灵活……”和“……简洁明了……”,这与代码高尔夫相反。VTC不清楚您在问什么。在问完问题后,请不要从根本上改变问题。
user80551 2014年

1
@BrucePierson其实有。我们可以取消选中最早的复选框。但是,该代码将远远超出您所需的代码。
贾斯汀

Answers:


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

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

如果允许我们禁止用户选中第三个框,而不是实际禁用该字段,则可以使它更短:

使用jQuery- 126123演示

$("*").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是一个好把戏!
罗比·威克斯

1
"SELECT ANY TWO0FAST0GOOD0CHEAP".replace(/0/g,是另一种方法来得到相同的长度。
nderscore 2014年

只是挑剔,jQuery版本应该使用prop,而不是attr
Einacio 2014年

@Einacio你的愿望是我的命令!
nderscore 2014年

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
真好!没有足够的代表支持投票...但是您被录用了!
布鲁斯·皮尔森

2
我看的越多,我学到的越多。jQuery选择器中变量分配的巧妙之处。很酷。另外,您能解释一下“双爆炸”(!!)在做什么吗?
2014年

1
单引号会强制转换为布尔值,而双引号显然会反过来。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
缺少显示名称


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 20在中S
  • 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


很好的解释,谢谢!
布鲁斯·皮尔森

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答案相同的逻辑:如果取消选中该复选框,则导致选择两个以上的复选框。UNF 幸运不幸的是,我花更多的 多字节这样做。

enter image description here

编辑:

  1. 使用代码的大量调整exec,节省了多达1个字节!
  2. 切换到python 2从exec(删除括号)中挤压两个字节。
  3. 更多打高尔夫球。包括更改range(3)0,1,2缩进和将缩进更改为具有一层选项卡。不确定是否\t\t可以代替\t___是空格字符)。终于达到了我对Java的最长回答。
  4. 使用替换技巧
  5. 运用了Bakiru的建议,然后打了更多球。实际上使它比Java短!但是现在,Java的答案越来越多,因此又更长了。:-(
  6. 使用了改进的替换技巧
  7. 更改!=-

有趣的方法。+1
cjfaure

我可以用键盘上的Turbo模式作弊。首先,我选中两个框。第二,我使用Tab突出显示第三。现在,我在加速模式下按住空格键几秒钟。有时,这会选中第三个框!
kernigh

@kernigh,我相信这是因为我的代码到达了知道该框已切换的位置,但是该代码尚未到达重新切换该框的位置。因此,如果您在那个时间切换该框(关闭),我的代码将在其上打勾。
贾斯汀

1
你可以避开缩进块开始if p[i]使用and,而不是一个ifif p[i]:s>1 and B[i].toggle();s+=1
Bakuriu 2014年

@kernigh我错了;更换B[i].toggle()B[i].deselect()不会改变任何东西。我不知道为什么会这样。也许这是一个缺陷tkinter
贾斯汀

10

雷博尔,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的Screendump:

example of rebol 3 view

更新 -由于厄尔&格雷厄姆从雷博尔SO聊天室剃须22个的代码的字符- http://chat.stackoverflow.com/transcript/message/16345039#16345039


这是无效的答案,因为第三个被禁用但也被选中,这意味着所有三个都已选中,因此请对其进行修复。
ST3

2
@ ST3-恐怕您不正确。未选中“ GOOD”复选框或实际上已禁用(我的代码只是将第三个复选框打勾为OFF)。这就是Rebol 3视图显示未选中框的方式(默认情况下)。
draegtun 2014年

1
@ ST3等-这是一个链接,显示了我上文所述的默认复选框外观(第一个图像显示未单击任何复选框,第二个仅显示“ GOOD”)- plus.google.com/u/0/104216037702741901902/2/posts/Z2EbuQX67aq
draegtun

好吧...我查看了您添加的打印屏幕,我看到所有三个复选框都被选中,只有一个不能取消选中。
ST3

3
@ ST3-灰色复选框只是Rebol 3视图的显示方式,它是可以选中的复选框。勾选时勾号变为绿色,而未勾选时勾号变为灰色。这些是默认值。在上面的答案图像中,您可以看到“良好”作为输入焦点(蓝色模糊),因为它被“单击”了,但仍然是灰色而不是绿色(因此未选中)。
draegtun 2014年

10

Java 421 ... 369351字节

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

运行示例(窗口的大小不同,首先是在启动时):

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

复选框是水平排列的;这是允许的。正确对齐将花费更多。另外,我通过取消选中复选框来禁用它,而不是通过使其无法单击来禁用

编辑:

  1. 通过扩展主类节省了3个字节Checkbox
  2. 重读Lambda表达式并意识到类型名称是不必要的。拿那个Python!
  3. while循环转换为foreach循环(感谢Lee);我为什么以前没有想到呢?
  4. 通过使用匿名类和两个实例initalizer保存18个字节FramePanel

对对齐方式没有任何限制(因此我认为Matt可以将他的字符减少5个字符)。为完整的正在运行的程序提供支持...但我看不到第三个选项已禁用。
布鲁斯·皮尔森

@BrucePierson禁用。不能单击。如果单击它,则什么都不会发生。
贾斯汀2014年

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

1
@BrucePierson每当您想到时,当与使用某些图形对象的字符表示有关时,这看起来很有趣,请查找unicode。另外,对于图形设计,请转到User Experience 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!

使用lambda连接取得了一些成功

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

全球金融危机


1
自我鞭打的“为什么不为+1” :)
布鲁斯·皮尔森

可提高多一点:更换QWidget mQDialog mm.show();a.exec()m.exec()
Toby Speight 2015年

6

CoffeeScript- 167154

@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的答案,但后来我决定复制并单人化他。

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

基本上,我.join用一些PHP超文本预处理代替了他的技巧。


当您认为程序中的文本“ resources”需要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 2014年

5

Ruby,219218字节

我使用与Quincunx 的Python 3答案相同的Tk小部件。

该程序违反规则,因为它具有复选框列表。(规则说,“不要使用复选框列表。”)是的,它a是3个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

便宜和好检查,但快速禁用

我使用Ruby 2.1.0和Tk 8.5.15进行了测试。

  • o[c]是一个谓词,用于测试是否选中了复c选按钮。使用默认字符串c.variable.valueis '0''1',因此仅当时,字符串比较才为true '1'>'0'。编辑:我通过更改'0'为保存了1个字节(从219降到218)?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);}}

还有一个小错误,除非您取消选中第三个复选框,否则您无法关闭窗口,因为不会通过验证。但这是,那么谁在乎呢?;)

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

屏幕截图

金达(Kinda):

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,2014年

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,2014年

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,2014年


您没有提及“ ng-app”。在我的示例中检查<head>。
user12345 2014年

1
嗯,好的:-)您可以通过删除引号和多余的换行符来降低它的位置
吱吱作响的ossifrage,2014年

4

的JavaScript(用jQuery) - 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 2014年

@DavidCarraher谢谢,我将来还会看到自己将这种技术用于其他代码打高尔夫球的问题。

1
无需同时包含两个版本。并且不要忘记使用h和调整标题中的字符数。
DavidC 2014年

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,并true1>0。您也可以使用和All代替。还比短。WhereLastToListToArray
鲍勃

@Bob好话了,不知道我是怎么错过All()的,而且,额外的好处是,您无需实现,节省了更多
iamkrillin 2014年

3

Groovy中- 357 221 217个字符

我已经使用SwingBuilderQuincunx的解决方案移植到了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)!: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

3-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;否则,将其重置为0。第5行:显示字典。
Stevan Apter,2015年

真好!这样的悲剧k4没有GUI ...
mollmerx

k获胜(但具有讽刺意味的是,还要发9个字符才能发帖!)
Stevan Apter,2015年

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

高尔夫功能:

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 Lambda,则可能会使其更小。
托尼·埃利斯

除了一些更明显的打高尔夫球以外,还可以考虑使用类将所有输入元素一次命中,从而将所有输入元素拉入数组中,getElementsByClassName例如使用。a=document.getElementsByClassName('q')
马特2014年

将id更改为name,然后使用document.a,调用它们document.cdocument.c也将它们直接放入a []
Frieder 2014年

2

Groovy

基于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。我不确定您要在这里说什么。
埃里克·普拉格特

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

注意:如果首先选择一个复选框,然后立即取消选中它,则会出现错误。您可以通过添加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字节(很确定这有点欺骗...)

存在两个问题:

  • AppleScript中没有复选框,只有列表。
  • 只能从列表中选择一个或任何金额。

规避措施:

  • 当选择2个且仅选择2个项目时,使用带有断点的无限重复循环退出。
  • 惩罚自己的一个display alert组件会给我额外的30个字节的长度。

在我后面发布此的原因:

  • 在AppleScript中执行此操作的方法。
  • 该代码无法通过选择三个选项来完成,因此第三个选项被extension取消选择。

主要发布此内容以展示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--;}}}

取消高尔夫:

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窗口截图

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.