Быстро, дешево и хорошо - выбирайте любые два


43

Как программисты, мы все знаем поговорку: «Вы можете иметь это быстро и хорошо, но это не будет дешево, вы можете иметь это дешево и хорошо, но это не будет быстро, или вы можете иметь это быстро и дешево». , но это не будет хорошо. "

Для решения этой задачи вы реализуете воображаемый инструмент конфигурации для своих пользовательских служб программирования. Вам следует отобразить набор из трех флажков с заголовком «ВЫБРАТЬ ЛЮБОЙ ДВА»:

SELECT ANY TWO  
☐ FAST  
☐ CHEAP  
☐ GOOD

Как только два элемента были выбраны, третий элемент должен быть отключен. После отмены выбора одного из двух выбранных элементов все параметры должны быть снова включены. Другими словами, если выбран ноль или один элемент, все они все еще включены, но если выбраны два элемента, третий должен быть отключен.

Никаких специальных элементов управления не допускается. Флажки должны быть стандартными на вашем языке. Например, не используйте элемент управления «CheckBoxList», если он есть у вашего языка. Я предполагаю, что большинство записей будет HTML / JQuery, но это не правило. Это код гольф, ищущий самую короткую запись.

ПОБЕДИТЕЛИ ТАК ДАЛЕЕ

Я разобью его на категории. Есть несколько явных победителей:

jQuery: nderscore, Mr. Tenacity Менее 100b, если исключить текстовые «ресурсы». Также стоит упомянуть Мэтта за представление концепций jQuery, которые вдохновили многих.

Dyalog APL: marinus, он же мистер Юникод. Как вы печатаете все эти вещи? Я понимаю, почему вы хотите писать короткие программы.

PHP: SuperScript Я считаю, что это самая короткая запись, которая фактически отключает, а не отменяет выбор третьей опции, следуя самой строгой интерпретации правил.


Можно ли сделать так, чтобы за раз можно было выбрать только два? Так что выбор третьего отменяет выбор одного из других? Или, возможно, добавить кнопку подтверждения, которая становится серой, если выбраны 3 варианта?
Джастин

7
@Quincunx - Так как не существует эвристики (вне чтения мыслей), которая могла бы решить, какой из них отменить, это могло бы сбить пользователя с толку ... поэтому я должен сказать нет, потому что мы не хотим, чтобы первое впечатление наши нестандартные программные сервисы должны быть плохими. ;)
Брюс Пирсон

Этот вопрос интересовал меня в tkinter в Python 3, поэтому я пытаюсь узнать это сейчас. ИМО, лучший способ изучить GUI - методом проб и ошибок. Я попробовал это: ideone.com/YHLZIQ . Результат: быстрое открытие новых графических интерфейсов. Мне пришлось открыть диспетчер задач, чтобы закрыть их. :-). Изображение (число вскоре поднялось до 340: i.stack.imgur.com/c9wQi.png )
Джастин

Бонусный конкурс должен быть другим вопросом, так как не существует объективного первичного критерия выигрыша или какого-либо описания «бонуса». Он сказал, что код должен быть «... элегантным и гибким ...» и «... кратким и ясным ...», что противоречит код-гольфу . VTC так же неясно, о чем вы спрашиваете. Пожалуйста, не меняйте радикально вопросы задолго до того, как они будут заданы.
user80551

1
@BrucePierson На самом деле, есть. Мы можем отменить выбор самого старого выбранного флажка. Тем не менее, код для этого будет гораздо больше, чем код, который вам требуется.
Джастин

Ответы:


23

Javascript ( ES5 ) с jQuery - 143 ( демо )

Я изменил решение Мэтта и поиграл в него как можно дальше:

$("*").html(["SELECT ANY TWO","FAST","GOOD","CHEAP"].join("<input type=checkbox onclick=(a=$('input:not(:checked)')).prop('disabled',!a[1])>"))

Javascript ( ES5 ) без jQuery - 185 175 ( демо )

Использование jQuery - это обман, так что вот решение без него:

(d=document).write(["SELECT ANY TWO","FAST","GOOD","CHEAP"].join("<input type=checkbox onclick='for(b in a=d.querySelectorAll(\"input:not(:checked)\"))a[b].disabled=!a[1]'>"))

Если нам разрешено запретить пользователю устанавливать 3-й флажок вместо фактического отключения поля, мы можем сделать его еще короче:

С JQuery - 126 123 ( демо )

$("*").html(["SELECT ANY TWO","FAST","GOOD","CHEAP"].join("<input type=checkbox onclick=this.checked*=!$(':checked')[2]>"))

Без jQuery - 150 147 ( демо )

(d=document).write(["SELECT ANY TWO","FAST","GOOD","CHEAP"].join("<input type=checkbox onclick=this.checked*=!d.querySelectorAll(':checked')[2]>"))

Круто. Использование .joinэто хороший трюк!
Робби Уксиз,

