Jako programiści wszyscy znamy powiedzenie: „Możesz mieć to szybko i dobrze, ale nie będzie tanie, możesz mieć tanie i dobre, ale nie będzie szybkie, lub możesz mieć szybkie i tanie , ale nie będzie dobrze ”.
Aby sprostać temu wyzwaniu, wdrażasz wymyślone narzędzie konfiguracyjne dla niestandardowych usług programistycznych. Powinieneś wyrenderować zestaw trzech pól wyboru z nagłówkiem „WYBIERZ DOWOLNE DWA”:
SELECT ANY TWO
☐ FAST
☐ CHEAP
☐ GOOD
Po wybraniu dwóch elementów trzeci element musi zostać wyłączony. Po odznaczeniu jednego z dwóch wybranych elementów wszystkie opcje muszą być ponownie włączone. Innymi słowy, jeśli wybrano zero lub jeden element, wszystkie są nadal włączone, ale jeśli wybrane są dwa elementy, trzeci musi być wyłączony.
Żadne specjalne kontrole nie są dozwolone. Pola wyboru powinny być standardowymi polami wyboru w wybranym języku. Na przykład nie używaj kontrolki „CheckBoxList”, jeśli Twój język ją ma. Wyobrażam sobie, że większość wpisów będzie HTML / jQuery, ale to nie jest reguła. To jest golf golfowy, szukający najkrótszego wpisu.
ZWYCIĘZCY DALEKO
Podzielę to na kategorie. Istnieje kilka wyraźnych zwycięzców:
jQuery: nderscore, Mr. Tenacity Under 100b, jeśli wykluczysz tekst „zasoby”. Wyróżnienie należy również podziękować Mattowi za wprowadzenie koncepcji jQuery, z których wielu czerpało inspirację.
Dyalog APL: marinus, alias Mr. Unicode Jak wpisujesz te wszystkie rzeczy? Rozumiem, dlaczego chcesz pisać krótkie programy.
PHP: SuperScript Uważam, że jest to najkrótszy wpis, który faktycznie wyłącza, a nie wyłącza trzecią opcję, zgodnie z najściślejszą interpretacją reguł.
Odpowiedzi:
JavaScript ( ES5 ) z jQuery - 143 ( Demo )
Zmodyfikowałem rozwiązanie Matta i grałem w golfa tak daleko, jak mi się wydaje:
JavaScript ( ES5 ) bez jQuery -
185175 ( Demo )Korzystanie z jQuery jest rodzajem oszustwa, więc oto rozwiązanie bez niego:
Jeśli wolno nam uniemożliwić użytkownikowi zaznaczenie trzeciego pola zamiast faktycznego wyłączenia pola, możemy go skrócić:
Z jQuery -
126123 ( Demo )Bez jQuery -
150147 ( Demo )źródło
.join
to dobra sztuczka!"SELECT ANY TWO0FAST0GOOD0CHEAP".replace(/0/g,
jest innym sposobem na osiągnięcie tego samego efektu.JavaScript -
184169 (z jQuery)http://jsfiddle.net/L33JK/16/
EDYCJA: ulepszona dzięki pomocy @Daniel Lisik - https://codegolf.stackexchange.com/a/26805/16278
źródło
undefined
przymusza do prawdy. To i zmienne przypisanie to prawdopodobnie jedyne naprawdę małe sztuczki.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 (w systemie Windows) (169)
Jest to funkcja statyczna. Aby ją przetestować, jeśli nie znasz APL, wpisz ją
)ed C
i wklej w oknie edycji, a następnie uruchomC
.Nowsze bity APL mają długie słowa kluczowe. Nadal jednak pokonuję HTML.
Wyjaśnienie:
'R'⎕WC'Form' 'Select any two',2/⊂S←2/20
: utwórz formularzR
, z tytułem Wybierz dowolne dwa oraz rozmiar i pozycję20 20
. Przechowuje również20 20
wS
.1 21 41{
...}¨'Fast' 'Cheap' 'Good'
: dla każdej z tych par danych (nazwa i współrzędna y, które są jedynymi zmiennymi, które różnią się między polami wyboru:('R.',⊃⍵)⎕WC'Button'
: utwórz przyciskR
z pierwszą literą nazwy,⍵(⍺1)S'Check'
: z odpowiednim argumentem jako tytułem,(left arg, 1)
pozycją, ponownym użyciemS
jako rozmiar iCheck
styl,('Event' 'Select' 'F')
, który wywołuje funkcjęF
po kliknięciu.B←R.(F C G)
: użyjB
jako skrótu trzech utworzonych przez nas pól wyboruF←{
...}
: zdefiniuj funkcję oddzwaniania jako:X←B.State
: uzyskaj stan dla każdego pola wyboru i zapisz jeX
,X∨2≠+/X
: suma X, jeśli to nie jest równe dwa, wszystkie pola wyboru muszą być aktywne, jeśli jest równe dwa, tylko zaznaczone pola wyboru muszą być aktywneB.Active←
: włącz lub wyłącz pola wyboruWynik:
źródło
Python
32,454434...393392 bajtówPomyślałem, że Python musi być krótszy niż Java. Oto „dowód” (
EDYCJA: teraz naprawdę jest krótszy):Dla tych z Was, którzy są ciekawi, co
exec
faktycznie wykonuje wyrażenie, wykonuje to (tak właśnie zastępują ciąg znaków. Dodano nowe znaki dla czytelności):Wykorzystuje to tę samą logikę, co moja odpowiedź Java: odznacz pole wyboru, jeśli powoduje zaznaczenie więcej niż 2 pól wyboru.
UnfszczęścieNiestety, spędziłemwięcejmniejwięcej bajtów to robi.EDYCJE:
exec
, oszczędzając aż 1 bajt!exec
(usuwanie nawiasów).range(3)
się0,1,2
i zmieniając wcięcie mieć jedną warstwę zakładkach. Nie jestem pewien, czy\t\t
zadziała zamiast\t__
(_
jest spacją). W końcu dotarłem do najdłuższej z moich odpowiedzi w języku Java.!=
na a-
.źródło
if p[i]
stosującand
zamiastif
:if p[i]:s>1 and B[i].toggle();s+=1
.B[i].toggle()
zB[i].deselect()
niczego nie zmienia. Nie mam pojęcia, dlaczego tak jest. Być może jest to wada ztkinter
Rebol,
219197Nie golfowany:
To jest dialekt Rebol 3 View (r3-gui). Screendump poniżej z Ubuntu Linux:
Aktualizacja - dzięki Earl & Graham z Rebol SO Chatroom za golenie 22 znaków kodu - http://chat.stackoverflow.com/transcript/message/16345039#16345039
źródło
Java,
421...369351 bajtówJava ... ponieważ Java. Ładniej wyglądający kod:
Uruchomienie przykładowe (różne rozmiary okna, pierwsze uruchomienie):
Pola wyboru są ułożone poziomo; to jest dozwolone . Prawidłowe wyrównanie wymagałoby znacznie więcej. Ponadto wyłączam , odznaczając pole po kliknięciu , a nie uniemożliwiając kliknięcie.
EDYCJE:
Checkbox
.while
pętlę w pętlę foreach (dzięki Lee ); dlaczego wcześniej o tym nie myślałem?Frame
iPanel
.źródło
if(x>2)((Checkbox)e.getSource()).setState(1<0);
naif(x>2){Checkbox b=(Checkbox)e.getSource();b.setState(1<0);b.setEnabled(1<0);}
C ++ 11 / Qt5.2 -
561481433423369Bo czemu nie.
Szokujące jest to, że na dzień dzisiejszy jesteśmy niżsi od Pythona i bezbłędnego C # i związany z Javą!
Podziękowania dla EveBird za zmniejszenie go z 561 do 481.
I jeszcze raz EveBird skraca go z 481 do 433!
Wziąłem kilka z połączeniem lambda
Do 389 z inicjalizatorami C ++ 11
I 373 bez osobnej klasy
Usunięto kilka spacji - 369
Golf'd:
Rodzaj gry w golfa:
źródło
QWidget m
zQDialog m
im.show();a.exec()
zm.exec()
.CoffeeScript -
167, 154Port CoffeeScript w odpowiedzi @Matt .
Nieco golfisty:
JSFiddle .
źródło
PHP, JavaScript, jQuery - 135b
Podziwiałem odpowiedź @ nderscore, ale potem postanowiłem go skopiować i poprawić.
Zasadniczo zamieniłem jego
.join
sztuczkę na wstępne przetwarzanie hipertekstowe PHP.źródło
SELECT ANY TWO<?=($m="<input type=checkbox onclick=(a=$('input:not(:checked)')).prop('disabled',!a[1])>").FAST.$m.GOOD.$m.CHEAP;
Rubinowy,
219218 bajtówUżywam tych samych widżetów Tk, co odpowiedź Quhonunx na Python 3 .
Ten program łamie reguły, ponieważ ma listę pól wyboru . (Reguły mówiły: „Nie używaj listy pól wyboru”). Tak,
a
jest tablicą 3 obiektów TkCheckButton i uważam, że tablica jest listą. Moja obrona polega na tym, że nie użyłem żadnej istniejącej listy pól wyboru, ale użyłem standardowych pól wyboru i utworzyłem własną listę.Testowałem z Ruby 2.1.0 i Tk 8.5.15.
o[c]
jest predykatem do sprawdzenia, czyc
wybrany jest przycisk wyboru. Przy domyślnych ciągach,c.variable.value
jest'0'
lub'1'
, więc porównanie ciągów jest prawdziwe tylko wtedy, gdy'1'>'0'
. EDYCJA: Zapisałem 1 bajt (219 do 218), zmieniając'0'
na?0
. W Ruby?0
jest stałą postaci.a.count(&o)
używa predykatu, aby policzyć wybrane przyciski wyboru.a.map
pętlę dla wszystkich przycisków, tworząc je:normal
lub:disabled
.źródło
Dzięki Rotem i Johnbot za pomoc w grze w golfa!
C #
343334Ten używa tego samego „oszukiwania” co odpowiedź Java Quincunx - pola wyboru nie są w rzeczywistości wyłączone; po prostu nie pozwalają ci ich sprawdzić, jeśli wynik ten wynosi 3.
Istnieje również drobny błąd, że nie można zamknąć okna po zaznaczeniu trzeciego pola wyboru, chyba że odznaczysz jedno, ponieważ sprawdzanie poprawności nie przejdzie. Ale to jest golf golfowy , więc kogo to obchodzi? ;)
C #
403397374Jest to właściwy, który faktycznie wyłącza trzecie pole wyboru.
Trochę niepolakowanych:
źródło
if(a.Count(b=>b.Checked)==2)e.Cancel=true;
można przepisać jakoe.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);
za.First(b=>!b.Checked).Enabled=a.Count(b=>b.Checked)>1?1<0:a.All(b=>b.Enabled=0<1);
AngularJS - 214
źródło
JavaScript (z jQuery) -
224,222,210,205, 178Dzięki komentarzowi genialnego @Matta zmniejszyłem kod o 27 znaków.
JSFiddle
źródło
$(e+c).length>1
do zadania jako takiego:$(e).not(c).attr(f,$(e+c).length>1)
ponieważ zmieniasz tylko samą wartość logiczną.!!
Przymus i trochę więcej z golfa nie przypisując ciało do 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])})
Matematyka
Bardziej kodowana wersja, jak sugeruje David, 255 znaków :
źródło
h=Checkbox;i=Dynamic;j=Enabled
.h
i dostosować liczbę znaków w nagłówku.skrypt mIRC (
727719 bajtów)Zapomniałem o tym języku do ostatniej pijanej rozmowy.
Więcej należy zakodować w tym języku! Ale musi istnieć sposób, aby zrobić z tego prawdziwy bałagan, aby mógł być tak dobry jak Perl.
Edycja: zauważyłem, że moje izumy Pythona przeciekają i byłem w stanie zmniejszyć kod o 8 bajtów!
źródło
C #,
335333326320308Opierając się na Bobs Answer, moja używa mniej znaków niż jego (335 v 342), ale może nie rozumiem w pełni, jak to policzyć.
Nie golfił
źródło
Select
.==2
a>1
, atrue
literą a1>0
. Możesz także użyćAll
zamiastWhere
iLast
.ToList
jest również krótszy niżToArray
.Groovy -
357221217 znakówPrzeniesiłem rozwiązanie Quincunx do Groovy 2.2.1, używając SwingBuilder (i uczyniłem go jeszcze bardziej Groovier):
Nie golfowany:
źródło
QML -
369315254251248 bajtówOto wersja QML (QtQuick 2.0), podana tylko zawartość pliku .qml. Ten kod wymaga przynajmniej Qt 5.1 do uruchomienia. Nie jest to wielka sprawa, ponieważ jest ogromna w porównaniu do innych rozwiązań ( 248 bajtów ), ale jest to w pełni funkcjonalna aplikacja wieloplatformowa (w tym Android i iOS)! :RE
Aby go uruchomić, zapisz kod w pliku .qml, zainstaluj Qt 5.1 i uruchom qmlscene.exe (lub po prostu qmlscene w systemie Linux), który wyświetli otwarte okno dialogowe pliku. Wybierz plik .qml, w którym zapisałeś kod, i zobacz niesamowity wynik! :RE
źródło
k3 - 95
kod jest tutaj
(źródło: nsl.com )
źródło
JavaScript / jQuery
237 234229Bardzo podobne podejście jak odpowiedź Matta , choć trochę dłużej.
źródło
JavaScript 209 (poprzednio 346)
Skrócony: dziękuję za komentarze.
Funkcja gry w golfa:
Formularz HTML: zapewnia dane wejściowe i wywołuje funkcję. * Formularz używa teraz class = x do grupowania danych wejściowych.
Testowane z NetBeans i Chrome.
źródło
var
, usuwając niepotrzebne nawiasy klamrowe i białe znaki (w tym znaki nowego wiersza). Prawdopodobnie możesz go zmniejszyć, jeśli używasz lambda ES6.getElementsByClassName
np.a=document.getElementsByClassName('q')
.document.a
,document.c
,document.c
również umieścić je bezpośrednio do A []Groovy
Oparty na wersji Java, ale znacznie wyszczuplony;)
Typy zostały zastąpione przez „def”, usunięte średniki, dodaj zastąpione przez <<, 1 <0 zastąpione przez 0, zbieraj do tworzenia pól wyboru, usuwaj inny typ przedmiotów, usuwaj rzucanie pola wyboru, ulepszaj pętle.
źródło
TCL 347
Przynajmniej wyprzedza Python i Javę.
Uwaga: jeśli zaczniesz od zaznaczenia jednego pola wyboru i natychmiastowego usunięcia zaznaczenia, pojawi się błąd. Możesz to naprawić, dodając
110
na końcu pierwszego wiersza.Nie golfowany:
źródło
JavaScript + Knockout: ~ 250 znaków
źródło
AngularJS - 155 ( Demo )
Wersja bez golfa:
źródło
Rubin z butami, 133 znaków
Przykładowe dane wyjściowe:
źródło
AppleScript,
194190 bajtów (całkiem pewne, że to trochę oszukuje ...)Istnieją dwa problemy:
Obejścia:
display alert
komponentem, który daje mi dodatkowe 30 bajtów długości.Rozumowanie za mną, publikując to:
Głównie publikowanie tego, aby pokazać moc AppleScript w interakcji Aqua / GUI.
Jeśli uważasz, że to jest zbyt nieaktualne, poproś mnie o usunięcie.
źródło
FLTK, 303 znaków
Nie golfowany:
Przykładowe dane wyjściowe:
źródło