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.
Jawaban:
Javascript ( ES5 ) dengan jQuery - 143 ( Demo )
Saya memodifikasi solusi Matt dan memutarnya sejauh yang saya kira bisa:
Javascript ( ES5 ) tanpa jQuery -
185175 ( Demo )Menggunakan jQuery agak curang, jadi inilah solusi tanpa itu:
Jika kami diizinkan untuk mencegah pengguna memeriksa kotak ke-3 alih-alih benar-benar menonaktifkan bidang, kami dapat membuatnya lebih pendek:
Dengan jQuery -
126123 ( Demo )Tanpa jQuery -
150147 ( Demo )sumber
.join
adalah trik yang bagus!"SELECT ANY TWO0FAST0GOOD0CHEAP".replace(/0/g,
adalah cara lain untuk melakukannya menghasilkan panjang yang sama.JavaScript -
184169 (dengan jQuery)http://jsfiddle.net/L33JK/16/
EDIT: ditingkatkan dengan bantuan dari @Daniel Lisik - https://codegolf.stackexchange.com/a/26805/16278
sumber
undefined
memaksa untuk benar. Itu dan tugas variabel mungkin satu-satunya trik kecil yang digunakan.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/15Dyalog APL (di Windows) (169)
Ini adalah fungsi statis, untuk mengujinya jika Anda tidak tahu APL, ketik
)ed C
dan tempel ini di jendela edit, lalu jalankanC
.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 formulirR
, dengan judul Pilih dua dan ukuran dan posisi20 20
. Juga menyimpan20 20
diS
.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 dalamR
dengan huruf pertama dari nama,⍵(⍺1)S'Check'
: dengan argumen yang tepat sebagai judul,(left arg, 1)
sebagai posisi, menggunakan kembaliS
sebagai ukuran danCheck
gaya,('Event' 'Select' 'F')
, yang memanggil fungsiF
saat diklik.B←R.(F C G)
: gunakanB
sebagai singkatan untuk tiga kotak centang yang kami buatF←{
...}
: tentukan fungsi panggilan balik sebagai:X←B.State
: dapatkan status untuk setiap kotak centang dan simpan diX
,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 aktifB.Active←
: aktifkan atau nonaktifkan kotak centangHasil:
sumber
Python
32,454434...393392 byteSaya pikir, Python harus lebih pendek dari Java. Inilah "buktinya" (
EDIT: sekarang ini benar-benar lebih pendek):Bagi Anda yang penasaran dengan apa
exec
ekspresi sebenarnya dieksekusi, dieksekusi ini (ini adalah apa yang dilakukan penggantian untuk string. Baris ditambahkan untuk dibaca):Ini menggunakan logika yang sama dengan jawaban Java saya: batalkan centang pada kotak centang jika itu menyebabkan lebih dari 2 kotak centang yang dipilih.
UnfUntungSayangnya, saya menghabiskanlebihbanyak byte lebihsedikit untukmelakukan ini.EDIT:
exec
, menghemat 1 byte kekalahan!exec
(menghapus tanda kurung).range(3)
ke0,1,2
dan mengubah lekukan untuk memiliki satu lapisan tab. Tidak yakin apakah\t\t
akan berfungsi sebagai ganti\t__
(_
adalah karakter spasi). Akhirnya mencapai jawaban terlama saya di Java.!=
untuk a-
.sumber
if p[i]
menggunakanand
bukan sebuahif
:if p[i]:s>1 and B[i].toggle();s+=1
.B[i].toggle()
denganB[i].deselect()
tidak mengubah apa pun. Saya tidak tahu mengapa demikian. Mungkin itu adalah kesalahan dengantkinter
Rebol,
219197Tidak Disatukan:
Ini adalah dialek Tampilan Rebol 3 (r3-gui). Screendump di bawah ini dari Ubuntu Linux:
Pembaruan - Terima kasih kepada Earl & Graham dari Rebol SO Chatroom karena telah mencukur 22 karakter kode - http://chat.stackoverflow.com/transcript/message/16345039#16345039
sumber
Java,
421...369351 byteJava ... karena Java. Kode yang terlihat lebih bagus:
Contoh dijalankan (berbagai penataan jendela, pertama pada saat startup):
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:
Checkbox
.while
loop ke loop foreach (terima kasih Lee ); kenapa aku tidak memikirkan itu sebelumnya?Frame
danPanel
.sumber
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);}
C ++ 11 / Qt5.2 -
561481433423369Karena 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:
Semacam Tidak Golf:
sumber
QWidget m
denganQDialog m
danm.show();a.exec()
denganm.exec()
.CoffeeScript -
167, 154Port CoffeeScript dari jawaban @Matt .
Agak tidak terserang:
JSFiddle .
sumber
PHP, Javascript, jQuery - 135b
Saya mengagumi jawaban @nderscore, tetapi kemudian saya memutuskan untuk menyalin dan menambahkannya.
Pada dasarnya saya mengganti
.join
triknya dengan beberapa PHP Hypertext Preprocessing.sumber
SELECT ANY TWO<?=($m="<input type=checkbox onclick=(a=$('input:not(:checked)')).prop('disabled',!a[1])>").FAST.$m.GOOD.$m.CHEAP;
Rubi,
219218 byteSaya 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,
a
adalah 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.Saya diuji dengan Ruby 2.1.0 dan Tk 8.5.15.
o[c]
adalah predikat untuk menguji apakah tombol centangc
dipilih. Dengan string default,c.variable.value
is'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.a.map
untuk mengulang semua tombol, membuatnya:normal
atau:disabled
.sumber
Terima kasih kepada Rotem dan Johnbot untuk bantuan golfnya!
C #
343334Yang 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.
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 kode-golf , jadi siapa yang peduli? ;)
C #
403397374Ini adalah kotak yang benar-benar menonaktifkan kotak centang ketiga.
Agak tidak terserang:
sumber
if(a.Count(b=>b.Checked)==2)e.Cancel=true;
dapat ditulis ulang sebagaie.Cancel=a.Count(b=>b.Checked)==2;
?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);}}
if(a.Count(b=>b.Checked)>1){a.First(b=>!b.Checked).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);
AngularJS - 214
sumber
JavaScript (dengan jQuery) -
224,222,210,205, 178Berkat komentar dari @Matt brilian saya mengurangi kode oleh 27 karakter.
JSFiddle
sumber
$(e+c).length>1
ke tugas seperti itu:$(e).not(c).attr(f,$(e+c).length>1)
karena Anda hanya mengubah boolean itu sendiri.!!
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])})
Mathematica
Versi lebih banyak kode-golf seperti yang disarankan oleh David, 255 karakter :
sumber
h=Checkbox;i=Dynamic;j=Enabled
.h
dan menyesuaikan jumlah char Anda di heading.skrip mIRC (
727719 bytes)Lupa bahasa ini sampai percakapan mabuk semalam.
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!
sumber
C #,
335333326320308Didasarkan pada Bobs Answer, saya memang menggunakan lebih sedikit karakter daripada miliknya (335 v 342), tetapi saya mungkin tidak sepenuhnya mengerti bagaimana cara menghitung ini.
Tidak disatukan
sumber
Select
.==2
dengan a>1
, dantrue
dengan a1>0
. Anda juga dapat menggunakanAll
bukanWhere
danLast
.ToList
juga lebih pendek dariToArray
.Groovy -
357221217 charsSaya telah mem-porting solusi Quincunx ke Groovy 2.2.1, menggunakan SwingBuilder (dan membuatnya lebih Groovier):
Tidak Disatukan:
sumber
QML -
369315254251248 byteIni 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
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
sumber
k3 - 95
kode ada di sini
(sumber: nsl.com )
sumber
JavaScript / jQuery
237 234229Pendekatan yang sangat mirip dengan jawaban Matt , meskipun sedikit lebih lama.
sumber
JavaScript 209 (tadinya 346)
Singkat: terima kasih atas komentar.
Fungsi golf:
Bentuk HTML: memberikan input dan memanggil fungsi. * Formulir sekarang menggunakan input class = x untuk mengelompokkan.
Diuji dengan NetBeans dan Chrome.
sumber
var
, menghilangkan kawat gigi dan spasi yang tidak perlu (termasuk karakter baris baru). Anda mungkin bisa memperkecilnya jika menggunakan lambda ES6.getElementsByClassName
misalnya.a=document.getElementsByClassName('q')
.document.a
,document.c
,document.c
juga menempatkan mereka secara langsung ke dalam []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.
sumber
TCL 347
Setidaknya itu mengalahkan Python dan Java.
Catatan: jika Anda mulai dengan memilih satu kotak centang dan segera membatalkannya, Anda akan mendapatkan kesalahan. Anda dapat memperbaikinya dengan menambahkan
110
ke akhir baris pertama.Tidak Disatukan:
sumber
Javascript + Knockout: ~ 250 Karakter
sumber
AngularJS - 155 ( Demo )
Versi ungolfed:
sumber
Ruby with Shoes, 133 karakter
Output sampel:
sumber
AppleScript,
194190 Bytes (cukup yakin ini curang sedikit ...)Ada dua masalah:
Pencegahan:
display alert
komponen yang memberi saya panjang ekstra 30 byte.Alasan di belakang saya memposting ini:
Terutama memposting ini untuk menunjukkan kekuatan AppleScript dalam interaksi Aqua / GUI.
Jika Anda yakin ini terlalu berlebihan, minta saya untuk menghapus.
sumber
FLTK, 303 karakter
Tidak Disatukan:
Output sampel:
sumber