1
"SELECT ANY TWO0FAST0GOOD0CHEAP".replace(/0/g,это еще один способ сделать это в результате той же длины.
nderscore

просто привередливая, jquery-версия должна использовать prop, а не attr
Einacio

@ Einacio твое желание - моя команда!
nderscore

5
@Einacio Но Codegolf о худших практиках! : P
nderscore

29

JavaScript - 184 169 (с помощью jQuery)

b="input",a="<input type=checkbox>",c=":checked";$("body").html("SELECT ANY TWO"+a+"FAST"+a+"GOOD"+a+"CHEAP").click(function(){$(b).not(c).attr("disabled",!!$(b+c)[1])})

http://jsfiddle.net/L33JK/16/

РЕДАКТИРОВАТЬ: улучшено с помощью @Daniel Lisik - https://codegolf.stackexchange.com/a/26805/16278


5
Ницца! Недостаточно репутации, чтобы ответить, но вы наняты!
Брюс Пирсон

2
Чем больше я на это смотрю, тем больше я учусь. Хитрость назначения переменных внутри селектора jQuery. Очень круто. Кроме того, не могли бы вы объяснить, что делает "двойной взрыв" (!!)?
Брюс Пирсон

1
Одиночный взрыв приводит к булевому значению, а двойной, очевидно, инвертирует это. undefinedпринуждает к истине. Это и присвоение переменных, вероятно, единственные маленькие хитрости, используемые на самом деле.
Мэтт

Ваш код может быть сокращен до 179 символов, например: 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/15
display-name-is-отсутствующий


12

Dyalog APL (на Windows) (169)

Это статическая функция, чтобы проверить ее, если вы не знаете APL, введите )ed Cи вставьте ее в окно редактирования, затем запустите C.

C
'R'⎕WC'Form' 'Select any two',2/⊂S←2/20
1 21 41{('R.',⊃⍵)⎕WC'Button'⍵(⍺1)S'Check'('Event' 'Select' 'F')}¨'Fast' 'Cheap' 'Good'
B←R.(F C G)
F←{B.Active←X∨2≠+/X←B.State}

Новые биты APL имеют длинные ключевые слова. Я все еще бью HTML, хотя.

