Cepat, Murah, dan Bagus - Pilih Dua


43

Sebagai programmer, kita semua tahu pepatah: "Anda bisa mendapatkannya dengan cepat dan bagus, tapi itu tidak murah, Anda bisa mendapatkannya murah dan bagus, tetapi tidak akan cepat, atau Anda bisa mendapatkannya dengan cepat dan murah , tapi itu tidak baik. "

Untuk tantangan ini, Anda menerapkan alat konfigurasi imajiner untuk layanan pemrograman kustom Anda. Anda harus merender satu set tiga kotak centang, dengan tajuk "SELECT ANY TWO":

SELECT ANY TWO  
☐ FAST  
☐ CHEAP  
☐ GOOD

Setelah dua item dipilih, item ketiga harus dinonaktifkan. Setelah membatalkan pilihan salah satu dari dua item yang dipilih, semua opsi harus diaktifkan kembali. Dengan kata lain, jika nol atau satu item dipilih, semua masih diaktifkan, tetapi jika dua item dipilih, yang ketiga harus dinonaktifkan.

Tidak ada kontrol khusus yang diizinkan. Kotak centang harus berupa kotak centang standar dalam bahasa pilihan Anda. Misalnya, jangan gunakan kontrol "CheckBoxList", jika bahasa Anda memilikinya. Saya membayangkan sebagian besar entri adalah HTML / jQuery, tapi itu bukan aturan. Ini kode golf, mencari entri terpendek.

PEMENANG JAUH

Saya akan memecahnya menjadi beberapa kategori. Ada beberapa pemenang yang jelas:

jQuery: nderscore, Mr. Tenacity Under 100b saat Anda mengecualikan teks "sumber daya". Sebutan yang terhormat juga harus ditujukan kepada Matt untuk memperkenalkan konsep jQuery yang banyak mengambil inspirasi dari.

Dyalog APL: marinus, alias Mr. Unicode Bagaimana Anda mengetik semua hal itu? Saya dapat melihat mengapa Anda ingin menulis program pendek.

PHP: SuperScript Saya percaya ini adalah entri terpendek yang sebenarnya menonaktifkan daripada membatalkan pilihan opsi ketiga, mengikuti interpretasi ketat dari aturan.


Bisakah saya membuatnya sehingga hanya dua yang bisa dipilih sekaligus? Sehingga memilih yang ketiga akan memilih salah satu dari yang lain? Atau mungkin menambahkan tombol terima yang akan diklik jika 3 opsi dipilih?
Justin

7
@ Quincunx - Karena tidak ada heuristik (di luar membaca pikiran) yang dapat memutuskan mana yang akan dihapus, ini akan membingungkan pengguna ... jadi saya harus mengatakan tidak, karena kami tidak ingin kesan pertama dari layanan perangkat lunak khusus kami menjadi layanan yang buruk. ;)
Bruce Pierson

Pertanyaan ini menarik saya pada tkinter Python 3, jadi saya mencoba mempelajarinya sekarang. IMO, cara terbaik untuk belajar GUI adalah dengan coba-coba. Saya mencoba ini: ideone.com/YHLZIQ . Hasil: pembukaan cepat GUI baru. Saya harus membuka task manager untuk menutupnya. :-). Gambar (nomor segera naik ke 340: i.stack.imgur.com/c9wQi.png )
Justin

Kontes bonus harus menjadi pertanyaan lain karena tidak ada kriteria pemenang utama yang objektif atau deskripsi "bonus". Dikatakan bahwa kode harus "... elegan dan fleksibel ..." dan "... ringkas dan jelas ..." yang bertentangan dengan kode-golf . VTC tidak jelas apa yang Anda minta. Tolong jangan secara radikal mengubah pertanyaan lama setelah mereka ditanya.
user80551

1
@BrucePierson Sebenarnya, ada. Kami dapat menghapus centang pada kotak centang tertua yang dipilih. Namun, kode untuk itu akan jauh lebih banyak daripada kode yang Anda butuhkan.
Justin

Jawaban:


23

Javascript ( ES5 ) dengan jQuery - 143 ( Demo )

Saya memodifikasi solusi Matt dan memutarnya sejauh yang saya kira bisa:

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

Javascript ( ES5 ) tanpa jQuery - 185 175 ( Demo )

Menggunakan jQuery agak curang, jadi inilah solusi tanpa itu:

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

