Hızlı, Ucuz ve İyi - Herhangi Birini Seçin


43

Programcılar olarak hepimiz şunu biliyoruz: "Hızlı ve iyi olabilir, ancak ucuz olmaz, ucuz ve iyi olabilir, ancak hızlı olmaz veya hızlı ve ucuz olabilir , ama iyi olmayacak. "

Bu zorluk için, özel programlama servisleriniz için hayali bir yapılandırma aracı uyguluyorsunuz. "BİR İKİ SEÇ" başlığına sahip üç onay kutusu kümesi oluşturmalısınız:

SELECT ANY TWO  
☐ FAST  
☐ CHEAP  
☐ GOOD

İki öğe seçildikten sonra, üçüncü öğe devre dışı bırakılmalıdır. Seçilen iki öğeden birinin seçiminin kaldırılması üzerine, tüm seçeneklerin tekrar etkinleştirilmesi gerekir. Başka bir deyişle, sıfır veya bir öğe seçiliyse, tümü hala etkindir, ancak iki öğe seçiliyse üçüncü devre dışı bırakılmalıdır.

Özel kontrollere izin verilmez. Onay kutuları, seçtiğiniz dilde standart onay kutusu olmalıdır. Örneğin, eğer dilinizde bir "CheckBoxList" kontrolü kullanmayın. Çoğu girişin HTML / jQuery olacağını hayal ediyorum, ancak bu bir kural değil. Bu kod golf, en kısa girişi arıyor.

KAZANANLAR

Bunu kategorilere ayıracağım. Bazı açık kazananlar var:

jQuery: nderscore, Sayın Tenacity "Kaynaklar" metnini hariç tuttuğunuzda 100b'nin altında. Onurlu sözler, birçoklarının ilham aldığı jQuery kavramlarını tanıtmak için Matt'e de gitmeli.

Dyalog APL: marinus, aka Bay Unicode Tüm bunları nasıl yazıyorsunuz? Neden kısa programlar yazmak istediğinizi anlayabiliyorum.

PHP: SuperScript Bunun, kuralların katı yorumunu takiben üçüncü seçeneğin seçimini kaldırmak yerine aslında devre dışı bırakan en kısa giriş olduğuna inanıyorum.


Sadece bir kerede iki tanesinin seçilebilmesi için yapabilir miyim? Yani üçüncü seçimi seçmek diğerlerinden birini seçer mi? Ya da belki 3 seçenek seçildiyse grileşen bir kabul et düğmesi eklenebilir mi?
Justin,

7
@ Quincunx - Hangisinin seçimini kaldıracağına karar verebilecek sezgisel (akıl okuma dışında) olmadığından, bu kullanıcının kafasını karıştırmaz ... bu yüzden hayır demek zorundayım çünkü ilk izlenimini istemiyoruz Özel yazılım hizmetlerimizin kötü olması. ;)
Bruce Pierson

Bu soru beni Python 3'ün tkinter'iyle ilgiliydi, bu yüzden şimdi öğrenmeye çalışıyorum. IMO, GUI öğrenmenin en iyi yolu deneme yanılmadır. Bunu denedim: ideone.com/YHLZIQ . Sonuç: yeni GUI'lerin hızlı açılması. Onları kapatmak için görev yöneticisi açmak zorunda kaldım. :-). Resim (sayı 340'a yükseldi: i.stack.imgur.com/c9wQi.png )
Justin,

Bonus yarışması, nesnel birincil kazanma kriteri veya "bonus" un açıklaması olmadığı için başka bir soru olmalıdır. Kodun " golf oynamaya karşı" "zarif ve esnek ..." ve "... açık ve net ..." olması gerektiğini söyledi . VTC ne sorduğunuzu belli değil. Lütfen sorular sorulduktan uzun süre sonra kökten değiştirmeyin.
user80551

1
@ BrucePierson Aslında, var. En eski seçilen onay kutusunun seçimini kaldırabiliriz. Ancak bunun için gereken kod, ihtiyacınız olan koddan çok daha fazla olacaktır.
Justin,

Yanıtlar:


23

JQuery ile Javascript ( ES5 ) - 143 ( Demo )