Объяснение:

  • 'R'⎕WC'Form' 'Select any two',2/⊂S←2/20: создать форму Rс заголовком. Выберите любые два, размер и положение 20 20. Также магазины 20 20в S.
  • 1 21 41{... }¨'Fast' 'Cheap' 'Good': для каждой из этих пар данных (имя и координата y, которые являются единственными переменными, которые отличаются между флажками:
    • ('R.',⊃⍵)⎕WC'Button': создать кнопку Rс первой буквой имени,
    • ⍵(⍺1)S'Check': с правильным аргументом в качестве заголовка, в (left arg, 1)качестве позиции, повторного использования Sв качестве размера и Checkстиля,
    • ('Event' 'Select' 'F'), который вызывает функцию Fпри нажатии.
  • B←R.(F C G): используйте Bкак сокращение для трех флажков, которые мы создали
  • F←{... }: определить функцию обратного вызова как:
    • X←B.State: получить состояние для каждого флажка и сохранить их X,
    • X∨2≠+/X: sum X, если это значение не равно двум, все флажки должны быть активными, если оно равно двум, только флажки должны быть активными
    • B.Active←: включить или отключить флажки

Результат:

Скриншот


Отличное объяснение, спасибо!
Брюс Пирсон

11

Python 3 2, 454 434 ... 393 392 байта

Я думал, Python должен быть короче, чем Java. Вот «доказательство» ( РЕДАКТИРОВАТЬ: теперь оно действительно короче ):

from Tkinter import*
t=Tk()
r=str.replace
exec r(r(r(r('a@b@c@l=Label(t,text="SELECT ANY TWO");A`FAST|a);B`CHEAP|b);C`GOOD|c);l^A^B^C^','`','=Checkbutton(t,text="'),'|','",v='),'^','.pack();'),'@','=IntVar();')
def f(p,b,B,s):
 for i in 0,1,2:
    y=b[i].get()
    if p[i]-y:
     p[i]=y;s-=1
     if p[i]:s>0and B[i].toggle();s+=2
 t.after(1,f,p,b,B,s)
t.after(1,f,[0]*3,[a,b,c],[A,B,C],0)
t.mainloop()

Для тех из вас, кто интересуется тем, что на execсамом деле выполняет выражение, он выполняет это (это то, что заменители делают со строкой. Новые строки добавлены для удобства чтения):

a=IntVar();
b=IntVar();
c=IntVar();
l=Label(t,text="SELECT ANY TWO");
A=Checkbutton(t,text="FAST",v=a);
B=Checkbutton(t,text="CHEAP",v=b);
C=Checkbutton(t,text="GOOD",v=c);
l.pack();
A.pack();
B.pack();
C.pack();

При этом используется та же логика, что и в моем ответе на Java: снимите флажок, если он вызывает выбор более 2 флажков. Unf К счастью , к сожалению, я потратил больше меньше больше байт , делая это.

введите описание изображения здесь

правок:

  1. массивная настройка кода для использования exec, сохраняя колоссальный 1 байт!
  2. переключился на python 2, чтобы сжать два байта из exec(удаляя скобки).
  3. больше игры в гольф. Включает в себя изменения range(3)в 0,1,2и изменения отступов иметь один слой вкладок. Не уверен, если \t\tбудет работать вместо \t__( _это символ пробела). Наконец-то добрался самый длинный мой ответ на Java.
  4. использовать заменить трюк
  5. воспользовался предложением Бакиру и еще немного поиграл в гольф. На самом деле сделал его короче, чем Java! Но теперь Java-ответ получил больше, так что это снова дольше. :-(
  6. Используется улучшенная замена трюк .
  7. изменил !=для -.

Интересный подход. +1
cjfaure

Я могу обманывать с турбо режимом на моей клавиатуре. Сначала я проверяю два поля. Во-вторых, я использую Tab, чтобы выделить третий. Теперь я держу пробел в турбо-режиме в течение нескольких секунд. Иногда это проверяет третий флажок!
Kernigh

@kernigh Я полагаю, что это потому, что мой код дошел до точки, где он знает, что блок был переключен, но код не достиг точки, где он повторно переключает блок. Так что, если вы установите флажок в это время (в выключенное состояние), мой код поставит галочку на нем.
Джастин

1
Вы можете избежать отступа блока , начиная с if p[i]используя andвместо if: if p[i]:s>1 and B[i].toggle();s+=1.
Бакуриу

@ Kernigh Я был не прав; замена B[i].toggle()на B[i].deselect()ничего не меняет. Я понятия не имею, почему это так. Возможно, это недостатокtkinter
Джастин

10

Реболь, 219 197

load-gui p: func[p][p/state/value]x: func[v][if all[p a p b p c][set-face v false]] view [title"SELECT ANY TWO"a: check"FAST"on-action[x a]b: check"CHEAP"on-action[x b]c: check"GOOD"on-action[x c]]

Ungolfed:

load-gui    ;; this is temporary while r3-gui is in beta

p: func [p] [p/state/value]

x: func [v] [
    if all [p a p b p c] [set-face v false]
]

view [
    title "SELECT ANY TWO"
    a: check "FAST" on-action [x a]
    b: check "CHEAP" on-action [x b]
    c: check "GOOD" on-action [x c]
]

Это диалект Rebol 3 View (r3-gui). Скриншот ниже из Ubuntu Linux:

пример просмотра rebol 3

Обновление - спасибо Earl & Graham из Rebol SO Chatroom за бритье 22 символов кода - http://chat.stackoverflow.com/transcript/message/16345039#16345039


Это неверный ответ, так как третий отключен, но также отмечен, это означает, что все 3 проверены, поэтому, пожалуйста, исправьте это.
ST3

2
@ ST3 - Боюсь, вы не правы. Флажок «ХОРОШО» не установлен или фактически отключен (мой код просто щелкает по третьему полю, отмеченному как ВЫКЛ). Вот как в представлении Rebol 3 отображается не отмеченный флажок (по умолчанию).
Draegtun

1
@ ST3 и др. - Вот ссылка, показывающая вид флажка по умолчанию, который я описал выше (1-е изображение показывает, что флажки не нажаты, 2-е просто «ХОРОШО») - plus.google.com/u/0/104216037702741908932/posts/Z2EbuQX67aq
draegtun

Хорошо ... Я смотрю на экран печати, который вы добавили, и вижу, что все три флажка отмечены, только один не может быть снят.
ST3

3
@ ST3 - Серый флажок - это только Rebol 3. Посмотрите, как это можно проверить. Галочка становится зеленой, если она отмечена, и становится серой, если не отмечена. Это значения по умолчанию. На изображении в ответе выше вы можете видеть, что «ХОРОШО» в качестве фокуса ввода (размытие синего цвета), потому что его «щелкают», но он остается серым, а не зеленым (поэтому не отмечен).
draegtun

10

Java, 421 ... 369 351 байт

import java.awt.*;class F extends Checkbox{F(String s){super(s);}public static void main(String[]a){new Frame(){{add(new Panel(){{add(new Label("SELECT ANY TWO"));F[]c={new F("FAST"),new F("CHEAP"),new F("GOOD")};for(F b:c){add(b);b.addItemListener(e->{int x=0;for(F d:c)x+=d.getState()?1:0;if(x>2)((F)e.getSource()).setState(1<0);});}}});}}.show();}}

Ява ... потому что ява. Более красивый код:

import java.awt.*;

class F extends Checkbox {
    F(String s) {
        super(s);
    }

    public static void main(String[] a) {
        new Frame() {
            {
                add(new Panel() {
                    {
                        add(new Label("SELECT ANY TWO"));
                        F[] c = {new F("FAST"), new F("CHEAP"), new F("GOOD")};
                        for (F b: c) {
                            add(b);
                            b.addItemListener(e -> {
                                int x = 0;
                                for (F d: c) {
                                    x += d.getState() ? 1 : 0;
                                }
                                if (x > 2) ((F) e.getSource()).setState(1 < 0);
                            });
                        }
                    }
                });
            }
        }.show();
    }
}

Пример запуска (разные размеры окна, сначала при запуске):

введите описание изображения здесь
введите описание изображения здесь
введите описание изображения здесь

Флажки расположены горизонтально; это допускается . Потребовалось бы намного больше, чтобы правильно выровнять его. Кроме того, я отключаю, снимая флажок при его нажатии , а не делая невозможным его нажатие.

правок:

  1. сохранил 3 байта, сделав основной класс расширенным Checkbox.
  2. перечитал лямбда-выражения и понял, что имя типа не нужно. Возьми этот Питон!
  3. преобразовал whileцикл в цикл foreach (спасибо Ли ); почему я не подумал об этом раньше?
  4. сохранил 18 байтов, используя анонимный класс и инициализатор экземпляра для Frameи Panel.

Нет ограничений на выравнивание (поэтому я полагаю, Мэтт мог уменьшить его на 5 символов). Реквизит для полной работающей программы ... но я не вижу, что третий вариант отключен.
Брюс Пирсон

@BrucePierson Это отключено. Это не может быть нажата. Если щелкнуть, ничего не происходит.
Джастин

2
Ах, я думаю, я вижу. Вы сразу "снимаете" отмеченное состояние без отключения? Это было бы приемлемо.
Брюс Пирсон

@BrucePierson Это верно. Чтобы на самом деле отключить, я должен был бы изменить 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);}
Джастин