Jika kami diizinkan untuk mencegah pengguna memeriksa kotak ke-3 alih-alih benar-benar menonaktifkan bidang, kami dapat membuatnya lebih pendek:

Dengan jQuery - 126 123 ( Demo )

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

Tanpa jQuery - 150 147 ( Demo )

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

Keren. Menggunakan .joinadalah trik yang bagus!
Robbie Wxyz

1
"SELECT ANY TWO0FAST0GOOD0CHEAP".replace(/0/g,adalah cara lain untuk melakukannya menghasilkan panjang yang sama.
nderscore

hanya pilih-pilih, versi jquery harus menggunakan prop, bukan attr
Einacio

@Einacio keinginanmu adalah perintahku!
nderscore

5
@Einacio Tapi codegolf adalah tentang praktik terburuk! : P
nderscore

29

JavaScript - 184 169 (dengan 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: ditingkatkan dengan bantuan dari @Daniel Lisik - https://codegolf.stackexchange.com/a/26805/16278


5
Bagus! Tidak cukup perwakilan untuk mendukung ... tetapi Anda diterima!
Bruce Pierson

2
Semakin saya melihat ini, semakin saya belajar. Kecerdasan penugasan variabel di dalam pemilih jQuery. Sangat keren. Juga, dapatkah Anda menjelaskan apa yang sedang dilakukan "ledakan ganda" (!!)?
Bruce Pierson

1
Ledakan tunggal, memaksa nilai boolean, dan ganda jelas akan membalikkan itu. undefinedmemaksa untuk benar. Itu dan tugas variabel mungkin satu-satunya trik kecil yang digunakan.
Matt

Kode Anda dapat dikurangi hingga 179 karakter seperti ini: 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 (di Windows) (169)

Ini adalah fungsi statis, untuk mengujinya jika Anda tidak tahu APL, ketik )ed Cdan tempel ini di jendela edit, lalu jalankan 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}

Bit APL yang lebih baru memiliki kata kunci yang panjang . Saya masih mengalahkan HTML.

Penjelasan:

  • 'R'⎕WC'Form' 'Select any two',2/⊂S←2/20: buat formulir R, dengan judul Pilih dua dan ukuran dan posisi 20 20. Juga menyimpan 20 20di S.
  • 1 21 41{... }¨'Fast' 'Cheap' 'Good': untuk masing-masing pasangan data ini (nama dan koordinat y, yang merupakan satu-satunya variabel yang berbeda di antara kotak centang:
    • ('R.',⊃⍵)⎕WC'Button': buat tombol di dalam Rdengan huruf pertama dari nama,
    • ⍵(⍺1)S'Check': dengan argumen yang tepat sebagai judul, (left arg, 1)sebagai posisi, menggunakan kembali Ssebagai ukuran dan Checkgaya,
    • ('Event' 'Select' 'F'), yang memanggil fungsi Fsaat diklik.
  • B←R.(F C G): gunakan Bsebagai singkatan untuk tiga kotak centang yang kami buat
  • F←{... }: tentukan fungsi panggilan balik sebagai:
    • X←B.State: dapatkan status untuk setiap kotak centang dan simpan di X,
    • X∨2≠+/X: jumlah X, jika ini tidak sama dengan dua semua kotak centang harus aktif, jika itu sama dengan dua hanya kotak centang yang dicentang harus aktif
    • B.Active←: aktifkan atau nonaktifkan kotak centang

Hasil:

tangkapan layar


Penjelasan yang bagus, terima kasih!
Bruce Pierson

11

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

Saya pikir, Python harus lebih pendek dari Java. Inilah "buktinya" ( EDIT: sekarang ini benar-benar lebih pendek ):

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

Bagi Anda yang penasaran dengan apa execekspresi sebenarnya dieksekusi, dieksekusi ini (ini adalah apa yang dilakukan penggantian untuk string. Baris ditambahkan untuk dibaca):

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

Ini menggunakan logika yang sama dengan jawaban Java saya: batalkan centang pada kotak centang jika itu menyebabkan lebih dari 2 kotak centang yang dipilih. Unf Untung Sayangnya, saya menghabiskan lebih banyak byte lebih sedikit untuk melakukan ini.

masukkan deskripsi gambar di sini

EDIT:

  1. penyesuaian besar-besaran kode untuk digunakan exec, menghemat 1 byte kekalahan!
  2. beralih ke python 2 untuk memeras dua byte dari exec(menghapus tanda kurung).
  3. lebih banyak bermain golf. Termasuk mengubah range(3)ke 0,1,2dan mengubah lekukan untuk memiliki satu lapisan tab. Tidak yakin apakah \t\takan berfungsi sebagai ganti \t__( _adalah karakter spasi). Akhirnya mencapai jawaban terlama saya di Java.
  4. ganti pakai trik
  5. menggunakan saran Bakiru , dan bermain golf lagi. Sebenarnya membuatnya lebih pendek dari Jawa! Tapi sekarang, jawaban Java mendapat golf lebih banyak, jadi ini lagi lebih lama. :-(
  6. digunakan trik ganti ditingkatkan .
  7. mengubah a !=untuk a -.

Pendekatan yang menarik. +1
cjfaure

Saya bisa curang dengan mode turbo di keyboard saya. Pertama, saya centang dua kotak. Kedua, saya menggunakan Tab untuk menyorot yang ketiga. Sekarang saya menahan Space Bar dalam mode turbo selama beberapa detik. Terkadang, ini memeriksa kotak ketiga!
kernigh

@kernigh Saya percaya itu karena kode saya sampai pada titik di mana ia tahu bahwa kotak telah diaktifkan, tetapi kode belum mencapai titik di mana ia kembali mengaktifkan kotak. Jadi, jika Anda mengaktifkan kotak pada waktu itu (untuk mematikan), kode saya akan memberi tanda centang padanya.
Justin

1
Anda dapat menghindari blok menjorok dimulai dengan if p[i]menggunakan andbukan sebuah if: if p[i]:s>1 and B[i].toggle();s+=1.
Bakuriu

@kernigh saya salah; mengganti B[i].toggle()dengan B[i].deselect()tidak mengubah apa pun. Saya tidak tahu mengapa demikian. Mungkin itu adalah kesalahan dengantkinter
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]]