Matt'in çözümünü değiştirdim ve gidebileceğimi düşündüğüm kadar aşağıya sürdüm:

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

JQuery olmadan Javascript ( ES5 ) - 185 175 ( Demo )

JQuery kullanarak hile tür, bu yüzden onsuz bir çözüm:

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

Kullanıcının, alanı gerçekten devre dışı bırakmak yerine 3. kutuyu işaretlemesini önleyebilirsek, onu daha da kısaltabiliriz:

JQuery ile - 126 123 ( Demo )

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

JQuery olmadan - 150 147 ( Demo )

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

Güzel. Kullanımı .joiniyi bir numaradır!
Robbie Wxyz

1
"SELECT ANY TWO0FAST0GOOD0CHEAP".replace(/0/g,aynı uzunlukta sonuçlanan başka bir yoldur.
nderscore

sadece seçici olmak, jquery sürümü attr değil, prop kullanmanız gerekir
Einacio

@Einacio dileğin benim için emirdir!
nderscore

5
@Einacio Ama codegolf en kötü uygulamalarla ilgili! : P
nderscore,

29

JavaScript - 184 169 (jQuery ile birlikte)

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'in yardımı ile geliştirildi - https://codegolf.stackexchange.com/a/26805/16278


5
Güzel! Oy vermek için yeterli sayıda temsil yok ... ama işe alındın!
Bruce Pierson

2
Buna baktıkça daha fazla öğreniyorum. Bir jQuery seçicideki değişken atamasının akıllılığı. Çok havalı. Ayrıca, "çift patlama" (!!) ne yaptığını açıklayabilir misiniz?
Bruce Pierson

1
Tek patlama, bir boolean değeri zorlar ve çift açıkça bunu tersine çevirir. undefineddoğru zorlar. Bu ve değişken ataması muhtemelen gerçekten kullanılan tek küçük numaralardır.
Matt

Kodunuz bunun gibi 179 karaktere düşürülebilir: 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 is missing


12

Dyalog APL (Windows'ta) (169)

Bu, APL'yi bilmiyorsanız test etmek için statik bir fonksiyondur, bunu )ed Cdüzenleme penceresine yazın ve yapıştırın, sonra çalıştırın 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}

Daha yeni APL parçalarının uzun anahtar kelimeleri vardır. Yine de HTML'yi yeniyorum.

Açıklama:

  • 'R'⎕WC'Form' 'Select any two',2/⊂S←2/20: bir form oluşturun R, başlık ile herhangi bir iki boyut ve pozisyon seçin 20 20. Ayrıca saklar 20 20içinde S.
  • 1 21 41{... }¨'Fast' 'Cheap' 'Good': bu veri çiftlerinin her biri için (onay kutuları arasında farklı olan tek değişken olan ad ve y koordinatı:
    • ('R.',⊃⍵)⎕WC'Button': Rismin ilk harfini içeren bir düğme oluşturun ,
    • ⍵(⍺1)S'Check': başlık, doğru , boyut ve stil olarak (left arg, 1)yeniden kullanılan doğru argümanla ,SCheck
    • ('Event' 'Select' 'F'), Ftıklandığında işlevi çağıran .
  • B←R.(F C G): Byarattığımız üç onay kutusu için kısaltma olarak kullan
  • F←{... }: geri arama işlevini aşağıdaki gibi tanımlayın:
    • X←B.State: Her bir onay kutusunun durumunu alın ve saklayın X,
    • X∨2≠+/X: Toplam X, eğer bu ikisine eşit değilse, tüm onay kutularının aktif olması gerekir, eğer sadece iki olanlara eşitse onay kutusunun aktif olması gerekir
    • B.Active←: onay kutularını etkinleştirin veya devre dışı bırakın

Sonuç:

ekran görüntüsü


Harika bir açıklama, teşekkürler!
Bruce Pierson

11

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

Python'un Java'dan daha kısa olması gerektiğini düşündüm . İşte "kanıt" ( EDIT: şimdi gerçekten daha kısa ):

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İfadenin gerçekte ne yaptığını merak edenler için , bunu yürütür (bu, dizelerin yerine geçenlerin yaptığıdır. Okurlar için Newlines eklendi):

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

Bu benim Java cevabımla aynı mantığı kullanıyor: 2'den fazla onay kutusunun seçilmesine neden olması durumunda onay kutusundaki işareti kaldırın. Unf Neyse Ne yazık ki, harcanan daha az bunu daha bayt.

görüntü tanımını buraya girin

DÜZENLEMELER:

  1. execBir büyük 1 bayt tasarrufu , kullanmak için büyük bir kod ayarı kullanımı !
  2. exec( iki parantezi ayıklayarak) iki byte sıkmak için python 2'ye geçti .
  3. daha fazla golf. Değişen içerir range(3)etmek 0,1,2ve sekmelerin bir güvenlik katmanı için girinti değişen. \t\tBunun yerine işe yarayacağından emin değil \t__( _boşluk karakteridir). Sonunda Java cevabımın verdiği en uzun zamana ulaştı.
  4. hile yerine kullanılan
  5. Bakiru'nun önerisini kullandı ve biraz daha golf oynadı. Aslında onu Java'dan daha kısa hale getirdi! Ama şimdi, Java cevabı daha çok golf aldı, bu yüzden bu daha uzun. :-(
  6. hile geliştirilmiş yerine kullandı .
  7. !=için bir a değiştirildi -.

İlginç yaklaşım +1
cjfaure

Klavyemdeki turbo moduyla hile yapabilirim. İlk önce iki kutuyu işaretliyorum. İkinci olarak, Tab'ı üçüncülüğü vurgulamak için kullanıyorum. Şimdi Space Bar'ı birkaç saniye turbo modunda tutuyorum. Bazen bu üçüncü kutuyu kontrol eder!
saat

@kernigh Bunun nedeni, kodumun kutunun değiştirildiğini bildiği noktaya ulaştığı, ancak kodun kutuyu yeniden değiştirdiği noktaya ulaşmadığıdır. Bu yüzden kutuyu o zaman değiştirirseniz (kapalı), kodum üzerinde bir onay işareti koyar.
Justin,

1
Sen ile başlayan girintili blok önleyebilirsiniz if p[i]bir kullanan andbir yerine if: if p[i]:s>1 and B[i].toggle();s+=1.
Bakuriu,

@kernigh Yanılmışım; değiştirilmesi B[i].toggle()ile B[i].deselect()hiçbir şey değişmez. Bunun neden böyle olduğu hakkında hiçbir fikrim yok. Belki de bu bir hatadırtkinter
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]
]

Bu Rebol 3 View lehçesidir (r3-gui). Ubuntu Linux’un altından screendump:

rebol 3 görünümü örneği

Güncelleme - Rebol SO Chatroom'dan Earl & Graham'a 22 kodun tıraş edilmesi için teşekkürler - http://chat.stackoverflow.com/transcript/message/16345039#16345039


Üçüncüsü devre dışı bırakılmış, ancak aynı zamanda kontrol edilmiş olduğu için geçersiz bir cevaptır, bu da üçünün de kontrol edildiği anlamına gelir, lütfen düzeltin.
ST3

2
@ ST3 - Yanlışsın korkarım. "İYİ" onay kutusu işaretli değil veya aslında devre dışı bırakılmış (kodum yalnızca KAPALI işaretli üçüncü kutuyu işaretliyor). Rebol 3 görünümünün işaretlenmemiş bir kutuyu göstermesi (varsayılan olarak).
draegtun

1
@ ST3 et al - Burada yukarıda tanımladığım varsayılan onay kutusu görünümünü gösteren bir bağlantı var (1. resimde tıklanmış hiçbir onay kutusu gösterilmiyor, yalnızca ikinci "İYİ" gösteriliyor) - plus.google.com/u/0/104216037702741908932/posts/Z2EbuQX67aq
draegtun

Şey ... Eklediğiniz baskı ekranına bakıyorum ve üç onay kutusunun da işaretli olduğunu görüyorum, yalnızca bir tanesi işaretlenemiyor.
ST3

3
@ ST3 - Grileşmiş bir onay kutusu sadece Rebol 3 Kontrol edilebilecek bir onay kutusu olduğunu gösterme şeklini görüntüleyin. İşaret, işaretlendiğinde yeşile döner ve işaretlendiğinde gri renge döner. Bunlar varsayılanlardır. Yukarıdaki cevaptaki resimde, giriş odağı olarak “İYİ” ifadesini görebilirsiniz (mavi bulanıklaştırma) çünkü “tıklatıldı” ancak gri kalıyor ve yeşil değil (kontrol edilmiyor).
draegtun

10

Java, 421 ... 369 351 bayt

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 ... çünkü Java. Güzel görünümlü kod:

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

Örnek çalışma (pencerenin farklı boyutlar, ilk başlangıçta):

görüntü tanımını buraya girin
görüntü tanımını buraya girin
görüntü tanımını buraya girin

Onay kutuları yatay olarak düzenlenmiştir; buna izin var . Doğru şekilde hizalamak çok daha fazla zaman alır. Ayrıca, tıklandığında imkansız hale getirilerek değil , tıklandığında kutunun işaretini kaldırarak devre dışı bırakıyorum .

DÜZENLEMELER:

  1. ana sınıfı genişleterek 3 bayt kaydetti Checkbox.
  2. Lambda Expressions'ı okudum ve tür adının gereksiz olduğunu anladım. Python'u al!
  3. bir whiledöngüyü foreach döngüsüne dönüştürdü (teşekkürler Lee ); neden daha önce düşünmedim?
  4. isimsiz sınıf ve her ikisi için bir örnek initalizer kullanarak 18 bayt kaydedildi Frameve Panel.

Uyum konusunda herhangi bir kısıtlama yoktur (bu yüzden Matt'in 5 karakter azaltacağını düşünüyorum). Tam çalışan bir program için destek ... ancak üçüncü seçeneğin devre dışı bırakıldığını görmüyorum.
Bruce Pierson

@BrucePierson Devre dışı. Tıklanamaz. Tıklanırsa hiçbir şey olmuyor.
Justin,

2
Ah, sanırım görüyorum. Devre dışı bırakmadan kontrol edilen durumu hemen "ayarsızlaştırıyorsunuz"? Bu kabul edilebilir olurdu.
Bruce Pierson

@ BrucePierson Bu doğru. Aslında devre dışı bırakmak için, değiştirmek if(x>2)((Checkbox)e.getSource()).setState(1<0);zorunda kaldımif(x>2){Checkbox b=(Checkbox)e.getSource();b.setState(1<0);b.setEnabled(1<0);}
Justin,

1
@BrucePierson Ne zaman bir düşünün, Bu grafiksel bir şeyin karakter gösterimini kullanmakla ilgili olduğunda komik görünüyor , unicode arayın. Alternatif olarak, grafiksel tasarım işleri için, User Experience SE'ye gidin : i.stack.imgur.com/xFkzy.png
Justin

7

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

Çünkü neden olmasın.

Şaşırtıcı bir şekilde, şu an itibariyle Python ve buggy dışı C # 'dan daha kısayız ve Java ile bağlıyız!

EveBird'e 561'den 481'e düşürdüğü için kredi verir.

Ve bir kez daha EveBird, 481'den 433'e kadar kısaltır!

Lambda connect ile birkaçını çıkardı

C ++ 11 başlatıcılarla 389'a kadar

Ve ayrı bir sınıf olmadan 373

Birkaç boşluk kaldırıldı - 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'in Sıralaması:

#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
Kendini beğenen "neden olmasın" için +1 :)
Bruce Pierson

Biraz daha gelişebilir: QWidget mile QDialog mve m.show();a.exec()ile değiştirin m.exec().
Toby Speight

6

CoffeeScript - 167, 154

Arasında CoffeeScript liman @Matt 'ın cevabı.

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]

Biraz unungolfed:

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'un cevabına hayran kaldım, ama sonra onu kopyalamaya ve bir taneye karar verdim.

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

Temelde .joinnumaralarını PHP Hypertext Preprocessing ile değiştirdim .


Programdaki "kaynaklar" metni için 27 bayt gerektiğini düşündüğünüzde, bu bir 100b programına çok yaklaşıyor. Aferin!
Bruce Pierson

1
Ben bir PHP golfçüsü pek değilim, ama sizin için bir kaç bayt SELECT ANY TWO<?=($m="<input type=checkbox onclick=(a=$('input:not(:checked)')).prop('disabled',!a[1])>").FAST.$m.GOOD.$m.CHEAP;
kesdim

5

Ruby, 219 218 bayt

Quincunx'un Python 3 cevaplarıyla aynı Tk widget'larını kullanıyorum.

Bu program kuralları ihlal ediyor çünkü bir onay kutusu listesi var . (Kurallar, "Bir onay kutusu listesi kullanmayın" dedi.) Evet, a3 TkCheckButton nesnesinin bir dizisidir ve bir dizinin bir liste olduğuna inanıyorum. Savunmam, mevcut herhangi bir onay kutusu listesini kullanmadığımdan, ancak standart onay kutularını kullandım ve kendi listemi yaptım.

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

UCUZ ve İYİ kontrol edildi, ancak HIZLI devre dışı

Ruby 2.1.0 ve Tk 8.5.15 ile test ettim.

  • o[c]onay düğmesinin cseçili olup olmadığını test etmek için bir tahmindir . Varsayılan dizeleri ile c.variable.valueolan '0'veya '1'dize karşılaştırma durumunda doğrudur, böylece '1'>'0'. EDIT: 1 bayt (219 - 218 - 218) arasında değişiklik '0'yaparak tasarruf ettim ?0. Ruby'de ?0bir karakter sabitidir.
  • a.count(&o) Seçilen onay düğmelerini saymak için yüklemi kullanır.
  • Kullanıcı bir onay düğmesine değiştirir, komut çağırır a.mapbunları yaparken, bütün butonlar için döngü :normalveya :disabled.

1
Çok iyi. Burada kural ihlali yok - dil çerçevesinin bir parçası olabilecek bir onay kutusu liste kontrolünden bahsediyordum . Şimdiye kadarki cevapların hepsinin bir çeşit harita ya da seçici kullandığına inanıyorum, bu yüzden bu tamamen yasal.
Bruce Pierson

5

Golf yardımı için Rotem ve Johnbot'a teşekkürler!

C # 343 334

Bu, Quincunx'un Java cevabıyla aynı "hile" yi kullanıyor - onay kutuları aslında devre dışı değil; onlar sadece kontrol 3 yapsa onları kontrol etmenize izin vermiyorlar.

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

Doğrulama geçmeyeceğinden, seçiminizi onaylamadığınız sürece üçüncü onay kutusunu seçtikten sonra pencereyi kapatamayacağınız küçük bir hata da vardır. Ama bu , peki kimin umrunda? ;)