1
@BrucePierson Всякий раз, когда вы думаете, это выглядит смешно когда это связано с использованием символьного представления некоторой графической вещи, ищите юникод. В качестве альтернативы, для графического дизайна, обратитесь к User Experience SE : i.stack.imgur.com/xFkzy.png
Джастин

7

C ++ 11 / Qt5,2 - 561 481 433 423 369

Потому что почему бы и нет.

Шокирующе, что на данный момент мы короче, чем Python, и C # не глючит, и связаны с Java!

Кредиты EveBird для сокращения его с 561 до 481.

И еще раз EveBird сокращает его с 481 до 433!

Снял несколько с лямбда-коннектом

До 389 с инициализаторами C ++ 11

А 373 без отдельного класса

Удалено несколько пробелов - 369

Golf'd:

#include<QtWidgets>
#define C(x,y,z)z.setEnabled(x.isChecked()+y.isChecked()<2);
#define S(x)l.addWidget(&x);
#define X(x)S(x);x.connect(&x,&QCheckBox::clicked,[&](){C(g,f,c)C(g,c,f)C(f,c,g)});
int main(int n,char**v){QApplication a(n,v);QWidget m;QLabel t{"Select any two"};QCheckBox g{"Good"},f{"Fast"},c{"Cheap"};QVBoxLayout l(&m);S(t)X(g)X(f)X(c)m.show();a.exec();}

Вроде Un-Golfed:

#include<QtWidgets>

#define C(x,y,z)z.setEnabled(x.isChecked()+y.isChecked()<2);
#define S(x)l.addWidget(&x);
#define X(x)S(x);connect(&x, &QCheckBox::clicked, [&](){C(g,f,c)C(g,c,f)C(f,c,g)});

int main(int n,char**v){ 
    QApplication a(n,v);
    QWidget m;
    QLabel t{"Select any two"};
    QCheckBox g{"Good"},f{"Fast"},c{"Cheap"};
    QVBoxLayout l(&m);
    S(t)X(g)X(f)X(c)m.show();
    a.exec();
}

GFC


1
+1 за самозвучное «почему бы и нет» :)
Брюс Пирсон

Может немного улучшить: заменить QWidget mна QDialog mи m.show();a.exec()с m.exec().
Тоби Спейт

6

CoffeeScript - 167154

CoffeeScript порт ответа @Matt .

b="input";a="<input type=checkbox>";c=":checked";$("body").html("SELECT ANY TWO#{a}FAST#{a}GOOD#{a}CHEAP").click ->$(b).not(c).attr "disabled",!!$(b+c)[1]

Немного негольфя

b = "input"
a = "<input type=checkbox>"
c = ":checked"

$( "body" ).html( "SELECT ANY TWO#{a}FAST#{a}GOOD#{a}CHEAP" ).click ->
    $( b ).not( c ).attr "disabled", !!$( b + c )[1]

JSFiddle .


5

PHP, Javascript, JQuery - 135b

Я восхищался ответом @ nderscore, но потом решил скопировать и разыскать его.

<?echo"SELECT ANY TWO".($m="<input type=checkbox onclick=(a=$('input:not(:checked)')).prop('disabled',!a[1])>")."FAST$m GOOD$m CHEAP"?>

По сути, я заменил его .joinтрюк на некоторую предварительную обработку гипертекста PHP.


Если учесть, что для текста «ресурсов» в программе требуется 27 байт, это очень близко к программе размером 100 байт. Отлично сработано!
Брюс Пирсон

1
Я не большой SELECT ANY TWO<?=($m="<input type=checkbox onclick=(a=$('input:not(:checked)')).prop('disabled',!a[1])>").FAST.$m.GOOD.$m.CHEAP;
любитель

5

Рубин, 219 218 байт

Я использую те же виджеты Tk, что и ответ Python 3 от Quincunx.

Эта программа нарушает правила, потому что у нее есть список флажков . (Правила гласили: «Не используйте список флажков».) Да, aэто массив из 3 объектов TkCheckButton, и я считаю, что массив - это список. Моя защита состоит в том, что я не использовал какой-либо существующий список флажков, но я использовал стандартные флажки и создал свой собственный список.

require'tk'
o=->(c){c.variable.value>?0}
TkLabel.new{text'SELECT ANY TWO'
pack}
a=%w[FAST CHEAP GOOD].map{|t|TkCheckButton.new{text t
command{a.map{|c|c.state a.count(&o)<2||o[c]?:normal: :disabled}}
pack}}
Tk.mainloop

ДЕШЕВО и ХОРОШО проверено, но БЫСТРО отключено