Tidak Disatukan:

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

Ini adalah dialek Tampilan Rebol 3 (r3-gui). Screendump di bawah ini dari Ubuntu Linux:

contoh tampilan rebol 3

Pembaruan - Terima kasih kepada Earl & Graham dari Rebol SO Chatroom karena telah mencukur 22 karakter kode - http://chat.stackoverflow.com/transcript/message/16345039#16345039


Itu adalah jawaban yang tidak valid, karena yang ketiga dinonaktifkan tetapi juga dicentang, itu berarti ketiga diperiksa, jadi tolong perbaiki.
ST3

2
@ ST3 - Anda salah saya takut. Kotak centang "GOOD" tidak dicentang atau bahkan dinonaktifkan (kode saya hanya menjentikkan kotak ketiga dicentang OFF). Ini adalah bagaimana tampilan Rebol 3 menunjukkan kotak yang tidak dicentang (secara default).
draegtun

1
@ ST3 et al - Ini adalah tautan yang memperlihatkan tampilan kotak centang default yang telah saya jelaskan di atas (gambar 1 menunjukkan tidak ada kotak centang yang diklik, ke-2 hanya "BAIK") - plus.google.com/u/0/104216037702741908932/posts/Z2EbuQX67aq
draegtun

Baiklah ... Saya melihat ke layar cetak yang Anda tambahkan dan saya melihat ketiga kotak centang dicentang, hanya satu yang tidak dapat dicentang.
ST3

3
@ ST3 - Kotak centang yang diklik hanya Rebol 3 Lihat cara untuk menunjukkan bahwa itu kotak centang yang dapat diperiksa. Centang berubah menjadi hijau saat dicentang dan berubah menjadi abu-abu saat tidak dicentang. Ini adalah standarnya. Pada gambar di jawaban di atas Anda dapat melihat bahwa "BAIK" sebagai fokus input (blur biru) karena sedang "diklik" tetapi tetap abu-abu dan tidak hijau (jadi tidak dicentang).
draegtun

10

Java, 421 ... 369 351 byte

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 ... karena Java. Kode yang terlihat lebih bagus:

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

Contoh dijalankan (berbagai penataan jendela, pertama pada saat startup):

masukkan deskripsi gambar di sini
masukkan deskripsi gambar di sini
masukkan deskripsi gambar di sini

Kotak centang disusun secara horizontal; ini diizinkan . Perlu lebih banyak untuk menyelaraskannya dengan benar. Juga, saya menonaktifkan dengan menghapus centang pada kotak ketika diklik , bukan dengan membuat tidak mungkin untuk diklik.