C # 403 397 374

Bu, üçüncü onay kutusunu gerçekten devre dışı bırakan uygun bir seçimdir.

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

Ekran görüntüsü

Bir çeşit unungolfed:

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
Could not if(a.Count(b=>b.Checked)==2)e.Cancel=true;olarak yeniden yazılması e.Cancel=a.Count(b=>b.Checked)==2;?
Rotem

@Rotem Evet, evet olabilir. Aptalım ben. Ve diğeri için de benzer bir optimizasyon var. Teşekkürler!
Bob

Bekle, hayır, diğeri için yok. Eh, hala bazı karakterleri kurtardı.
Bob

1
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);}}
Kalıtımı CheckBox'a geçirirseniz

1
Koşullu operatörü if ifadesinin yerine kullanıyorsanız, 364. Değiştir if(a.Count(b=>b.Checked)>1){a.First(b=>!b.Ch‌​ecked).Enabled=1<0;}else a.All(b=>b.Enabled=0<1);ilea.First(b=>!b.Checked).Enabled=a.Count(b=>b.Checked)>1?1<0:a.All(b=>b.Enabled=0<1);
Johnbot

5

AçısalJS - 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>

Bunu JSFiddle'da denedim, fakat başarılı olamadım . Çalışan bir örnek verebilir misiniz?
pembemsi ossifrage


