Como programadores, todos conhecemos o ditado: "Você pode obtê-lo rápido e bom, mas não será barato, você pode obtê-lo barato e bom, mas não será rápido, ou você pode obtê-lo rápido e barato , mas não será bom. "
Para esse desafio, você está implementando uma ferramenta de configuração imaginária para seus serviços de programação personalizados. Você deve renderizar um conjunto de três caixas de seleção, com o cabeçalho "SELECIONAR QUALQUER DOIS":
SELECT ANY TWO
☐ FAST
☐ CHEAP
☐ GOOD
Após a seleção de dois itens, o terceiro item deve ser desativado. Ao desmarcar um dos dois itens selecionados, todas as opções devem ser novamente ativadas. Em outras palavras, se zero ou um item for selecionado, todos ainda estarão ativados, mas se dois itens forem selecionados, o terceiro deverá ser desativado.
Não são permitidos controles especiais. As caixas de seleção devem ser a caixa de seleção padrão no seu idioma de escolha. Por exemplo, não use um controle "CheckBoxList", se o seu idioma tiver um. Estou imaginando que a maioria das entradas será HTML / jQuery, mas isso não é uma regra. Este é o código de golfe, procurando a entrada mais curta.
VENCEDORES ATÉ AGORA
Vou dividir em categorias. Existem alguns vencedores claros:
jQuery: nderscore, Sr. Tenacidade Abaixo de 100b quando você exclui o texto "recursos". Menção honrosa também deve ser dada a Matt por apresentar os conceitos do jQuery dos quais muitos se inspiraram.
Dyalog APL: marinus, também conhecido como Sr. Unicode Como você digita todas essas coisas? Eu posso ver por que você gostaria de escrever programas curtos.
PHP: SuperScript Eu acredito que essa é a entrada mais curta que realmente desativa, em vez de desmarcar a terceira opção, seguindo a interpretação mais estrita das regras.
Respostas:
Javascript ( ES5 ) com jQuery - 143 ( Demo )
Eu modifiquei solução de Matt e golfed-lo, tanto para baixo como eu acho que ele pode ir:
Javascript ( ES5 ) sem jQuery -
185175 ( Demo )Usar o jQuery é meio trapaceiro, então aqui está uma solução sem ele:
Se for permitido impedir o usuário de marcar a terceira caixa em vez de realmente desabilitar o campo, podemos torná-lo ainda mais curto:
Com jQuery -
126123 ( Demo )Sem jQuery -
150147 ( Demo )fonte
.join
é um bom truque!"SELECT ANY TWO0FAST0GOOD0CHEAP".replace(/0/g,
é outra maneira de fazer isso, resultando no mesmo comprimento.JavaScript -
184169 (com jQuery)http://jsfiddle.net/L33JK/16/
EDIT: aprimorado com a ajuda de @Daniel Lisik - https://codegolf.stackexchange.com/a/26805/16278
fonte
undefined
coage para verdadeiro. Isso e a atribuição de variáveis são provavelmente os únicos pequenos truques realmente usados.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 (no Windows) (169)
Esta é uma função estática; para testá-la se você não conhece o APL, digite
)ed C
e cole na janela de edição e executeC
.Os bits mais recentes do APL têm palavras-chave longas . Eu ainda bato HTML embora.
Explicação:
'R'⎕WC'Form' 'Select any two',2/⊂S←2/20
: crie um formulárioR
, com o título Selecione dois, tamanho e posição20 20
. Também armazena20 20
emS
.1 21 41{
...}¨'Fast' 'Cheap' 'Good'
: para cada um desses pares de dados (nome e coordenada y, que são as únicas variáveis que diferem entre as caixas de seleção:('R.',⊃⍵)⎕WC'Button'
: crie um botãoR
com a primeira letra do nome,⍵(⍺1)S'Check'
: com o argumento correto como o título,(left arg, 1)
como posição, reutilizandoS
como tamanho eCheck
estilo,('Event' 'Select' 'F')
, que chama a funçãoF
quando clicado.B←R.(F C G)
: useB
como abreviação para as três caixas de seleção que criamosF←{
...}
: define a função de retorno de chamada como:X←B.State
: obtenha o estado de cada caixa de seleção e armazene-osX
,X∨2≠+/X
: soma X, se não for igual a duas, todas as caixas de seleção devem estar ativas, se for igual a duas apenas caixas de seleção marcadas devem estar ativasB.Active←
: ativar ou desativar as caixas de seleçãoResultado:
fonte
Python
32,454434...393392 bytesEu pensei, Python deve ser mais curto que Java. Aqui está a "prova" (
EDIT: agora é realmente mais curta):Para aqueles que estão curiosos sobre o que a
exec
expressão realmente executa, ela executa isso (é o que as substituições fazem na sequência. Novas linhas adicionadas para facilitar a leitura):Isso usa a mesma lógica da minha resposta Java: desmarque a caixa de seleção se faz com que mais de 2 caixas de seleção sejam selecionadas.
UnfFelizmenteInfelizmente, eu passeimaismenosmais bytes fazendo isso.EDITAR% S:
exec
, economizando 1 byte!exec
extrair dois bytes do (removendo parênteses).range(3)
para0,1,2
e mudando o recuo para ter uma camada de abas. Não tenho certeza se\t\t
funcionaria em vez de\t__
(_
é o caractere de espaço). Finalmente chegou ao mais longo que minha resposta Java já foi.!=
para a-
.fonte
if p[i]
usando umand
em vez de umif
:if p[i]:s>1 and B[i].toggle();s+=1
.B[i].toggle()
porB[i].deselect()
não muda nada. Não tenho ideia do porquê disso. Talvez seja uma falha comtkinter
Rebol,
219197Ungolfed:
Este é o dialeto Rebol 3 View (r3-gui). Screendump abaixo do Ubuntu Linux:
Atualização - Agradecimentos a Earl & Graham, da Rebol SO Chatroom, por barbear 22 caracteres do código - http://chat.stackoverflow.com/transcript/message/16345039#16345039
fonte
Java,
421...369351 bytesJava ... porque Java. Código de aparência melhor:
Exemplo de execução (diferentes tamanhos da janela, o primeiro é na inicialização):
As caixas de seleção são organizadas horizontalmente; isso é permitido . Levaria muito mais para alinhá-lo corretamente. Além disso, estou desativando desmarcando a caixa quando ela é clicada , e não impossibilitando a clicagem.
EDITAR% S:
Checkbox
.while
loop em um loop foreach (obrigado Lee ); por que eu não pensei nisso antes?Frame
ePanel
.fonte
if(x>2)((Checkbox)e.getSource()).setState(1<0);
para #if(x>2){Checkbox b=(Checkbox)e.getSource();b.setState(1<0);b.setEnabled(1<0);}
C ++ 11 / Qt5.2 -
561481433423369Porque porque não?
Surpreendentemente, a partir de agora somos mais curtos que o Python, e o C # que não é buggy, e empatamos com o Java!
Créditos ao EveBird por reduzi-lo de 561 para 481.
E mais uma vez, o EveBird reduz de 481 para 433!
Tirou alguns com uma conexão lambda
Até 389 com inicializadores C ++ 11
E 373 sem a classe separada
Removidos alguns espaços - 369
Golf'd:
Tipo de não golfe:
fonte
QWidget m
porQDialog m
em.show();a.exec()
comm.exec()
.CoffeeScript -
167154Porta CoffeeScript da resposta de @Matt .
Um pouco não-destruído:
JSFiddle .
fonte
PHP, Javascript, jQuery - 135b
Eu estava admirando a resposta de @ nderscore, mas então decidi copiá-lo e colocá-lo em uma lista.
Basicamente, substituí o
.join
truque dele por algum pré-processamento de hipertexto PHP.fonte
SELECT ANY TWO<?=($m="<input type=checkbox onclick=(a=$('input:not(:checked)')).prop('disabled',!a[1])>").FAST.$m.GOOD.$m.CHEAP;
Ruby,
219218 bytesEu uso os mesmos widgets Tk da resposta Python 3 de Quincunx.
Este programa quebra as regras porque possui uma lista de caixas de seleção . (As regras diziam: "Não use uma lista de caixas de seleção".) Sim,
a
é uma matriz de 3 objetos TkCheckButton e acredito que uma matriz seja uma lista. Minha defesa é que eu não usei nenhuma lista de caixas de seleção existente, mas usei as caixas de seleção padrão e fiz minha própria lista.Eu testei com Ruby 2.1.0 e Tk 8.5.15.
o[c]
é um predicado para testar se o botão de seleçãoc
está selecionado. Com as cadeias padrão,c.variable.value
é'0'
ou'1'
, portanto, a comparação de cadeias só é verdadeira se'1'>'0'
. EDIT: salvei 1 byte (219 para 218), alterando'0'
para?0
. Em Ruby,?0
é uma constante de caractere.a.count(&o)
usa o predicado para contar os botões de seleção selecionados.a.map
loop para todos os botões, tornando-os:normal
ou:disabled
.fonte
Agradecemos a Rotem e Johnbot pela ajuda no golfe!
C #
343334Este usa o mesmo "truque" da resposta Java do Quincunx - as caixas de seleção não estão realmente desativadas; elas simplesmente não permitem que você as verifique se essa verificação for 3.
Há também um pequeno erro que você não pode fechar a janela depois de marcar a terceira caixa de seleção, a menos que você desmarque uma, porque a validação não será aprovada. Mas isso é código-golfe , então quem se importa? ;)
C #
403397374Essa é uma opção adequada que realmente desativa a terceira caixa de seleção.
Meio ungolfed:
fonte
if(a.Count(b=>b.Checked)==2)e.Cancel=true;
possível reescrever 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);
pora.First(b=>!b.Checked).Enabled=a.Count(b=>b.Checked)>1?1<0:a.All(b=>b.Enabled=0<1);
AngularJS - 214
fonte
JavaScript (com jQuery) -
224,222,210,205, 178Graças a um comentário do brilhante @Matt, reduzi o código em 27 caracteres.
JSFiddle
fonte
$(e+c).length>1
para a atribuição como tal:$(e).not(c).attr(f,$(e+c).length>1)
uma vez que você está apenas alterando o próprio booleano.!!
coerção e um pouco de golfe extra sem atribuir corpo 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
Uma versão mais codificada, como sugerida por David, 255 caracteres :
fonte
h=Checkbox;i=Dynamic;j=Enabled
.h
e ajustar sua contagem de caracteres no cabeçalho.script mIRC (
727719 bytes)Esqueci esse idioma até uma conversa bêbada na noite passada.
Mais deve ser codificado neste idioma! Mas é preciso haver uma maneira de transformar isso em uma verdadeira bagunça, para que possa ser tão bom quanto o Perl.
Edit: notei que meus Python-isms estão vazando e foi capaz de reduzir o código em 8 bytes!
fonte
C #,
335333326320308Baseado no Bobs Answer, o meu usa menos caracteres que o dele (335 v 342), mas talvez eu não entenda completamente como contar isso.
Ungolfed
fonte
Select
.==2
por um>1
e otrue
por um1>0
. Você também pode usar um emAll
vez deWhere
eLast
.ToList
também é menor queToArray
.Groovy -
357221217 caracteresEu tenho portado solução de Quincunx para Groovy 2.2.1, utilizando SwingBuilder (e tornou ainda mais groovier):
Ungolfed:
fonte
QML -
369315254251248 bytesAqui está a versão QML (QtQuick 2.0), considerando apenas o conteúdo do arquivo .qml. Este código requer pelo menos o Qt 5.1 para ser executado. Não é grande coisa como sua enorme em comparação com outras soluções ( 248 bytes ), mas é um aplicativo de plataforma cruzada com todos os recursos (Android e iOs incluído)! : D
Para executá-lo, salve o código em um arquivo .qml, instale o Qt 5.1 e execute qmlscene.exe (ou apenas qmlscene no linux), que mostrará uma caixa de diálogo de arquivo aberto. Escolha o arquivo .qml no qual você salvou o código e veja o resultado incrível! : D
fonte
k3 - 95
código está aqui
(fonte: nsl.com )
fonte
JavaScript / jQuery
237 234229Abordagem muito semelhante à resposta de Matt , embora um pouco mais.
fonte
JavaScript 209 (eram 346)
Encurtado: obrigado por comentários.
Função Golfed:
Formulário HTML: fornece entrada e chama a função. * O formulário agora usa class = x para agrupar entradas.
Testado com NetBeans e Chrome.
fonte
var
s, removendo chaves e espaços em branco desnecessários (incluindo caracteres de nova linha). Você provavelmente poderia diminuir se usar um lambda ES6.getElementsByClassName
exemplo.a=document.getElementsByClassName('q')
.document.a
,document.c
edocument.c
também os coloque diretamente em []Groovy
Com base na versão Java, mas muito reduzida;)
Os tipos foram substituídos por 'def', ponto-e-vírgula removido, add substituído por <<, o 1 <0 substituído por 0, coletado para criar as caixas de seleção, removeu o tipo de item do item, removeu a seleção da caixa de seleção e aprimorou os loops.
fonte
TCL 347
Pelo menos, supera Python e Java.
Nota: se você começar marcando uma caixa de seleção e desmarcando-a imediatamente, receberá um erro. Você pode corrigi-lo adicionando
110
ao final da primeira linha.Ungolfed:
fonte
Javascript + Nocaute: ~ 250 caracteres
fonte
AngularJS - 155 ( Demonstração )
A versão não destruída:
fonte
Rubi com sapatos, 133 caracteres
Saída de amostra:
fonte
AppleScript,
194190 bytes (com certeza isso está enganando um pouco ...)Existem dois problemas:
Circunstâncias:
display alert
componente que me dá um extra de 30 bytes de comprimento.Raciocínio atrás de mim postando isso:
Poste isso principalmente para mostrar o poder do AppleScript na interação Aqua / GUI.
Se você acha que isso está muito errado, peça para excluir.
fonte
FLTK, 303 caracteres
Ungolfed:
Saída de amostra:
fonte