EDIT:

  1. disimpan 3 byte dengan membuat perluasan kelas utama Checkbox.
  2. membaca kembali Ekspresi Lambda dan menyadari bahwa nama jenis itu tidak perlu. Ambil Python itu!
  3. mengonversikan whileloop ke loop foreach (terima kasih Lee ); kenapa aku tidak memikirkan itu sebelumnya?
  4. menyimpan 18 byte dengan menggunakan kelas anonim dan instance institalizer untuk Framedan Panel.

Tidak ada batasan pada perataan (jadi saya kira Matt bisa mengurangi 5 karakternya). Alat peraga untuk program yang berjalan lengkap ... tapi saya tidak melihat bahwa opsi ketiga dinonaktifkan.
Bruce Pierson

@BrucePierson Ini dinonaktifkan. Itu tidak bisa diklik. Jika diklik, tidak ada yang terjadi.
Justin

2
Ah, kurasa begitu. Anda segera "membatalkan" keadaan yang dicentang tanpa menonaktifkan? Itu bisa diterima.
Bruce Pierson

@ BrucePierson Benar. Untuk benar-benar menonaktifkan, saya harus mengubah if(x>2)((Checkbox)e.getSource()).setState(1<0);keif(x>2){Checkbox b=(Checkbox)e.getSource();b.setState(1<0);b.setEnabled(1<0);}
Justin

1
@BrucePierson Kapan pun Anda berpikir, Ini terlihat lucu ketika harus dilakukan dengan menggunakan representasi karakter dari beberapa hal grafis, cari unicode. Atau, untuk hal-hal desain grafis, buka User Experience SE : i.stack.imgur.com/xFkzy.png
Justin

7

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

Karena mengapa tidak.

Mengejutkan, seperti yang sekarang kita lebih pendek dari Python, dan C # non-buggy, dan diikat dengan Java!

Kredit ke EveBird karena memotongnya dari 561 menjadi 481.

Dan sekali lagi EveBird mempersingkatnya dari 481 menjadi 433!

Mengambil beberapa off dengan koneksi lambda

Turun ke 389 dengan inisialisasi C ++ 11

Dan 373 tanpa kelas yang terpisah

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

Semacam Tidak Golf:

#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 untuk flagellating mandiri "why not" :)
Bruce Pierson

Dapat meningkatkan sedikit lebih banyak: ganti QWidget mdengan QDialog mdan m.show();a.exec()dengan m.exec().
Toby Speight

6

CoffeeScript - 167, 154

Port CoffeeScript dari jawaban @Matt .

b="input";a="<input type=checkbox>";c=":checked";$("body").html("SELECT ANY TWO#{a}FAST#{a}GOOD#{a}CHEAP").click ->$(b).not(c).attr "disabled",!!$(b+c)[1]

Agak tidak terserang:

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

Saya mengagumi jawaban @nderscore, tetapi kemudian saya memutuskan untuk menyalin dan menambahkannya.

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

Pada dasarnya saya mengganti .jointriknya dengan beberapa PHP Hypertext Preprocessing.


Ketika Anda mempertimbangkan bahwa 27 byte diperlukan untuk teks "sumber daya" dalam program, ini semakin dekat dengan program 100b. Sudah selesai dilakukan dengan baik!
Bruce Pierson

1
Saya tidak banyak pegolf PHP, tapi saya memotong beberapa byte untuk Anda: (128)SELECT ANY TWO<?=($m="<input type=checkbox onclick=(a=$('input:not(:checked)')).prop('disabled',!a[1])>").FAST.$m.GOOD.$m.CHEAP;
nderscore

5

Rubi, 219 218 byte

Saya menggunakan widget Tk yang sama dengan jawaban Python 3 oleh Quincunx.

Program ini melanggar aturan karena memiliki daftar kotak centang . (Aturan mengatakan, "Jangan gunakan daftar kotak centang.") Ya, aadalah array dari 3 objek TkCheckButton, dan saya percaya bahwa array adalah daftar. Pertahanan saya adalah bahwa saya tidak menggunakan daftar kotak centang yang ada, tetapi saya menggunakan kotak centang standar dan membuat daftar sendiri.

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

MURAH dan BAIK dicentang, tetapi CEPAT dinonaktifkan