"Ng-app" den bahsetmedin. Örnekte <head> işaretleyin.
user12345

1
Ah, tamam :-) tırnak işaretleri ve fazladan satır sonları kaldırarak biraz aşağı golf yapabilirsiniz .
pembemsi ossifrage

4

JavaScript (jQuery ile) - 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'tan gelen bir yorum sayesinde kodu 27 karakter düşürdüm.

JSFiddle


Durumunuzu taşıyarak 25 ya da öylesine tasarruf edin $(e+c).length>1 şekilde atama içine : $(e).not(c).attr(f,$(e+c).length>1)çünkü yalnızca boole kendini değiştiriyorsunuz.
Matt

1
Senin ve benimkilerin karışımını kullanarak onu 169'a indirmeyi başardı. !!Zorlama ve d vücudu atama değil biraz ekstra golf. 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

Mathematica

255 karakterden David tarafından önerilen daha kod kodlu bir sürüm :

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

Kullanarak bazı karakterleri kaydedebilirsiniz h=Checkbox;i=Dynamic;j=Enabled.
DavidC

@DavidCarraher Teşekkürler, gelecekte de diğer kod golf soruları için bu tekniği kullanırken kendimi görebiliyorum.

1
Her iki sürümü de eklemenize gerek yok. Üstelik h, başlıktaki karakter sayınızı kullanmayı ve ayarlamayı unutmayın.
DavidC