Я тестировал с Ruby 2.1.0 и Tk 8.5.15.

  • o[c]предикат для проверки, если cвыбрана кнопка проверки . Со строками по умолчанию c.variable.valueis '0'или '1', поэтому сравнение строк будет только true, если '1'>'0'. РЕДАКТИРОВАТЬ: я сохранил 1 байт (219 до 218), изменив '0'на ?0. В Ruby ?0есть символьная константа.
  • a.count(&o) использует предикат для подсчета выбранных кнопок проверки.
  • Когда пользователь переключает кнопку проверки, команда вызывает a.mapцикл для всех кнопок, делая их :normalили :disabled.

1
Очень хорошо. Здесь нет нарушения правил - я имел в виду элемент управления списком флажков, который может оказаться частью языковой структуры. Я считаю, что все ответы до сих пор используют какую-то карту или селектор, так что это абсолютно законно.
Брюс Пирсон

5

Спасибо Rotem и Johnbot за помощь в игре в гольф!

C # 343 334

Этот использует тот же «чит», что и в ответе Quincunx на Java - флажки на самом деле не отключены; они просто не позволяют вам проверить их, если эта проверка составляет 3.

using System.Windows.Forms;using System.Linq;class P:Form{static void Main(){P p=new P();p.Text="SELECT ANY TWO";int y=0;var a=new CheckBox[3];foreach(var n in "FAST CHEAP GOOD".Split()){var c=new CheckBox();a[y]=c;c.Top=y++*50;c.Text=n;c.Validating+=(s,e)=>{if(a.Count(b=>b.Checked)>1)e.Cancel=true;};p.Controls.Add(c);}Application.Run(p);}}

Также есть небольшая ошибка, которую нельзя закрыть после выбора третьего флажка, если только вы не отмените выбор, потому что проверка не пройдет. Но это , так кого это волнует? ;)

C # 403 397 374

Это правильный, который фактически отключает третий флажок.

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)=>{a.First(b=>!b.Checked).Enabled=a.Count(b=>b.Checked)>1?1<0:a.All(b=>b.Enabled=0<1);};p.Controls.Add(c);return c;}).ToArray();Application.Run(p);}}

Скриншот

В некотором роде, не в гольфе

using System.Windows.Forms;
using System.Linq;

class P:Form
{
    static void Main()
    {
        P p = new P();
        p.Text = "SELECT ANY TWO";
        int y = 0;
        var a = new CheckBox[3];
        foreach (var n in "FAST CHEAP GOOD".Split())
        {
            var c = new CheckBox(); a[y] = c; c.Top = y++ * 50; c.Text = n; c.Click += (s, e) =>
            {
                if (a.Count(b => b.Checked) == 2)
                {
                    a.First(b => !b.Checked).Enabled = false;
                }
                else
                {
                    foreach (var b in a) b.Enabled = true;
                }
            };
            p.Controls.Add(c);
        }
        Application.Run(p);
    }
}

1
Не может if(a.Count(b=>b.Checked)==2)e.Cancel=true;быть переписан как e.Cancel=a.Count(b=>b.Checked)==2;?
Rotem

@Rotem Да, да, может. Я тупой. И есть аналогичная оптимизация для другого. Благодарность!
Боб

Подождите, нет, не для другого. Эх, еще сохранил несколько символов.
Боб

1
Если вы переключаете наследование на CheckBox, используете инициализаторы объектов и немного злоупотребляете Linq, вы можете получить правильное значение до 374: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);}}
Johnbot

1
364, если вы используете условный оператор вместо оператора if. Заменить if(a.Count(b=>b.Checked)>1){a.First(b=>!b.Ch‌​ecked).Enabled=1<0;}else a.All(b=>b.Enabled=0<1);наa.First(b=>!b.Checked).Enabled=a.Count(b=>b.Checked)>1?1<0:a.All(b=>b.Enabled=0<1);
Johnbot

5

AngularJS - 214

<input type=checkbox ng-model=fast ng-disabled=cheap&&good>FAST</input>
<input type=checkbox ng-model=cheap ng-disabled=fast&&good>CHEAP</input>
<input type=checkbox ng-model=good ng-disabled=fast&&cheap>GOOD</input>

Я попробовал это в JSFiddle, но безуспешно . Можете ли вы привести рабочий пример?
брезгливое оссифраж


Вы не упомянули «нг-приложение». Проверьте <head> в моем примере.
user12345

1
Ах, хорошо :-) Вы можете немного поиграть , удалив кавычки и дополнительные разрывы строк.
брезгливое оссифраж

4

JavaScript (с jQuery) - 224 , 222 , 210 , 205 , 178

a="<input type=checkbox>",c=":checked",e="input",f="disabled",d=$("body").html("SELECT ANY TWO"+a+" FAST"+a+"CHEAP"+a+"GOOD").click(function(){$(e).not(c).attr(f,$(e+c).length>1)})

Благодаря комментарию от блестящего @Matt я сократил код на 27 символов.

JSFiddle


Сохраните 25 или около того, переместив свое условие $(e+c).length>1в задание как таковое: $(e).not(c).attr(f,$(e+c).length>1)поскольку вы меняете только логическое значение.
Мэтт

1
Удалось снизить его до 169, используя смесь твоего и моего. !!Принуждение и немного больше играть в гольф с не назначая тело г. 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])})
Мэтт

4

Mathematica

Более кодовая версия, предложенная Дэвидом, 255 символов :

