Als Programmierer kennen wir alle das Sprichwort: "Sie können es schnell und gut haben, aber es wird nicht billig sein, Sie können es billig und gut haben, aber es wird nicht schnell sein, oder Sie können es schnell und billig haben , aber es wird nicht gut sein. "
Für diese Herausforderung implementieren Sie ein imaginäres Konfigurationstool für Ihre benutzerdefinierten Programmierdienste. Sie sollten drei Kontrollkästchen mit der Überschrift "SELECT ANY TWO" rendern:
SELECT ANY TWO
☐ FAST
☐ CHEAP
☐ GOOD
Sobald zwei Elemente ausgewählt wurden, muss das dritte Element deaktiviert werden. Wenn Sie eines der beiden ausgewählten Elemente abwählen, müssen alle Optionen erneut aktiviert werden. Anders ausgedrückt, wenn null oder ein Element ausgewählt ist, sind alle weiterhin aktiviert. Wenn jedoch zwei Elemente ausgewählt sind, muss das dritte deaktiviert werden.
Keine speziellen Kontrollen erlaubt. Die Kontrollkästchen sollten das Standardkontrollkästchen in der Sprache Ihrer Wahl sein. Verwenden Sie beispielsweise kein "CheckBoxList" -Steuerelement, wenn Ihre Sprache eines hat. Ich stelle mir vor, dass die meisten Einträge HTML / jQuery sein werden, aber das ist keine Regel. Dies ist Code Golf, der nach dem kürzesten Eintrag sucht.
GEWINNER BISHER
Ich werde es in Kategorien aufteilen. Es gibt einige klare Gewinner:
jQuery: nderscore, Mr. Tenacity Under 100b, wenn Sie Text "Ressourcen" ausschließen. Lobende Erwähnung sollte auch Matt für die Einführung der jQuery-Konzepte zuteil werden, von denen sich viele inspirieren ließen.
Dyalog APL: Marinus , auch bekannt als Mr. Unicode Wie schreibt man all diese Dinge? Ich kann verstehen, warum Sie kurze Programme schreiben möchten.
PHP: SuperScript Ich glaube, dies ist der kürzeste Eintrag, der die dritte Option deaktiviert, anstatt sie abzuwählen. Dabei wird die strengste Interpretation der Regeln befolgt.
Antworten:
Javascript ( ES5 ) mit jQuery - 143 ( Demo )
Ich habe Matts Lösung modifiziert und es so weit wie möglich ausprobiert:
Javascript ( ES5 ) ohne jQuery -
185175 ( Demo )Die Verwendung von jQuery ist eine Art Betrug. Hier ist eine Lösung ohne jQuery:
Wenn wir den Benutzer daran hindern dürfen, das dritte Kontrollkästchen zu aktivieren, anstatt das Feld tatsächlich zu deaktivieren, können wir es noch kürzer machen:
Mit jQuery -
126123 ( Demo )Ohne jQuery -
150147 ( Demo )quelle
.join
ist ein guter Trick!"SELECT ANY TWO0FAST0GOOD0CHEAP".replace(/0/g,
ist eine andere Möglichkeit, dies zu tun, was zu derselben Länge führt.JavaScript -
184169 (mit jQuery)http://jsfiddle.net/L33JK/16/
BEARBEITEN: Verbessert mit Hilfe von @Daniel Lisik - https://codegolf.stackexchange.com/a/26805/16278
quelle
undefined
zwingt zu wahr. Das und die Variablenbelegung sind wahrscheinlich die einzigen kleinen Tricks, die wirklich angewendet werden.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])})
folgtDyalog APL (unter Windows) (169)
Dies ist eine statische Funktion, um zu testen, ob Sie APL nicht kennen. Geben Sie diese ein
)ed C
und fügen Sie sie in das Bearbeitungsfenster einC
. Führen Sie sie dann aus .Neuere Teile von APL haben lange Schlüsselwörter. Trotzdem habe ich HTML geschlagen.
Erläuterung:
'R'⎕WC'Form' 'Select any two',2/⊂S←2/20
: ein FormularR
mit Titel erstellen Wählen Sie zwei beliebige und Größe und Position20 20
. Läden auch20 20
inS
.1 21 41{
...}¨'Fast' 'Cheap' 'Good'
: für jedes dieser Datenpaare (Name und y-Koordinate, die einzigen Variablen, die sich zwischen den Kontrollkästchen unterscheiden):('R.',⊃⍵)⎕WC'Button'
: erstelle eine SchaltflächeR
mit dem ersten Buchstaben des Namens,⍵(⍺1)S'Check'
: mit dem richtigen Argument als Titel,(left arg, 1)
als Position, WiederverwendungS
als Größe undCheck
als Stil,('Event' 'Select' 'F')
, derF
beim Anklicken die Funktion aufruft .B←R.(F C G)
: Verwenden SieB
als Abkürzung für die drei von uns erstellten KontrollkästchenF←{
...}
: Definiere die Rückruffunktion als:X←B.State
: Status für jedes Kontrollkästchen abrufen und in speichernX
,X∨2≠+/X
: Summe X, wenn dies nicht gleich zwei ist, müssen alle Kontrollkästchen aktiviert sein, wenn dies gleich zwei ist, müssen nur aktivierte Kontrollkästchen aktiviert seinB.Active←
: Aktivieren oder deaktivieren Sie die KontrollkästchenErgebnis:
quelle
Python
32,454434...393392 BytesIch dachte, Python muss kürzer als Java sein. Hier ist der "Beweis" (
EDIT: jetzt ist es wirklich kürzer):Für diejenigen unter Ihnen, die neugierig sind, was der
exec
Ausdruck tatsächlich ausführt, führt er dies aus (dies ist das, was die Ersetzungen für den String tun. Zeilenumbrüche zur besseren Lesbarkeit hinzugefügt):Dies verwendet dieselbe Logik wie meine Java-Antwort: Deaktivieren Sie das Kontrollkästchen, wenn dadurch mehr als 2 Kontrollkästchen aktiviert werden.
Unf ZumGlückLeider verbrachte ichmehrwenigermehr Bytes dies zu tun.EDITS:
exec
, wodurch satte 1 Byte eingespart werden!exec
(Entfernen von Klammern) zu quetschen .range(3)
das0,1,2
Ändern der Einrückung in und das Ändern der Einrückung, um eine Ebene mit Registerkarten zu erhalten. Unsicher, ob\t\t
das funktionieren würde\t__
(_
ist das Leerzeichen). Endlich die längste Java-Antwort, die ich je erhalten habe.!=
für a-
.quelle
if p[i]
Verwendung einesand
anstelle einesif
:if p[i]:s>1 and B[i].toggle();s+=1
.B[i].toggle()
durchB[i].deselect()
ändert nichts. Ich habe keine Ahnung warum das so ist. Vielleicht ist es ein Fehler mittkinter
Rebol,
219197Ungolfed:
Dies ist der Rebol 3 View-Dialekt (r3-gui). Screendump unter Ubuntu Linux:
Update - Dank an Earl & Graham von Rebol SO Chatroom für das Rasieren von 22 Zeichen des Codes - http://chat.stackoverflow.com/transcript/message/16345039#16345039
quelle
Java,
421...369351 BytesJava ... weil Java. Schöner aussehender Code:
Probelauf (verschiedene Größen des Fensters, zuerst beim Start):
Die Kontrollkästchen sind horizontal angeordnet. das ist erlaubt . Es würde viel mehr dauern, um es richtig auszurichten. Außerdem deaktiviere ich das Kontrollkästchen, indem ich es deaktiviere, wenn darauf geklickt wird , und mache es nicht unmöglich, darauf geklickt zu werden.
EDITS:
Checkbox
.while
Schleife in eine foreach-Schleife (danke Lee ); warum habe ich vorher nicht daran gedacht?Frame
und wurden 18 Byte gespartPanel
.quelle
if(x>2)((Checkbox)e.getSource()).setState(1<0);
aufif(x>2){Checkbox b=(Checkbox)e.getSource();b.setState(1<0);b.setEnabled(1<0);}
C ++ 11 / Qt5.2 -
561481433423369Weil warum nicht.
Erschreckenderweise sind wir ab sofort kürzer als Python und das nicht fehlerbehaftete C # und mit Java verbunden!
Dank an EveBird für die Kürzung von 561 auf 481.
Und noch einmal EveBird verkürzt es von 481 auf 433!
Nahm ein paar mit einem Lambda Connect
Bis auf 389 mit C ++ 11-Initialisierern
Und 373 ohne die eigene Klasse
Einige Leerzeichen entfernt - 369
Golf'd:
Art von Un-Golfed:
quelle
QWidget m
mitQDialog m
undm.show();a.exec()
mitm.exec()
.CoffeeScript -
167154CoffeeScript-Port der Antwort von @Matt .
Etwas ungolfed:
JSFiddle .
quelle
PHP, Javascript, jQuery - 135b
Ich habe die Antwort von @ nderscore bewundert, aber dann habe ich beschlossen, ihn zu kopieren und auszuspielen.
Grundsätzlich habe ich seinen
.join
Trick durch eine PHP Hypertext Preprocessing ersetzt.quelle
SELECT ANY TWO<?=($m="<input type=checkbox onclick=(a=$('input:not(:checked)')).prop('disabled',!a[1])>").FAST.$m.GOOD.$m.CHEAP;
Ruby,
219218 BytesIch verwende die gleichen Tk-Widgets wie die Python 3-Antwort von Quincunx.
Dieses Programm verstößt gegen die Regeln, da es eine Kontrollkästchenliste enthält . (Die Regeln besagten: "Keine Kontrollkästchenliste verwenden.") Ja, es
a
handelt sich um ein Array mit 3 TkCheckButton-Objekten, und ich glaube, dass ein Array eine Liste ist. Zu meiner Verteidigung habe ich keine vorhandene Kontrollkästchenliste verwendet, sondern die Standardkontrollkästchen verwendet und eine eigene Liste erstellt.Ich habe mit Ruby 2.1.0 und Tk 8.5.15 getestet.
o[c]
ist ein Prädikat zum Testen, ob die Check-Schaltflächec
ausgewählt ist. Bei den Standardzeichenfolgenc.variable.value
ist'0'
oder'1'
, der Zeichenfolgenvergleich ist also nur wahr, wenn'1'>'0'
. BEARBEITEN: Ich habe 1 Byte (219 bis 218) gespart, indem ich zu geändert'0'
habe?0
. In Ruby?0
ist eine Zeichenkonstante.a.count(&o)
Verwendet das Prädikat, um die ausgewählten Kontrollkästchen zu zählen.a.map
Schleife für alle Schaltflächen auf und macht sie zu:normal
oder:disabled
.quelle
Vielen Dank an Rotem und Johnbot für die Golfhilfe!
C #
343334Dieser verwendet den gleichen "Cheat" wie die Java-Antwort von Quincunx - die Kontrollkästchen sind eigentlich nicht deaktiviert. sie erlauben dir einfach nicht, sie zu überprüfen, wenn diese Prüfung 3 ergibt.
Es gibt auch einen kleinen Fehler, bei dem Sie das Fenster nach dem Aktivieren des dritten Kontrollkästchens nicht schließen können, es sei denn, Sie deaktivieren eines, da die Validierung nicht bestanden wird. Aber das ist Code-Golf , also wen interessiert das? ;)
C #
403397374Dies ist eine richtige Option, mit der das dritte Kontrollkästchen deaktiviert wird.
Ein bisschen ungolfed:
quelle
if(a.Count(b=>b.Checked)==2)e.Cancel=true;
umgeschrieben werden alse.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);
durcha.First(b=>!b.Checked).Enabled=a.Count(b=>b.Checked)>1?1<0:a.All(b=>b.Enabled=0<1);
AngularJS - 214
quelle
JavaScript (mit jQuery) -
224,222,210,205, 178Dank eines Kommentars von brilliant @Matt habe ich den Code um 27 Zeichen reduziert.
JSFiddle
quelle
$(e+c).length>1
in die Zuweisung als solche verschieben,$(e).not(c).attr(f,$(e+c).length>1)
da Sie nur den Booleschen Wert selbst ändern.!!
Zwang und ein bisschen mehr Golf mit dem nicht zugewiesenen Körper zu 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
Eine Code-Golf-Version, wie von David vorgeschlagen, 255 Zeichen :
quelle
h=Checkbox;i=Dynamic;j=Enabled
.h
die Zeichenanzahl in der Überschrift zu verwenden und anzupassen.mIRC-Skript (
727719 Byte)Ich habe diese Sprache bis zu einem betrunkenen Gespräch letzte Nacht vergessen.
Mehr sollte in dieser Sprache codiert werden! Aber es muss eine Möglichkeit geben, dies zu einem echten Chaos zu machen, damit es so gut wie Perl wird.
Edit: habe festgestellt, dass meine Python-Ismen durchgesickert sind und konnte den Code um 8 Bytes reduzieren!
quelle
C #,
335333326320308Basierend auf Bobs Answer verwendet meins weniger Zeichen als sein (335 v 342), aber ich verstehe möglicherweise nicht ganz, wie man das zählt.
Ungolfed
quelle
Select
.==2
mit einem>1
, und dastrue
mit einem1>0
. Sie können auch einAll
anstelle vonWhere
und verwendenLast
.ToList
ist auch kürzer alsToArray
.Groovy -
357221217 ZeichenIch habe die Lösung von Quincunx mit SwingBuilder auf Groovy 2.2.1 portiert (und noch grooviger gemacht):
Ungolfed:
quelle
QML -
369315254251248 BytesHier ist die QML-Version (QtQuick 2.0), die nur den Inhalt der .qml-Datei enthält. Für diesen Code ist mindestens Qt 5.1 erforderlich. Keine große Sache im Vergleich zu anderen Lösungen ( 248 Byte ), aber eine plattformübergreifende Anwendung mit vollem Funktionsumfang (Android und iOS inbegriffen)! : D
Um es auszuführen, speichern Sie den Code in einer .qml-Datei, installieren Sie Qt 5.1 und führen Sie qmlscene.exe (oder nur qmlscene unter Linux) aus. Daraufhin wird ein Dialogfeld mit geöffneten Dateien angezeigt. Wählen Sie die .qml-Datei, in der Sie den Code gespeichert haben, und sehen Sie das großartige Ergebnis! : D
quelle
k3 - 95
Code ist hier
(Quelle: nsl.com )
quelle
JavaScript / jQuery
237 234229Sehr ähnlicher Ansatz wie Matts Antwort , wenn auch etwas länger.
quelle
JavaScript 209 (war 346)
Verkürzt: Danke für Kommentare.
Golf Funktion:
HTML-Formular: Stellt Eingaben bereit und ruft die Funktion auf. * Form verwendet jetzt class = x, um Eingaben zu gruppieren.
Getestet mit NetBeans und Chrome.
quelle
var
verbessern und auf 264 Zeichen reduzieren, indem Sie alle Ihre Zeichen zusammenfassen und unnötige Klammern und Leerzeichen (einschließlich Zeilenumbrüche) entfernen. Sie könnten wahrscheinlich kleiner werden, wenn Sie einen ES6-Lambda verwenden.getElementsByClassName
z.a=document.getElementsByClassName('q')
.document.a
,document.c
,document.c
sie auch direkt in eine put []Groovy
Basiert auf der Java-Version, ist aber stark abgespeckt;)
Typen wurden durch 'def' ersetzt, Semikolons entfernt, durch << ersetzt, die 1 <0 durch 0 ersetzt, zum Erstellen der Kontrollkästchen gesammelt, der Elementevent-Typ entfernt, das Aktivieren des Kontrollkästchens entfernt und die Schleifen verbessert.
quelle
TCL 347
Zumindest schlägt es Python und Java.
Hinweis: Wenn Sie zunächst ein Kontrollkästchen aktivieren und es sofort deaktivieren, wird eine Fehlermeldung angezeigt. Sie können das Problem beheben, indem Sie
110
es am Ende der ersten Zeile einfügen.Ungolfed:
quelle
Javascript + Knockout: ~ 250 Zeichen
quelle
AngularJS - 155 ( Demo )
Die ungolfed Version:
quelle
Ruby with Shoes, 133 Zeichen
Beispielausgabe:
quelle
AppleScript,
194190 Bytes (ziemlich sicher, dass das ein bisschen schummelt ...)Es gibt zwei Probleme:
Umstände:
display alert
Komponente, die mir zusätzliche 30 Bytes Länge gibt.Gründe, warum ich dies poste:
Dies wird hauptsächlich veröffentlicht, um die Leistungsfähigkeit von AppleScript in der Aqua / GUI-Interaktion zu demonstrieren.
Wenn Sie der Meinung sind, dass dies zu unangebracht ist, bitten Sie mich, es zu löschen.
quelle
FLTK, 303 Zeichen
Ungolfed:
Beispielausgabe:
quelle