4

mIRC betiği ( 727 719 bayt)

Dün gece sarhoş bir sohbete kadar bu dili unuttum.

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

Daha fazlası bu dilde kodlanmalı! Ancak bunu gerçek bir karmaşaya sokmanın bir yolu olmalı ki Perl kadar iyi olsun.

Düzenleme: Python-ism'lerin sızdığını ve kodu 8 bayt azalttığını fark ettim!


Haha, bunun tanıtımını beğendim. Bu biraz ayrıntılı olsa da - konuşan bira olabilir mi? = c)
Bruce Pierson

3

C #, 335 333 326 320 308

Bobs Cevaplarına dayanarak, benimki (335 v 342) 'den daha az karakter kullanıyor, ancak bunun nasıl sayılacağını tam olarak anlayamayabilirim.

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

Burada anon fonksiyonlarının ve Linq'in büyük kullanımı, özellikle Select.
Bruce Pierson

Sen değiştirerek bir çift daha fazla karakter kaydedebilirsiniz ==2bir ile >1, ve truebir ile 1>0. Ayrıca ve Allyerine de kullanabilirsiniz . ayrıca daha kısa . WhereLastToListToArray
Bob,

@Bob İyi bir çağrı, Tümünü () nasıl özlediğimi bilmiyorum (ve bonus olarak), Tamam ile nasıl sonuçlanacağını bilmiyorum, daha da fazla tasarruf edin
iamkrillin