h = Checkbox;
i = Dynamic;
j = Enabled;
t = True;
i[
 If[Total@Boole@{a, b, c} == 2,
  {d, e, f} = {a, b, c},
  {d, e, f} = {t, t, t}
  ];
 Row@{
   "SELECT ANY TWO",
   h[i@a, j -> d], "FAST",
   h[i@b, j -> e], "CHEAP",
   h[i@c, j -> f], "GOOD"
   }
 ]

Вы можете сохранить некоторые символы с помощью h=Checkbox;i=Dynamic;j=Enabled.
DavidC

@DavidCarraher Спасибо, я вижу, что буду использовать эту технику и для других вопросов, связанных с гольфом в будущем.

1
Не нужно включать обе версии. И не забудьте использовать hи настроить количество символов в заголовке.
DavidC

4

сценарий mIRC ( 727 719 байт)

Забыл об этом языке до пьяного разговора прошлой ночью.

alias select_two {
  dialog -m s2 s2
}

dialog s2 {
  title "Select any two:"
  size -1 -1 200 100
  check "Fast",1, 5 10 170 25
  check "Cheap",2, 5 30 170 25
  check "Good",3, 5 50 170 25 
}

on *:dialog:s2:sclick:*: {
  if ($did(s2, $did).state = 1) {
    if ($did = 1) {
      if ($did(s2, 2).state = 1) { did -b s2 3 }
      if ($did(s2, 3).state = 1) { did -b s2 2 }
    }
    if ($did = 2) {
      if ($did(s2, 1).state = 1) { did -b s2 3 }
      if ($did(s2, 3).state = 1) { did -b s2 1 }
    }
    if ($did = 3) {
      if ($did(s2, 1).state = 1) { did -b s2 2 }
      if ($did(s2, 2).state = 1) { did -b s2 1 }
    }
  }
  if ($did(s2, $did).state = 0) {
    did -e s2 1
    did -e s2 2
    did -e s2 3
  }
}

Больше должно быть закодировано на этом языке! Но должен быть способ превратить это в настоящий беспорядок, чтобы он мог быть таким же хорошим, как Perl.

Редактировать: заметил, что мои Python-измы просачиваются и смогли уменьшить код на 8 байт!


Ха-ха, мне нравится вступление к этому. Хотя это довольно многословно - может ли это быть пиво? = c)
Брюс Пирсон

3

C #, 335 333 326 320 308

Исходя из ответа Бобса, мой использует меньше символов, чем его (335 против 342), но я не могу полностью понять, как считать это.

using System.Linq;using System.Windows.Forms;class P:Form{static void Main(){new P();}P(){Text="SELECT ANY TWO";var a="FAST CHEAP GOOD".Split().Select(r=>new CheckBox{Text=r,Top=r[0]%9*20}).ToList();a.All(r=>{r.Validating+=(b,c)=>c.Cancel=a.Count(z=>z.Checked)>1;Controls.Add(r);return 1>0;});ShowDialog();}}

Ungolfed

using System.Linq;
using System.Windows.Forms;

class P : Form
{
    static void Main()
    {
        new P();
    }

    P()
    {
        Text = "SELECT ANY TWO";

        var a = "FAST CHEAP GOOD".Split().Select(r => new CheckBox
        {
            Text = r,
            Top = r[0] % 9 * 20
        }).ToList();

        //loops, I dont need no stinking loops
        a.All(r => { r.Validating += (b, c) => c.Cancel = a.Count(z => z.Checked) > 1; Controls.Add(r); return 1 > 0; });
        ShowDialog();
    }
}

Большое использование функций anon и Linq здесь, особенно как Select.
Брюс Пирсон

Вы можете сохранить еще пару символов, заменив на ==2a >1, а на truea 1>0. Вы также можете использовать Allвместо Whereи Last. ToListтакже короче ToArray.
Боб

@Bob Хороший колл, не знаю, как я пропустил Все (), и в качестве бонуса получается со Всем, что вам не нужно это материализовать, экономя еще больше
iamkrillin

3

Groovy - 357 221 217 символов

Я портировал решение Quincunx на Groovy 2.2.1, используя SwingBuilder (и сделал его еще более Groovier):

c=[];new groovy.swing.SwingBuilder().frame(){panel(){label("SELECT ANY TWO");f={if(c.count{it.isSelected()}>2)it.source.setSelected(1<0)};["FAST","CHEAP","GOOD"].each{c<<checkBox(label:it,itemStateChanged:f)}}}.show()

Ungolfed:

c=[]
new groovy.swing.SwingBuilder().frame() {
    panel() {
        label("SELECT ANY TWO")
        f = { if (c.count{it.isSelected()} > 2) it.source.setSelected(1<0) }
        ["FAST","CHEAP","GOOD"].each { c << checkBox(label: it, itemStateChanged: f) }
    }
}.show()

3

QML - 369 315 254 251 248 байт

Здесь идет версия QML (QtQuick 2.0), содержащая только содержимое файла .qml. Этот код требует для запуска хотя бы Qt 5.1. Не так уж и много, по сравнению с другими решениями ( 248 байт ), но это полнофункциональное кроссплатформенное приложение (включая Android и iO)! : D

    import QtQuick 2.0;import QtQuick.Controls 1.1;Row{Text{text:"SELECT ANY TWO"}CheckBox{id:a;text:"FAST";enabled:!b.checked|!c.checked}CheckBox{id:b;text:"CHEAP";enabled:!a.checked|!c.checked}CheckBox{id:c;text:"GOOD";enabled:!b.checked|!a.checked}}