Saya diuji dengan Ruby 2.1.0 dan Tk 8.5.15.

  • o[c]adalah predikat untuk menguji apakah tombol centang cdipilih. Dengan string default, c.variable.valueis '0'atau '1', jadi perbandingan string hanya benar jika '1'>'0'. EDIT: Saya menyimpan 1 byte (219 ke 218) dengan mengubah '0'ke ?0. Di Ruby,?0 adalah konstanta karakter.
  • a.count(&o) menggunakan predikat untuk menghitung tombol centang yang dipilih.
  • Ketika pengguna mengaktifkan tombol cek, perintah memanggil a.mapuntuk mengulang semua tombol, membuatnya :normalatau :disabled.

1
Sangat bagus. Tidak ada melanggar aturan di sini - saya merujuk ke kontrol daftar kotak centang yang mungkin menjadi bagian dari kerangka kerja bahasa. Saya percaya semua jawaban sejauh ini menggunakan semacam peta atau pemilih, jadi ini benar-benar sah.
Bruce Pierson

5

Terima kasih kepada Rotem dan Johnbot untuk bantuan golfnya!

C # 343 334

Yang ini menggunakan "cheat" yang sama dengan jawaban Java Quincunx - kotak centang sebenarnya tidak dinonaktifkan; mereka hanya tidak mengizinkan Anda untuk memeriksanya jika pemeriksaan tersebut menghasilkan 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);}}

Ada juga bug kecil yang Anda tidak bisa menutup jendela setelah memilih kotak centang ketiga kecuali Anda membatalkan pilihan, karena validasi tidak akan berlalu. Tapi ini , jadi siapa yang peduli? ;)

C # 403 397 374

Ini adalah kotak yang benar-benar menonaktifkan kotak centang ketiga.

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

Tangkapan layar

Agak tidak terserang:

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
Tidak if(a.Count(b=>b.Checked)==2)e.Cancel=true;dapat ditulis ulang sebagai e.Cancel=a.Count(b=>b.Checked)==2;?
Rotem

@Rotem Ya, ya itu bisa. Saya bodoh Dan ada optimasi serupa untuk yang lainnya. Terima kasih!
Bob

Tunggu, tidak, tidak ada yang lain. Eh, masih menyimpan beberapa karakter.
Bob

1
Jika Anda mengalihkan warisan ke CheckBox, gunakan inisialisasi objek dan sedikit menyalahgunakan Linq Anda bisa mendapatkan yang tepat ke 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 jika Anda menggunakan operator kondisional sebagai pengganti pernyataan if. Ganti if(a.Count(b=>b.Checked)>1){a.First(b=>!b.Ch‌​ecked).Enabled=1<0;}else a.All(b=>b.Enabled=0<1);dengana.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>

Saya mencoba ini di JSFiddle, tetapi tidak berhasil . Bisakah Anda memberikan contoh kerja?
ossifrage pelit


Anda tidak menyebutkan "ng-app". Periksa <head> dalam contoh saya.
user12345

1
Ah, oke :-) Anda bisa sedikit menurunkan golf dengan menghapus tanda kutip dan jeda baris tambahan.
ossifrage pelit

4

JavaScript (dengan 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)})

Berkat komentar dari @Matt brilian saya mengurangi kode oleh 27 karakter.

JSFiddle


Hemat 25 atau lebih dengan memindahkan kondisi Anda $(e+c).length>1ke tugas seperti itu: $(e).not(c).attr(f,$(e+c).length>1)karena Anda hanya mengubah boolean itu sendiri.
Matt

1
Berhasil menurunkannya menjadi 169 menggunakan campuran milikmu dan milikku. The !!pemaksaan dan golf ekstra dengan tidak menetapkan tubuh 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

Mathematica

Versi lebih banyak kode-golf seperti yang disarankan oleh David, 255 karakter :

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

Anda dapat menyimpan beberapa karakter dengan menggunakan h=Checkbox;i=Dynamic;j=Enabled.
DavidC

@DavidCarraher Terima kasih, saya bisa melihat diri saya menggunakan teknik itu untuk pertanyaan kode golf lainnya di masa depan juga.

1
Tidak perlu menyertakan kedua versi. Dan jangan lupa untuk menggunakan hdan menyesuaikan jumlah char Anda di heading.
DavidC

4

skrip mIRC ( 727 719 bytes)