3

Harika - 357 221 217 karakter

Ben taşıdınız quincunx en çözümünü kullanarak, Groovy 2.2.1 için SwingBuilder (ve daha da Groovier yapılmış):

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 bayt

İşte sadece .qml dosya içeriği verilen QML (QtQuick 2.0) sürümü. Bu kod en azından çalıştırmak için Qt 5.1 gerektirir. Diğer çözümlere kıyasla ( 248 byte ) çok büyük bir sorun değil , ancak tam özellikli bir çapraz platform uygulaması (Android ve iO'ler dahil)! : 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}}

Yatay düzen iletişim kutusu

Çalıştırmak için, kodu bir .qml dosyasına kaydedin, Qt 5.1'i yükleyin ve açık bir dosya iletişim kutusu gösterecek olan qmlscene.exe'yi (veya yalnızca Linux üzerinde qmlscene) çalıştırın. Kodu kaydettiğiniz .qml dosyasını seçin ve harika sonucu görün! : 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

kod burada

örnek çalışma
(kaynak: nsl.com )


satır 1: üç değişkenli bir sözlük; 2. satır: her değişken bir kontrol düğmesidir; 3. satır: sözlüğü etiketleyin; Satır 4: Üç değişken kontrol edilmişse, kontrol edilen son değişkeni 0'a getirin; Satır 5: sözlüğü göster.
Stevan Apter

Güzel! Böyle bir trajedi
k4'ün

k kazanır (ancak ah ironi! Göndermek için 9 karakter daha gerekir!)
Stevan Apter

2

JavaScript / jQuery 237 234 229

Biraz daha uzun olsa da, Matt'in cevabına çok benzer bir yaklaşım .

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

Kısaltıldı: yorumlarınız için teşekkürler.

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

Golf fonksiyonu:

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 formu: giriş sağlar ve işlevi çağırır. * Form şimdi girişleri gruplamak için class = x kullanır.

<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 ve Chrome ile test edilmiştir.


varGereksiz parantezleri ve boşlukları kaldırarak (yeni satırlar dahil) tüm fonksiyonlarınızı birleştirerek fonksiyonu daha da golf oynayabilir ve 264 karaktere kadar düşürebilirsiniz . Bir ES6 lambda kullanıyorsanız muhtemelen küçültebilirsiniz.
Tony Ellis

Daha belirgin bir golf oynamak dışında, tüm girdi öğelerini bir diziye çekerek, getElementsByClassNameörneğin , bir diziyle bir sınıf kullanmayı düşünün . a=document.getElementsByClassName('q').
Matt

isme kimlikleri değiştirmek ve sadece onları arayın document.a, document.c, document.caynı zamanda bir [] doğrudan koydu
Frieder

2

harika

Java sürümüne göre, ancak çok zayıfladı;)