Горизонтальный макет

Чтобы запустить его, сохраните код в файле .qml, установите Qt 5.1 и запустите qmlscene.exe (или просто qmlscene в linux), который покажет диалог открытия файла. Выберите файл .qml, в который вы сохранили код, и посмотрите на потрясающий результат! : D


3

к3 - 95

a[`FAST`CHEAP`GOOD]:0
a[.;`c]:`check
a..l:"SELECT ANY TWO"
a..t:"if[3=+/a[];.[_v;_i;:;0]]"
`show$`a

код здесь

пробный прогон
(источник: nsl.com )


строка 1: словарь с тремя переменными; строка 2: каждая переменная является флажком; строка 3: обозначить словарь; строка 4: если три переменные были проверены, сбросьте последнюю проверенную переменную на 0; строка 5: показать словарь.
Стеван Аптер

Ницца! У такой трагедии k4 нет GUI ...
mollmerx

k побед (но, боже, ирония! Для публикации сообщения требуется еще 9 символов!)
Stevan Apter

2

JavaScript / jQuery 237 234 229

Очень похожий подход как ответ Мэтта , хотя и немного дольше.

$(function(){var e="input ",t="disabled",n,r;$("body").html("SELECT ANY TWO|FAST|CHEAP|GOOD".replace(/\|/g,"<"+e+'type="checkbox">'));n=$(e);n.change(function(){n.removeAttr(t);r=$(":checked");if(r.length>1)n.not(r).attr(t,t)})})

2

JavaScript 209 (было 346)

Сокращенный: спасибо за комментарии.

function f(){var a=document.getElementsByClassName("x"),n=0,i=0;for(i in a){if(a[i].checked)n++;}if(n<2){for(i in a){a[i].disabled=false;}}else{for(i in a){i(false===a[i].checked){a[i].disabled=true;break;}}}}

Гольф-функция:

function f(a,b,c){
var x=document.getElementById(a);
var y=document.getElementById(b);
var z=document.getElementById(c);
var n=0,i=0;
var a=[x,y,z];
for(i in a)
{
if(a[i].checked) n++;
}
if(n<2)
{
for(i in a)
{
a[i].disabled=false;
}
}
else
{
for(i in a)
{
if(false===a[i].checked)
{
a[i].disabled=true;
break;
}
}
}
}

HTML-форма: обеспечивает ввод и вызывает функцию. * Форма теперь использует class = x для группировки входов.

<form>
        SELECT ANY TWO<br>
        FAST <input id="a" type="checkbox" class="x" value="0" onchange="f()"><br>
        CHEAP <input id="b" type="checkbox" class="x" value="1" onchange="f()"><br>
        GOOD <input id="c" type="checkbox" class="x" value="2" onchange="f()"><br>
    </form>

Протестировано с NetBeans и Chrome.


Вы можете улучшить функцию и уменьшить ее до 264 символов, объединив все свои varсимволы, удалив ненужные скобки и пробелы (включая символы новой строки). Возможно, вы могли бы получить его меньше, если бы использовали ES6 лямбда.
Тони Эллис

Помимо некоторого более очевидного игры в гольф, рассмотрите возможность использования класса, чтобы вместо этого вытянуть все входные элементы в массив одним ударом, используя getElementsByClassNameнапример. a=document.getElementsByClassName('q'),
Мэтт

изменить идентификаторы с именем и просто называть их document.a, document.c, document.cтакже поместить их непосредственно в []
Frieder

2

Groovy

Основано на версии Java, но сильно уменьшено;)

Типы были заменены на 'def', точка с запятой удалена, добавлена ​​замена на <<, 1 <0 заменена на 0, собраны для создания флажков, удален тип itemevent, удалено приведение флажка, улучшены циклы.

import java.awt.*
class F {
    def static main(a) {
        def f = new Frame()
        def p = new Panel()
        f << p
        p << new Label("SELECT ANY TWO")
        def c = ['FAST','CHECK','GOOD'].collect { new Checkbox(it) }
        c.each { b ->
            p << b
            b.addItemListener { e->
                int x = 0, i = 0
                3.times {
                    x += c[it].state ? 1 : 0
                }
                if (x > 2) {
                    e.source.state = 0                        
                }
            }
        }
        f.show()
    }
}

Groovy это не Java. Это означает, что все эти улучшения не имеют большого значения. Все, что вы удалили, было необходимо в Java, но не классно.
Джастин

1
Вы правы, Groovy - это не Java, поэтому он называется Groovy. Я не уверен, что вы пытаетесь сказать здесь.
Эрик Прагт

1

TCL 347

По крайней мере, это лучше, чем Python и Java.

set d .
proc a v {upvar f f c c g g d d $v x
if $x&&$f+$c+$g==2 {set d .$f$c$g
$d configure -state disabled} 
if !$x {$d configure -state normal}}
set z -variable
set y -command
set x checkbutton
label .l -text {SELECT ANY TWO}
$x .011 -text FAST $z f $y a\ f
$x .101 -text CHEAP $z c $y a\ c
$x .110 -text GOOD $z g $y a\ g
pack .l .011 .101 .110

Примечание: если вы начнете с установки одного флажка и немедленного снятия его, вы получите ошибку. Вы можете исправить это, добавив110 в конец первой строки.

Ungolfed:

# Keep track of the last disabled button. Set it to something valid to start with.
set last .110

proc toggled name {
        # Access some globals
        upvar fast  fast
        upvar cheap cheap
        upvar good  good
        upvar last  last
        upvar $name value

        # Just toggled one on, check if exactly two are now on
        if {$value == 1 && ($fast + $cheap + $good) == 2} {
                set last .$fast$cheap$good
                $last configure -state disabled
        }
        # Just toggled one off. Re-enable disabled one.
        if {$value == 0} {
                $last configure -state normal
        }
}

label .label -text {SELECT ANY TWO}

checkbutton .011 -text FAST  -variable fast  -command {toggled fast}
checkbutton .101 -text CHEAP -variable cheap -command {toggled cheap}
checkbutton .110 -text GOOD  -variable good  -command {toggled good}

pack .label .011 .101 .110

1

Javascript + Knockout: ~ 250 символов

a=function(i){return "<input type=checkbox data-bind='value: "+i+", checked: x, disable: x().length>=2 && x().indexOf(\""+i+"\")==-1'>"},document.body.innerHTML = "SELECT ANY TWO"+a(0)+"Fast"+a(1)+"Good"+a(2)+"Cheap"; ko.applyBindings({x:ko.observableArray([])})

0

AngularJS - 155 ( Демо )

SELECT ANY TWO :<i ng-init=t=[]><p ng-repeat="(i,v) in ['FAST','CHEAP','GOOD']"><input type=checkbox ng-disabled=t[(i+1)%3]&&t[(i+2)%3] ng-model=t[i]>{{v}}

Негольфированная версия:

SELECT ANY TWO :
<i ng-init="checkedArray = []" /> <!-- A useless tag to initialize the array (which can't be done on the `input` tag, unfortunately) -->
<p ng-repeat="(key, value) in ['FAST', 'CHEAP', 'GOOD']">
    <input
        type="checkbox"
        ng-model="checkedArray[key]"
        ng-disabled="checkedArray[(key + 1) % 3] && checkedArray[(key + 2) % 3]"
    />
    {{value}}
</p>

0

Рубин с Обуви, 133 персонажа

Shoes.app{para'SELECT ANY TWO'
$o=%w{FAST GOOD CHEAP}.map{|q|c=check{|c|$o[c]=!$o[c];$o.values.all?&&c.checked=p}
para q
[c,p]}.to_h}

Пример вывода:

Скриншот окна обуви


0

AppleScript, 194 190 байт (уверен, это немного обманывает ...)

Существуют две проблемы:

  • В AppleScript нет флажков, только списки.
  • Существует только возможность выбрать ОДИН из списка или ЛЮБУЮ сумму.

: обойти правила

  • Использование бесконечного цикла повторения с точкой останова для выхода при выборе 2 и только 2 элементов в списке.
  • Наказал себя display alertкомпонентом, который дает мне дополнительные 30 байтов длины.

Причины, по которым я опубликовал это:

  • это является способом сделать это в AppleScript.
  • Код не может быть дополнен тремя выбранными параметрами, поэтому третий параметр отменяется расширением .

В основном публикуем это, чтобы показать силу AppleScript во взаимодействии Aqua / GUI.

повторение
выберите из списка {"FAST", "CHEAP", "GOOD"} с подсказкой "CHOOSE ANY TWO" с несколькими вариантами выбора
если номер элемента результата <= 2
выход повторить
еще
отображать предупреждение "PLEASE PICK TWO"
конец
конец

исполнение GIF

Если вы считаете, что это слишком, пожалуйста, попросите меня удалить.


Это дико! Это самый похожий на английский язык, который я когда-либо видел.
Брюс Пирсон

Это действительно очень плохо, что у них нет чего-то вроде «с 2 необходимыми выборами» или чего-то подобного.
Брюс Пирсон

@BrucePierson Да, AppleScript - странный язык. ¯ \ _ (ツ) _ / ¯ Я использую его только для мелочей, довольно сложно что-либо сделать с ним.
Аддисон Крамп

Они не отмечены, что делает этот ответ "слишком выключенным" из правил. Я прошу вас удалить.
pppery

0

FLTK, 303 символа

decl{int c;}Function{}{}{Fl_Window{}{xywh {9 9 195 195}}{Fl_Pack{}{label{SELECT ANY TWO}}{Fl_Check_Button{}{callback{e(o);}label FAST}Fl_Check_Button{}{callback{e(o);}label GOOD}Fl_Check_Button{}{callback{e(o);}label CHEAP}}}}Function{e(Fl_Button*o)}{}{code{if((c+=o->value()*2-1)>2){o->value(0);c--;}}}

Ungolfed:

decl { int c; }

Function {} {} {
    Fl_Window {} {
        xywh {9 9 195 195}
    } {
        Fl_Pack {} {
            label {SELECT ANY TWO}
        } {
            Fl_Check_Button {} {
                callback { e(o); }
                label FAST
            }
            Fl_Check_Button {} {
                callback { e(o); }
                label GOOD
            }
            Fl_Check_Button {} {
                callback { e(o); }
                label CHEAP
            }
        }
    }
}

Function { e(Fl_Button* o) } {} {
    code {
        if ((c += o->value() * 2 - 1) > 2) {
            o->value(0);
            c--;
        }
    }
}

Пример вывода:

Скриншот окна FLTK

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.