Lupa bahasa ini sampai percakapan mabuk semalam.

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

Lebih banyak harus diberi kode dalam bahasa ini! Tetapi perlu ada cara untuk membuat ini menjadi berantakan sehingga bisa sebagus Perl.

Sunting: perhatikan bahwa Python-isme saya bocor dan mampu mengurangi kode sebesar 8 byte!


Haha, saya suka intro yang ini. Ini agak verbose - mungkinkah itu bir yang berbicara? = c)
Bruce Pierson

3

C #, 335 333 326 320 308

Didasarkan pada Bobs Answer, saya memang menggunakan lebih sedikit karakter daripada miliknya (335 v 342), tetapi saya mungkin tidak sepenuhnya mengerti bagaimana cara menghitung ini.

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

Tidak disatukan

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

Penggunaan fungsi anon dan Linq di sini, terutama seperti Select.
Bruce Pierson

Anda dapat menyimpan beberapa karakter lebih banyak dengan mengganti ==2dengan a >1, dan truedengan a 1>0. Anda juga dapat menggunakan Allbukan Wheredan Last. ToListjuga lebih pendek dari ToArray.
Bob

@ Bob Panggilan yang bagus, tidak tahu bagaimana saya merindukan Semua (), dan sebagai bonus, ternyata dengan Semua yang Anda tidak perlu terwujud, simpan lebih banyak lagi
iamkrillin

3

Groovy - 357 221 217 chars

Saya telah mem-porting solusi Quincunx ke Groovy 2.2.1, menggunakan SwingBuilder (dan membuatnya lebih 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()

Tidak Disatukan:

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 byte

Ini dia versi QML (QtQuick 2.0), hanya berisi konten file .qml. Kode ini membutuhkan Qt 5.1 setidaknya untuk menjalankan. Bukan masalah besar karena sangat besar dibandingkan dengan solusi lain ( 248 byte ), tetapi ini adalah aplikasi lintas-platform berfitur lengkap (termasuk Android dan iOs)! : D

    import QtQuick 2.0;import QtQuick.Controls 1.1;Row{Text{text:"SELECT ANY TWO"}CheckBox{id:a;text:"FAST";enabled:!b.checked|!c.checked}CheckBox{id:b;text:"CHEAP";enabled:!a.checked|!c.checked}CheckBox{id:c;text:"GOOD";enabled:!b.checked|!a.checked}}

Dialog tata letak horizontal

Untuk menjalankannya, simpan kode ke file .qml, instal Qt 5.1 dan jalankan qmlscene.exe (atau hanya qmlscene di linux), yang akan menampilkan dialog file terbuka. Pilih file .qml Anda telah menyimpan kode dan lihat hasilnya luar biasa! : 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

kode ada di sini

sampel dijalankan
(sumber: nsl.com )


baris 1: kamus dengan tiga variabel; baris 2: setiap variabel adalah kotak centang; baris 3: beri label pada kamus; baris 4: jika tiga variabel telah diperiksa, reset variabel terakhir diperiksa ke 0; baris 5: tampilkan kamus.
Stevan Apter

Bagus! Tragedi k4 seperti itu tidak memiliki GUI ...
mollmerx

k menang (tapi oh ironi! 9 karakter lagi diperlukan untuk memposting!)
Stevan Apter

2

JavaScript / jQuery 237 234 229

Pendekatan yang sangat mirip dengan jawaban Matt , meskipun sedikit lebih lama.

$(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 (tadinya 346)

Singkat: terima kasih atas komentar.

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

Fungsi golf:

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

Bentuk HTML: memberikan input dan memanggil fungsi. * Formulir sekarang menggunakan input class = x untuk mengelompokkan.

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

Diuji dengan NetBeans dan Chrome.


Anda dapat mengubah fungsi golf lebih jauh dan menguranginya menjadi 264 karakter dengan menggabungkan semua karakter Anda var, menghilangkan kawat gigi dan spasi yang tidak perlu (termasuk karakter baris baru). Anda mungkin bisa memperkecilnya jika menggunakan lambda ES6.
Tony Ellis

Terlepas dari beberapa golf yang lebih jelas, pertimbangkan menggunakan kelas untuk menarik semua elemen input ke dalam array dalam satu pukulan saja, menggunakan getElementsByClassNamemisalnya. a=document.getElementsByClassName('q').
Matt

mengubah id untuk nama dan hanya menyebut mereka dengan document.a, document.c, document.cjuga menempatkan mereka secara langsung ke dalam []
Frieder

2

Asyik

Berdasarkan versi Java, tetapi jauh lebih ramping;)

Jenis diganti dengan 'def', titik koma dihapus, tambahkan diganti oleh <<, 1 <0 diganti dengan 0, kumpulkan untuk membuat kotak centang, dihapus jenis itemevent, dihapus pengecoran kotak centang, tambahkan loop.

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 bukan java. Itu berarti bahwa semua peningkatan itu tidak masuk hitungan. Semua yang Anda hapus diperlukan di java, tetapi tidak asyik.
Justin

1
Anda benar, Groovy bukan Java, itu sebabnya disebut Groovy. Saya tidak yakin apa yang ingin Anda katakan di sini.
Erik Pragt

1

TCL 347

Setidaknya itu mengalahkan Python dan 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

Catatan: jika Anda mulai dengan memilih satu kotak centang dan segera membatalkannya, Anda akan mendapatkan kesalahan. Anda dapat memperbaikinya dengan menambahkan110 ke akhir baris pertama.

Tidak Disatukan:

# Keep track of the last disabled button. Set it to something valid to start with.
set last .110

proc toggled name {
        # Access some globals
        upvar fast  fast
        upvar cheap cheap
        upvar good  good
        upvar last  last
        upvar $name value

        # Just toggled one on, check if exactly two are now on
        if {$value == 1 && ($fast + $cheap + $good) == 2} {
                set last .$fast$cheap$good
                $last configure -state disabled
        }
        # Just toggled one off. Re-enable disabled one.
        if {$value == 0} {
                $last configure -state normal
        }
}

label .label -text {SELECT ANY TWO}

checkbutton .011 -text FAST  -variable fast  -command {toggled fast}
checkbutton .101 -text CHEAP -variable cheap -command {toggled cheap}
checkbutton .110 -text GOOD  -variable good  -command {toggled good}

pack .label .011 .101 .110

1

Javascript + Knockout: ~ 250 Karakter

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

Versi ungolfed:

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

Ruby with Shoes, 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}