Türler 'def' ile değiştirildi, noktalı virgül kaldırıldı, ekleme << ile değiştirildi, 1 <0, 0 ile değiştirildi, onay kutularını oluşturmak için toplandı, itemevent türünü çıkardı, onay kutusunu attırarak kaldırıldı, döngüler geliştirildi.

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 değil. Bu, tüm bu geliştirmelerin çok fazla sayılmadığı anlamına gelir. Kaldırdığın her şey java'da gerekliydi, ama harika değildi.
Justin,

1
Haklısın, Groovy Java değil, bu yüzden Groovy. Burada ne söylemeye çalıştığını bilmiyorum.
Erik Pragt

1

TCL 347

En azından Python ve Java'yı yeniyor.

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

Not: Bir onay kutusunu seçerek ve hemen seçimini kaldırarak başlarsanız, bir hata alırsınız. 110İlk satırın sonuna ekleyerek bunu düzeltebilirsiniz .

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 + Nakavt: ~ 250 Karakterler

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

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

Ungolfed versiyonu:

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

Ayakkabılı Yakut, 133 karakter

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}

Örnek çıktı:

Ayakkabı penceresi ekran görüntüsü


0

AppleScript, 194 190 Bytes (bu biraz hile yapıyor eminim ...)

İki problem var:

  • AppleScript'te onay kutusu yok, yalnızca listeler var.
  • Listeden ONE veya HERHANGİ bir miktar seçmek için sadece bir seçenek var.

atlatma:

  • Listede 2 ve sadece 2 öğe seçildiğinde, bir çıkış noktası olan sonsuz bir yineleme döngüsünün kullanılması.
  • display alertEkstra 30 baytlık uzunluk veren bir bileşenle kendimi cezalandırdım .

Bu ilanıyla arkamdaki sebep:

  • Bunu AppleScript'te yapmanın yolu budur .
  • Kod seçili üç seçenekle tamamlayamaz, bu nedenle üçüncü seçenek uzantı tarafından seçili değildir .

Bunu temel olarak AppleScript'in Aqua / GUI etkileşimindeki gücünü göstermek için yayınlıyor.

tekrar et
"FAST", "UCUZ", "İYİ"} "birden fazla seçime izin verilen" HER İKİ SEÇ "istemi ile listeden seçim yapın
sonucun öğelerinin sayısı <= 2 ise
tekrarlamadan çık
Başka
"LÜTFEN İKİ KAZANIN" uyarısını görüntüle
son
son

yürütme gif

Bunun çok kapalı olduğuna inanıyorsanız, lütfen silmemi isteyin.


Bu vahşi! Bu şimdiye kadar gördüğüm en İngilizce benzeri dil.
Bruce Pierson

"2 seçimle gerekli" gibi bir şey veya bu satırlar boyunca bir şey olması gerçekten çok kötü.
Bruce Pierson

@BrucePierson Evet, AppleScript tuhaf bir dildir. ¯ \ _ (ツ) _ / ¯ Sadece küçük şeyler için kullandım, onunla gerçek bir şeyler yapmak çok zor.
Addison Crump,

0

FLTK, 303 karakter

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

Örnek çıktı:

FLTK pencere ekran görüntüsü

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.