En tant que programmeurs, nous connaissons tous le dicton suivant: "Vous pouvez l’avoir vite et bien, mais ce ne sera pas bon marché, vous pourrez l’avoir bon ou bon marché, mais ce ne sera pas rapide, ou vous pourrez l’avoir vite et pas cher. , mais ce ne sera pas bon. "
Pour ce défi, vous implémentez un outil de configuration imaginaire pour vos services de programmation personnalisés. Vous devez rendre un ensemble de trois cases à cocher, avec un en-tête "SÉLECTIONNER LES DEUX":
SELECT ANY TWO
☐ FAST
☐ CHEAP
☐ GOOD
Une fois que deux éléments ont été sélectionnés, le troisième élément doit être désactivé. Lors de la désélection de l'un des deux éléments sélectionnés, toutes les options doivent à nouveau être activées. En d'autres termes, si zéro ou un élément est sélectionné, tous sont toujours activés, mais si deux éléments sont sélectionnés, le troisième doit être désactivé.
Pas de contrôles spéciaux autorisés. Les cases à cocher doivent être les cases à cocher standard dans la langue de votre choix. Par exemple, n'utilisez pas un contrôle "CheckBoxList", si votre langue en a un. J'imagine que la plupart des entrées seront HTML / jQuery, mais ce n'est pas une règle. C'est le code golf, à la recherche de l'entrée la plus courte.
GAGNANTS JUSQU'A PRÉS
Je vais le diviser en catégories. Il y a des gagnants clairs:
jQuery: nderscore, M. Tenacity Moins de 100b lorsque vous excluez le texte "ressources". Une mention honorable devrait également être adressée à Matt pour avoir présenté les concepts jQuery dont beaucoup se sont inspirés.
Dyalog APL: marinus, alias Mr. Unicode Comment tapez-vous toutes ces choses? Je peux voir pourquoi vous voudriez écrire des programmes courts.
PHP: SuperScript Je crois que c'est l'entrée la plus courte qui désactive plutôt que de désélectionner la troisième option, en suivant l'interprétation la plus stricte des règles.
Réponses:
Javascript ( ES5 ) avec jQuery - 143 ( démo )
J'ai modifié la solution de Matt et je l'ai mise au golf aussi loin que je le pense:
Javascript ( ES5 ) sans jQuery -
185175 ( démo )Utiliser jQuery est une sorte de tricherie, alors voici une solution sans:
Si nous sommes autorisés à empêcher l'utilisateur de cocher la 3ème case au lieu de désactiver le champ, nous pouvons le rendre encore plus court:
Avec jQuery -
126123 ( démo )Sans jQuery -
150147 ( démo )la source
.join
est un bon truc!"SELECT ANY TWO0FAST0GOOD0CHEAP".replace(/0/g,
est une autre façon de le faire avec la même longueur.JavaScript -
184169 (avec jQuery)http://jsfiddle.net/L33JK/16/
EDIT: amélioré avec l’aide de @Daniel Lisik - https://codegolf.stackexchange.com/a/26805/16278
la source
undefined
contraint à vrai. Cela et l’affectation des variables sont probablement les seules petites astuces réellement utilisées.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 (sous Windows) (169)
Ceci est une fonction statique, pour la tester si vous ne connaissez pas APL, tapez-la
)ed C
et collez-la dans la fenêtre d'édition, puis exécutez-laC
.Les nouveaux morceaux d'APL ont des mots-clés longs . Je bat encore HTML cependant.
Explication:
'R'⎕WC'Form' 'Select any two',2/⊂S←2/20
: créer un formulaireR
avec titre Sélectionnez deux , taille et position20 20
. Stocke également20 20
dansS
.1 21 41{
...}¨'Fast' 'Cheap' 'Good'
: pour chacune de ces paires de données (nom et coordonnée y, qui sont les seules variables qui diffèrent entre les cases à cocher:('R.',⊃⍵)⎕WC'Button'
: créer un boutonR
avec la première lettre du nom,⍵(⍺1)S'Check'
: avec le bon argument comme titre,(left arg, 1)
comme position, réutilisantS
comme taille etCheck
comme style,('Event' 'Select' 'F')
, qui appelle la fonctionF
lorsque vous cliquez dessus.B←R.(F C G)
: utiliserB
comme abréviation pour les trois cases que nous avons crééesF←{
...}
: définit la fonction de rappel comme:X←B.State
: obtenir l'état pour chaque case à cocher et les stocker dansX
,X∨2≠+/X
: somme X, si elle n'est pas égale à deux, toutes les cases à cocher doivent être actives, si elle est égale à deux, seules les cases à cocher cochées doivent être activesB.Active←
: activer ou désactiver les cases à cocherRésultat:
la source
Python
32,454434...393392 octetsJe pensais que Python devait être plus court que Java. Voici la "preuve" (
EDIT: maintenant c'est vraiment plus court):Pour ceux d'entre vous qui sont curieux de savoir ce que l'
exec
expression exécute réellement, elle exécute ceci (c'est ce que le remplacement fait à la chaîne. Des nouvelles lignes ont été ajoutées pour la lisibilité):Ceci utilise la même logique que ma réponse Java: désélectionnez la case si plus de 2 cases sont cochées.
UnfHeureusement,malheureusement, j'ai dépenséplusmoins,plus d'octets pour le faire.EDITS:
exec
, économisant un énorme octet!exec
(suppression des parenthèses).range(3)
de0,1,2
l'indentation et la modification pour avoir une couche d'onglets. Je\t\t
ne sais pas si cela fonctionnerait au lieu de\t__
(_
est le caractère espace). Enfin atteint ma plus longue réponse en Java.!=
pour un-
.la source
if p[i]
aide d' un auand
lieu d'unif
:if p[i]:s>1 and B[i].toggle();s+=1
.B[i].toggle()
parB[i].deselect()
ne change rien. Je ne sais pas pourquoi c'est ainsi. C'est peut-être une faille avectkinter
Rebol,
219197Ungolfed:
C'est le dialecte Rebol 3 View (r3-gui). Screendump ci-dessous à partir d'Ubuntu Linux:
Mise à jour - Merci à Earl & Graham de Rebol SO Chatroom pour avoir rasé 22 caractères du code - http://chat.stackoverflow.com/transcript/message/16345039#16345039
la source
Java,
421...369351 octetsJava ... parce que Java. Plus beau code:
Exemple d'exécution (différentes tailles de la fenêtre, la première est au démarrage):
Les cases à cocher sont disposées horizontalement; c'est permis . Il en faudrait beaucoup plus pour l'aligner correctement. De plus, je désactive en décochant la case quand on clique dessus , et non en le rendant impossible.
EDITS:
Checkbox
.while
boucle en boucle foreach (merci Lee ); pourquoi je n'y avais pas pensé avant?Frame
etPanel
.la source
if(x>2)((Checkbox)e.getSource()).setState(1<0);
àif(x>2){Checkbox b=(Checkbox)e.getSource();b.setState(1<0);b.setEnabled(1<0);}
C ++ 11 / Qt5.2 -
561481433423369Parce que pourquoi pas
Étonnamment, à ce jour, nous sommes plus courts que Python, et le C # non bogué, et à égalité avec Java!
Crédits à EveBird pour l'avoir réduit de 561 à 481.
Et une fois de plus, EveBird le réduit de 481 à 433!
Pris quelques coups avec un lambda connect
Jusqu'à 389 avec les initialiseurs C ++ 11
Et 373 sans la classe séparée
Suppression de quelques espaces - 369
Golf'd:
Sorte de non-golfée:
la source
QWidget m
parQDialog m
etm.show();a.exec()
avecm.exec()
.CoffeeScript -
167, 154Port CoffeeScript de la réponse de @Matt .
Un peu non-golfé:
JSFiddle .
la source
PHP, Javascript, jQuery - 135b
J'admirais la réponse de @ nderscore, mais j'ai ensuite décidé de le copier et de le remplacer par un.
En gros, j'ai remplacé son
.join
astuce par du prétraitement PHP Hypertext.la source
SELECT ANY TWO<?=($m="<input type=checkbox onclick=(a=$('input:not(:checked)')).prop('disabled',!a[1])>").FAST.$m.GOOD.$m.CHEAP;
Ruby,
219218 octetsJ'utilise les mêmes widgets Tk que la réponse Python 3 de Quincunx.
Ce programme enfreint les règles car il a une liste de cases à cocher . (Les règles disaient: "N'utilisez pas de liste de cases à cocher.") Oui, il
a
s'agit d'un tableau de 3 objets TkCheckButton, et je crois qu'un tableau est une liste. Ma défense est de ne pas utiliser de liste de cases à cocher existante, mais d'utiliser les cases à cocher standard et de créer ma propre liste.J'ai testé avec Ruby 2.1.0 et Tk 8.5.15.
o[c]
est un prédicat à tester si le bouton cocherc
est sélectionné. Avec ou par défaut,c.variable.value
is'0'
ou'1'
, la comparaison de chaînes n'est vraie que si'1'>'0'
. EDIT: J'ai sauvegardé 1 octet (219 à 218) en changeant'0'
à?0
. En Ruby,?0
est une constante de caractère.a.count(&o)
utilise le prédicat pour compter les cases à cocher sélectionnées.a.map
en boucle pour tous les boutons, les rendant:normal
ou:disabled
.la source
Merci à Rotem et Johnbot pour l'aide au golf!
C #
343334Celui-ci utilise la même "astuce" que la réponse Java de Quincunx - les cases à cocher ne sont pas réellement désactivées; ils ne vous permettent tout simplement pas de vérifier si cette vérification fait 3.
Il y a aussi un bug mineur qui vous empêche de fermer la fenêtre après avoir coché la troisième case à moins d'en désélectionner une, car la validation ne passera pas. Mais c'est du code-golf , alors qui s'en soucie? ;)
C #
403397374C’est un bon moyen qui désactive la troisième case à cocher.
Un peu non golfé:
la source
if(a.Count(b=>b.Checked)==2)e.Cancel=true;
être réécrit commee.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);
para.First(b=>!b.Checked).Enabled=a.Count(b=>b.Checked)>1?1<0:a.All(b=>b.Enabled=0<1);
AngularJS - 214
la source
JavaScript (avec jQuery) -
224,222,210,205, 178Grâce à un commentaire de brillant @ Matt, j'ai réduit le code de 27 caractères.
JSFiddle
la source
$(e+c).length>1
dans l'affectation en tant que telle:$(e).not(c).attr(f,$(e+c).length>1)
vous ne modifiez que le booléen lui-même.!!
contrainte et un peu plus de golf avec ne pas assigner le corps à 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
Une version plus codée, suggérée par David, de 255 caractères :
la source
h=Checkbox;i=Dynamic;j=Enabled
.h
et d'ajuster votre nombre de caractères dans l'en-tête.script mIRC (
727719 octets)J'ai oublié cette langue jusqu'à une conversation ivre la nuit dernière.
Plus devrait être codé dans cette langue! Mais il doit y avoir un moyen de faire en sorte que cela devienne un véritable gâchis pour que ce soit aussi efficace que Perl.
Edit: remarqué que mes Python-isms fuyaient et était capable de réduire le code de 8 octets!
la source
C #,
335333326320308Basé sur Bobs Answer, le mien utilise moins de caractères que le sien (335 v 342), mais je ne comprendrais peut-être pas comment compter cela.
Ungolfed
la source
Select
.==2
avec un>1
, et letrue
par un1>0
. Vous pouvez également utiliser unAll
au lieu deWhere
etLast
.ToList
est également plus court queToArray
.Groovy -
357221217 caractèresJ'ai porté la solution de Quincunx sur Groovy 2.2.1, en utilisant SwingBuilder (et je l’ai encore plus rendu en Groovier):
Ungolfed:
la source
QML -
369315254251248 octetsVoici la version QML (QtQuick 2.0), étant donné le contenu du fichier .qml. Ce code nécessite au moins Qt 5.1 pour s'exécuter. Ce n'est pas bien grave, car son rapport est énorme par rapport à d'autres solutions ( 248 octets ), mais il s'agit d'une application multi-plateformes complète (Android et iOs inclus)! :RÉ
Pour l'exécuter, enregistrez le code dans un fichier .qml, installez Qt 5.1 et exécutez qmlscene.exe (ou simplement qmlscene sur linux), ce qui affichera une boîte de dialogue de fichier ouverte. Choisissez le fichier .qml que vous avez enregistré le code et voyez le résultat génial! :RÉ
la source
k3 - 95
le code est ici
(source: nsl.com )
la source
JavaScript / jQuery
237 234229Approche très similaire à celle de Matt , bien qu’un peu plus longue.
la source
JavaScript 209 (avant 346)
Raccourci: merci pour les commentaires.
Fonction golfée:
Formulaire HTML: fournit une entrée et appelle la fonction. * Le formulaire utilise maintenant class = x pour regrouper les entrées.
Testé avec NetBeans et Chrome.
la source
var
s, en supprimant les accolades et les espaces inutiles (y compris les caractères de nouvelle ligne). Vous pourriez probablement le réduire si vous utilisez un ES6 lambda.getElementsByClassName
par exemple.a=document.getElementsByClassName('q')
.document.a
,document.c
,document.c
les mettre aussi directement dans un []Sensationnel
Basé sur la version Java, mais beaucoup allégé;)
Les types ont été remplacés par 'def', les points-virgules ont été supprimés, add a été remplacé par <<, le 1 <0 a été remplacé par 0, collectés pour la création des cases à cocher, a supprimé le type itemevent, supprimé en lançant la case à cocher, a amélioré les boucles.
la source
TCL 347
Au moins, il bat Python et Java.
Remarque: si vous commencez par cocher une case et la désélectionnez immédiatement, vous obtiendrez une erreur. Vous pouvez résoudre ce problème en ajoutant
110
à la fin de la première ligne.Ungolfed:
la source
Javascript + Knockout: ~ 250 caractères
la source
AngularJS - 155 ( démo )
La version non-golfée:
la source
Rubis avec chaussures, 133 personnages
Exemple de sortie:
la source
AppleScript,
194190 octets (à peu près sûr que c'est tricher un peu ...)Deux problèmes existent:
Circonventions:
display alert
composant qui me donne 30 octets de longueur supplémentaires.Raisonnant derrière moi en affichant ceci:
Publier principalement ceci pour montrer la puissance d'AppleScript dans les interactions Aqua / GUI.
Si vous pensez que cela est trop compliqué, demandez-moi de le supprimer.
la source
FLTK, 303 caractères
Ungolfed:
Exemple de sortie:
la source