Output sampel:

Tangkapan layar window shoes


0

AppleScript, 194 190 Bytes (cukup yakin ini curang sedikit ...)

Ada dua masalah:

  • Tidak ada kotak centang di AppleScript, hanya daftar.
  • Hanya ada opsi untuk memilih SATU dari daftar atau jumlah APA PUN.

Pencegahan:

  • Menggunakan loop berulang tak terbatas dengan titik istirahat untuk memiliki jalan keluar ketika 2, dan hanya 2, item dalam daftar dipilih.
  • Dihukum diri saya dengan display alertkomponen yang memberi saya panjang ekstra 30 byte.

Alasan di belakang saya memposting ini:

  • Ini adalah cara untuk melakukan ini di AppleScript.
  • Kode tidak dapat lengkap dengan tiga opsi yang dipilih, sehingga opsi ketiga tidak dipilih oleh ekstensi .

Terutama memposting ini untuk menunjukkan kekuatan AppleScript dalam interaksi Aqua / GUI.

ulangi
pilih dari daftar {"FAST", "CHEAP", "GOOD"} dengan prompt "PILIH SETIAP DUA" dengan beberapa pilihan diizinkan
jika nomor item hasil <= 2
keluar ulangi
lain
peringatan tampilan "PLEASE PICK TWO"
akhir
akhir

eksekusi gif

Jika Anda yakin ini terlalu berlebihan, minta saya untuk menghapus.


Ini liar! Itu bahasa paling mirip bahasa Inggris yang pernah saya lihat.
Bruce Pierson

Sayang sekali mereka tidak memiliki sesuatu seperti "dengan 2 pilihan yang dibutuhkan" atau sesuatu seperti itu.
Bruce Pierson

@BrucePierson Ya, AppleScript adalah bahasa yang aneh. ¯ \ _ (ツ) _ / ¯ Saya hanya menggunakannya untuk hal-hal kecil, cukup sulit untuk menyelesaikan apa pun yang sebenarnya.
Addison Crump

Ini tidak dicentang, membuat jawaban ini "terlalu jauh" dari aturan. Saya dengan ini meminta Anda untuk menghapus.
pppery

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

Tidak Disatukan:

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

Output sampel:

Tangkapan layar jendela FLTK

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.