Como programadores, todos conocemos el dicho: "Puedes tenerlo rápido y bien, pero no será barato, puedes tenerlo barato y bueno, pero no será rápido, o puedes tenerlo rápido y barato , pero no será bueno ".
Para este desafío, está implementando una herramienta de configuración imaginaria para sus servicios de programación personalizados. Debe representar un conjunto de tres casillas de verificación, con el título "SELECCIONE CUALQUIERA DOS":
SELECT ANY TWO
☐ FAST
☐ CHEAP
☐ GOOD
Una vez que se han seleccionado dos elementos, el tercer elemento debe deshabilitarse. Al anular la selección de uno de los dos elementos seleccionados, todas las opciones deben volver a habilitarse. Dicho de otra manera, si se seleccionan cero o un elemento, todos están habilitados, pero si se seleccionan dos elementos, el tercero debe desactivarse.
No se permiten controles especiales. Las casillas de verificación deben ser la casilla de verificación estándar en su idioma de elección. Por ejemplo, no use un control "CheckBoxList", si su idioma tiene uno. Me imagino que la mayoría de las entradas serán HTML / jQuery, pero eso no es una regla. Este es el código de golf, buscando la entrada más corta.
GANADORES HASTA AHORA
Lo dividiré en categorías. Hay algunos ganadores claros:
jQuery: nderscore, Mr. Tenacity Under 100b cuando excluye "recursos" de texto. Mención de honor también debe ir a Matt por presentar los conceptos jQuery de los que muchos se inspiraron.
Dyalog APL: marinus, también conocido como Mr. Unicode ¿Cómo se escriben todas esas cosas? Puedo ver por qué querrías escribir programas cortos.
PHP: SuperScript Creo que esta es la entrada más corta que en realidad desactiva en lugar de deseleccionar la tercera opción, siguiendo la interpretación más estricta de las reglas.
Respuestas:
Javascript ( ES5 ) con jQuery - 143 ( Demo )
He modificado solución de Matt y Jugamos al golf es tan abajo como creo que puede ir:
Javascript ( ES5 ) sin jQuery -
185175 ( Demo )Usar jQuery es una especie de trampa, así que aquí hay una solución sin ella:
Si se nos permite evitar que el usuario marque la tercera casilla en lugar de deshabilitar el campo, podemos hacerlo aún más corto:
Con jQuery -
126123 ( Demo )Sin jQuery -
150147 ( Demostración )fuente
.join
es un buen truco!"SELECT ANY TWO0FAST0GOOD0CHEAP".replace(/0/g,
Es otra forma de hacerlo resultando en la misma longitud.JavaScript -
184169 (con jQuery)http://jsfiddle.net/L33JK/16/
EDITAR: mejorado con la ayuda de @Daniel Lisik - https://codegolf.stackexchange.com/a/26805/16278
fuente
undefined
coacciona a la verdad. Eso y la asignación variable son probablemente los únicos pequeños trucos utilizados realmente.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 (en Windows) (169)
Esta es una función estática, para probarla si no conoce APL, escriba
)ed C
y pegue esto en la ventana de edición, luego ejecúteloC
.Los bits más nuevos de APL tienen palabras clave largas . Aunque todavía vencí a HTML.
Explicación:
'R'⎕WC'Form' 'Select any two',2/⊂S←2/20
: cree un formularioR
, con título Seleccione dos y cualquier tamaño y posición20 20
. También tiendas20 20
enS
.1 21 41{
...}¨'Fast' 'Cheap' 'Good'
: para cada uno de estos pares de datos (nombre y coordenada y, que son las únicas variables que difieren entre las casillas de verificación:('R.',⊃⍵)⎕WC'Button'
: crea un botónR
con la primera letra del nombre,⍵(⍺1)S'Check'
: con el argumento correcto como título,(left arg, 1)
como posición, reutilizandoS
como tamaño yCheck
estilo,('Event' 'Select' 'F')
, que llama a la funciónF
cuando se hace clic.B←R.(F C G)
: utilíceloB
como abreviatura de las tres casillas de verificación que creamosF←{
...}
: define la función de devolución de llamada como:X←B.State
: obtenga el estado de cada casilla de verificación y guárdelosX
,X∨2≠+/X
: suma X, si esto no es igual a dos, todas las casillas de verificación deben estar activas, si es igual a dos, solo las casillas de verificación deben estar activasB.Active←
: habilitar o deshabilitar las casillas de verificaciónResultado:
fuente
Python
32,454434...393392 bytesPensé, Python debe ser más corto que Java. Aquí está la "prueba" (
EDITAR: ahora realmente es más corta):Para aquellos de ustedes que tengan curiosidad sobre lo que la
exec
expresión realmente ejecuta, ejecuta esto (esto es lo que hacen los reemplazos en la cadena. Se agregaron nuevas líneas para facilitar la lectura):Esto utiliza la misma lógica que mi respuesta Java: desmarque la casilla de verificación si hace que se seleccionen más de 2 casillas de verificación.
UNFAfortunadamentePor desgracia, pasémásmenosmás bytes hacer esto.EDICIONES:
exec
, ¡ahorrando la friolera de 1 byte!exec
(eliminar paréntesis).range(3)
a0,1,2
y el cambio de la indentación para tener una capa de pestañas. No estoy seguro de si\t\t
funcionaría en lugar de\t__
(_
es el carácter de espacio). Finalmente llegué a la respuesta Java más larga que he tenido.!=
por a-
.fuente
if p[i]
el uso de unand
lugar de unaif
:if p[i]:s>1 and B[i].toggle();s+=1
.B[i].toggle()
conB[i].deselect()
no cambia nada. No tengo idea de por qué esto es así. Tal vez sea un defecto contkinter
Rebol,
219197Sin golf:
Este es el dialecto Rebol 3 View (r3-gui). Screendump a continuación de Ubuntu Linux:
Actualización : gracias a Earl & Graham de Rebol SO Chatroom por afeitar 22 caracteres del código: http://chat.stackoverflow.com/transcript/message/16345039#16345039
fuente
Java,
421...369351 bytesJava ... porque Java. Código de aspecto más agradable:
Ejecución de muestra (diferentes tamaños de la ventana, primero está en el inicio):
Las casillas de verificación están dispuestas horizontalmente; Esto está permitido . Se necesitaría mucho más para alinearlo correctamente. Además, estoy deshabilitando desmarcando la casilla cuando se hace clic , no haciendo imposible que se haga clic.
EDICIONES:
Checkbox
.while
bucle en un bucle foreach (gracias Lee ); ¿Por qué no pensé en eso antes?Frame
yPanel
.fuente
if(x>2)((Checkbox)e.getSource()).setState(1<0);
aif(x>2){Checkbox b=(Checkbox)e.getSource();b.setState(1<0);b.setEnabled(1<0);}
C ++ 11 / Qt5.2 -
561481433423369Porque, porque no.
Sorprendentemente, a partir de ahora somos más bajos que Python, y el C # sin errores, ¡y atados con Java!
Créditos a EveBird por reducirlo de 561 a 481.
¡Y una vez más EveBird lo acorta de 481 a 433!
Tomó algunos con una conexión lambda
Hasta 389 con inicializadores C ++ 11
Y 373 sin la clase separada
Eliminado algunos espacios - 369
Golf'd:
Tipo de sin golf:
fuente
QWidget m
conQDialog m
ym.show();a.exec()
conm.exec()
.CoffeeScript -
167154Puerto CoffeeScript de la respuesta de @Matt .
Algo no golfista:
JSFiddle .
fuente
PHP, Javascript, jQuery - 135b
Estaba admirando la respuesta de @ nderscore, pero luego decidí copiarlo y unirlo.
Básicamente, reemplacé su
.join
truco con un preprocesamiento de hipertexto PHP.fuente
SELECT ANY TWO<?=($m="<input type=checkbox onclick=(a=$('input:not(:checked)')).prop('disabled',!a[1])>").FAST.$m.GOOD.$m.CHEAP;
Rubí,
219218 bytesUso los mismos widgets Tk que la respuesta de Python 3 de Quincunx.
Este programa rompe las reglas porque tiene una lista de casillas de verificación . (Las reglas decían: "No use una lista de casillas de verificación"). Sí,
a
es una matriz de 3 objetos TkCheckButton, y creo que una matriz es una lista. Mi defensa es que no utilicé ninguna lista de casillas de verificación existente, pero utilicé las casillas de verificación estándar e hice mi propia lista.Probé con Ruby 2.1.0 y Tk 8.5.15.
o[c]
es un predicado para probar sic
se selecciona el botón de verificación . Con las cadenas predeterminadas,c.variable.value
es'0'
o'1'
, por lo que la comparación de cadenas solo es verdadera si'1'>'0'
. EDITAR: guardé 1 byte (219 a 218) cambiando'0'
a?0
. En Ruby,?0
es un personaje constante.a.count(&o)
usa el predicado para contar los botones de verificación seleccionados.a.map
al bucle para todos los botones, haciéndolos:normal
o:disabled
.fuente
¡Gracias a Rotem y Johnbot por la ayuda en el golf!
C #
343334Éste usa el mismo "truco" que la respuesta Java de Quincunx : las casillas de verificación no están realmente desactivadas; simplemente no le permiten verificarlos si ese cheque es 3.
También hay un error menor que no puede cerrar la ventana después de seleccionar la tercera casilla de verificación a menos que deseleccione uno, porque la validación no pasará. Pero esto es golf de código , entonces, ¿a quién le importa? ;)
C #
403397374Esta es una correcta que deshabilita la tercera casilla de verificación.
Un poco desanimado:
fuente
if(a.Count(b=>b.Checked)==2)e.Cancel=true;
reescribir comoe.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);
cona.First(b=>!b.Checked).Enabled=a.Count(b=>b.Checked)>1?1<0:a.All(b=>b.Enabled=0<1);
AngularJS - 214
fuente
JavaScript (con jQuery) -
224,222,210,205, 178Gracias a un comentario del brillante @Matt reduje el código en 27 caracteres.
JSFiddle
fuente
$(e+c).length>1
a la tarea como tal:$(e).not(c).attr(f,$(e+c).length>1)
ya que solo está cambiando el booleano.!!
coerción y un poco de golf extra con no asignar cuerpo a 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
Una versión más codificada como sugiere David, 255 caracteres :
fuente
h=Checkbox;i=Dynamic;j=Enabled
.h
y ajustar su recuento de caracteres en el encabezado.script de mIRC (
727719 bytes)Olvidé este idioma hasta una conversación borracha anoche.
¡Más debe codificarse en este idioma! Pero debe haber una manera de convertir esto en un verdadero desastre para que pueda ser tan bueno como Perl.
Editar: ¡noté que mis Python-isms se filtraban y pude reducir el código en 8 bytes!
fuente
C #,
335333326320308Basado en Bobs Answer, el mío usa menos caracteres que el suyo (335 v 342), pero es posible que no entienda completamente cómo contar esto.
Sin golf
fuente
Select
.==2
de una>1
, y latrue
de una1>0
. También puede usar un enAll
lugar deWhere
yLast
.ToList
También es más corto queToArray
.Groovy -
357221217 caracteresMe he portado solución de QUINCUNCIO a Groovy 2.2.1, utilizando SwingBuilder (y lo hizo aún más groovy):
Sin golf:
fuente
QML -
369315254251248 bytesAquí va la versión QML (QtQuick 2.0), dado solo el contenido del archivo .qml. Este código requiere Qt 5.1 al menos para ejecutarse. ¡No es un gran problema ya que es enorme en comparación con otras soluciones ( 248 bytes ), pero es una aplicación multiplataforma con todas las funciones (Android e iOs incluidos)! :RE
Para ejecutarlo, guarde el código en un archivo .qml, instale Qt 5.1 y ejecute qmlscene.exe (o simplemente qmlscene en linux), que mostrará un diálogo de archivo abierto. ¡Elija el archivo .qml en el que ha guardado el código y vea el increíble resultado! :RE
fuente
k3 - 95
el código está aquí
(fuente: nsl.com )
fuente
JavaScript / jQuery
237 234229Enfoque muy similar a la respuesta de Matt , aunque un poco más.
fuente
JavaScript 209 (antes 346)
Acortado: gracias por los comentarios.
Función de golf:
Forma HTML: proporciona entrada y llama a la función. * El formulario ahora usa class = x para agrupar entradas.
Probado con NetBeans y Chrome.
fuente
var
correos electrónicos, eliminando llaves y espacios en blanco innecesarios (incluidos los caracteres de nueva línea). Probablemente podría hacerlo más pequeño si usa un lambda ES6.getElementsByClassName
eg.a=document.getElementsByClassName('q')
.document.a
,document.c
,document.c
también ponerlos directamente en un []Maravilloso
Basado en la versión de Java, pero adelgazado mucho;)
Los tipos fueron reemplazados por 'def', los puntos y comas fueron removidos, agregar reemplazado por <<, el 1 <0 reemplazado por 0, recolectar para crear las casillas de verificación, eliminar el tipo de evento iterativo, eliminar la conversión de casillas de verificación, mejorar los bucles.
fuente
TCL 347
Al menos supera a Python y Java.
Nota: si comienza seleccionando una casilla de verificación e inmediatamente deseleccionándola, recibirá un error. Puede solucionarlo agregando
110
al final de la primera línea.Sin golf:
fuente
Javascript + Knockout: ~ 250 caracteres
fuente
AngularJS - 155 ( Demo )
La versión sin golf:
fuente
Ruby with Shoes, 133 caracteres.
Salida de muestra:
fuente
AppleScript,
194190 Bytes (bastante seguro de que esto está engañando un poco ...)Existen dos problemas:
Circunvenciones:
display alert
componente que me da 30 bytes adicionales de longitud.Razonamiento detrás de mí publicando esto:
Principalmente publicando esto para mostrar el poder de AppleScript en la interacción Aqua / GUI.
Si cree que esto está demasiado apagado, solicite que lo elimine.
fuente
FLTK, 303 caracteres
Sin golf:
Salida de muestra:
fuente