Как программисты, мы все знаем поговорку: «Вы можете иметь это быстро и хорошо, но это не будет дешево, вы можете иметь это дешево и хорошо, но это не будет быстро, или вы можете иметь это быстро и дешево». , но это не будет хорошо. "
Для решения этой задачи вы реализуете воображаемый инструмент конфигурации для своих пользовательских служб программирования. Вам следует отобразить набор из трех флажков с заголовком «ВЫБРАТЬ ЛЮБОЙ ДВА»:
SELECT ANY TWO
☐ FAST
☐ CHEAP
☐ GOOD
Как только два элемента были выбраны, третий элемент должен быть отключен. После отмены выбора одного из двух выбранных элементов все параметры должны быть снова включены. Другими словами, если выбран ноль или один элемент, все они все еще включены, но если выбраны два элемента, третий должен быть отключен.
Никаких специальных элементов управления не допускается. Флажки должны быть стандартными на вашем языке. Например, не используйте элемент управления «CheckBoxList», если он есть у вашего языка. Я предполагаю, что большинство записей будет HTML / JQuery, но это не правило. Это код гольф, ищущий самую короткую запись.
ПОБЕДИТЕЛИ ТАК ДАЛЕЕ
Я разобью его на категории. Есть несколько явных победителей:
jQuery: nderscore, Mr. Tenacity Менее 100b, если исключить текстовые «ресурсы». Также стоит упомянуть Мэтта за представление концепций jQuery, которые вдохновили многих.
Dyalog APL: marinus, он же мистер Юникод. Как вы печатаете все эти вещи? Я понимаю, почему вы хотите писать короткие программы.
PHP: SuperScript Я считаю, что это самая короткая запись, которая фактически отключает, а не отменяет выбор третьей опции, следуя самой строгой интерпретации правил.
Ответы:
Javascript ( ES5 ) с jQuery - 143 ( демо )
Я изменил решение Мэтта и поиграл в него как можно дальше:
Javascript ( ES5 ) без jQuery -
185175 ( демо )Использование jQuery - это обман, так что вот решение без него:
Если нам разрешено запретить пользователю устанавливать 3-й флажок вместо фактического отключения поля, мы можем сделать его еще короче:
С JQuery -
126123 ( демо )Без jQuery -
150147 ( демо )источник
.join
это хороший трюк!"SELECT ANY TWO0FAST0GOOD0CHEAP".replace(/0/g,
это еще один способ сделать это в результате той же длины.JavaScript -
184169 (с помощью jQuery)http://jsfiddle.net/L33JK/16/
РЕДАКТИРОВАТЬ: улучшено с помощью @Daniel Lisik - https://codegolf.stackexchange.com/a/26805/16278
источник
undefined
принуждает к истине. Это и присвоение переменных, вероятно, единственные маленькие хитрости, используемые на самом деле.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 (на Windows) (169)
Это статическая функция, чтобы проверить ее, если вы не знаете APL, введите
)ed C
и вставьте ее в окно редактирования, затем запуститеC
.Новые биты 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←
: включить или отключить флажкиРезультат:
источник
Python
32,454434...393392 байтаЯ думал, Python должен быть короче, чем Java. Вот «доказательство» (
РЕДАКТИРОВАТЬ: теперь оно действительно короче):Для тех из вас, кто интересуется тем, что на
exec
самом деле выполняет выражение, он выполняет это (это то, что заменители делают со строкой. Новые строки добавлены для удобства чтения):При этом используется та же логика, что и в моем ответе на Java: снимите флажок, если он вызывает выбор более 2 флажков.
Unf Ксчастью, к сожалению, я потратилбольшеменьшебольше байт , делая это.правок:
exec
, сохраняя колоссальный 1 байт!exec
(удаляя скобки).range(3)
в0,1,2
и изменения отступов иметь один слой вкладок. Не уверен, если\t\t
будет работать вместо\t__
(_
это символ пробела). Наконец-то добрался самый длинный мой ответ на Java.!=
для-
.источник
if p[i]
используяand
вместоif
:if p[i]:s>1 and B[i].toggle();s+=1
.B[i].toggle()
наB[i].deselect()
ничего не меняет. Я понятия не имею, почему это так. Возможно, это недостатокtkinter
Реболь,
219197Ungolfed:
Это диалект Rebol 3 View (r3-gui). Скриншот ниже из Ubuntu Linux:
Обновление - спасибо Earl & Graham из Rebol SO Chatroom за бритье 22 символов кода - http://chat.stackoverflow.com/transcript/message/16345039#16345039
источник
Java,
421...369351 байтЯва ... потому что ява. Более красивый код:
Пример запуска (разные размеры окна, сначала при запуске):
Флажки расположены горизонтально; это допускается . Потребовалось бы намного больше, чтобы правильно выровнять его. Кроме того, я отключаю, снимая флажок при его нажатии , а не делая невозможным его нажатие.
правок:
Checkbox
.while
цикл в цикл foreach (спасибо Ли ); почему я не подумал об этом раньше?Frame
иPanel
.источник
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 -
561481433423369Потому что почему бы и нет.
Шокирующе, что на данный момент мы короче, чем Python, и C # не глючит, и связаны с Java!
Кредиты EveBird для сокращения его с 561 до 481.
И еще раз EveBird сокращает его с 481 до 433!
Снял несколько с лямбда-коннектом
До 389 с инициализаторами C ++ 11
А 373 без отдельного класса
Удалено несколько пробелов - 369
Golf'd:
Вроде Un-Golfed:
источник
QWidget m
наQDialog m
иm.show();a.exec()
сm.exec()
.CoffeeScript -
167154CoffeeScript порт ответа @Matt .
Немного негольфя
JSFiddle .
источник
PHP, Javascript, JQuery - 135b
Я восхищался ответом @ nderscore, но потом решил скопировать и разыскать его.
По сути, я заменил его
.join
трюк на некоторую предварительную обработку гипертекста PHP.источник
SELECT ANY TWO<?=($m="<input type=checkbox onclick=(a=$('input:not(:checked)')).prop('disabled',!a[1])>").FAST.$m.GOOD.$m.CHEAP;
Рубин,
219218 байтЯ использую те же виджеты Tk, что и ответ Python 3 от Quincunx.
Эта программа нарушает правила, потому что у нее есть список флажков . (Правила гласили: «Не используйте список флажков».) Да,
a
это массив из 3 объектов TkCheckButton, и я считаю, что массив - это список. Моя защита состоит в том, что я не использовал какой-либо существующий список флажков, но я использовал стандартные флажки и создал свой собственный список.Я тестировал с Ruby 2.1.0 и Tk 8.5.15.
o[c]
предикат для проверки, еслиc
выбрана кнопка проверки . Со строками по умолчаниюc.variable.value
is'0'
или'1'
, поэтому сравнение строк будет только true, если'1'>'0'
. РЕДАКТИРОВАТЬ: я сохранил 1 байт (219 до 218), изменив'0'
на?0
. В Ruby?0
есть символьная константа.a.count(&o)
использует предикат для подсчета выбранных кнопок проверки.a.map
цикл для всех кнопок, делая их:normal
или:disabled
.источник
Спасибо Rotem и Johnbot за помощь в игре в гольф!
C #
343334Этот использует тот же «чит», что и в ответе Quincunx на Java - флажки на самом деле не отключены; они просто не позволяют вам проверить их, если эта проверка составляет 3.
Также есть небольшая ошибка, которую нельзя закрыть после выбора третьего флажка, если только вы не отмените выбор, потому что проверка не пройдет. Но это код-гольф , так кого это волнует? ;)
C #
403397374Это правильный, который фактически отключает третий флажок.
В некотором роде, не в гольфе
источник
if(a.Count(b=>b.Checked)==2)e.Cancel=true;
быть переписан какe.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);
наa.First(b=>!b.Checked).Enabled=a.Count(b=>b.Checked)>1?1<0:a.All(b=>b.Enabled=0<1);
AngularJS - 214
источник
JavaScript (с jQuery) -
224,222,210,205, 178Благодаря комментарию от блестящего @Matt я сократил код на 27 символов.
JSFiddle
источник
$(e+c).length>1
в задание как таковое:$(e).not(c).attr(f,$(e+c).length>1)
поскольку вы меняете только логическое значение.!!
Принуждение и немного больше играть в гольф с не назначая тело г.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
Более кодовая версия, предложенная Дэвидом, 255 символов :
источник
h=Checkbox;i=Dynamic;j=Enabled
.h
и настроить количество символов в заголовке.сценарий mIRC (
727719 байт)Забыл об этом языке до пьяного разговора прошлой ночью.
Больше должно быть закодировано на этом языке! Но должен быть способ превратить это в настоящий беспорядок, чтобы он мог быть таким же хорошим, как Perl.
Редактировать: заметил, что мои Python-измы просачиваются и смогли уменьшить код на 8 байт!
источник
C #,
335333326320308Исходя из ответа Бобса, мой использует меньше символов, чем его (335 против 342), но я не могу полностью понять, как считать это.
Ungolfed
источник
Select
.==2
a>1
, а наtrue
a1>0
. Вы также можете использоватьAll
вместоWhere
иLast
.ToList
также корочеToArray
.Groovy -
357221217 символовЯ портировал решение Quincunx на Groovy 2.2.1, используя SwingBuilder (и сделал его еще более Groovier):
Ungolfed:
источник
QML -
369315254251248 байтЗдесь идет версия QML (QtQuick 2.0), содержащая только содержимое файла .qml. Этот код требует для запуска хотя бы Qt 5.1. Не так уж и много, по сравнению с другими решениями ( 248 байт ), но это полнофункциональное кроссплатформенное приложение (включая Android и iO)! : D
Чтобы запустить его, сохраните код в файле .qml, установите Qt 5.1 и запустите qmlscene.exe (или просто qmlscene в linux), который покажет диалог открытия файла. Выберите файл .qml, в который вы сохранили код, и посмотрите на потрясающий результат! : D
источник
к3 - 95
код здесь
(источник: nsl.com )
источник
JavaScript / jQuery
237 234229Очень похожий подход как ответ Мэтта , хотя и немного дольше.
источник
JavaScript 209 (было 346)
Сокращенный: спасибо за комментарии.
Гольф-функция:
HTML-форма: обеспечивает ввод и вызывает функцию. * Форма теперь использует class = x для группировки входов.
Протестировано с NetBeans и Chrome.
источник
var
символы, удалив ненужные скобки и пробелы (включая символы новой строки). Возможно, вы могли бы получить его меньше, если бы использовали ES6 лямбда.getElementsByClassName
например.a=document.getElementsByClassName('q')
,document.a
,document.c
,document.c
также поместить их непосредственно в []Groovy
Основано на версии Java, но сильно уменьшено;)
Типы были заменены на 'def', точка с запятой удалена, добавлена замена на <<, 1 <0 заменена на 0, собраны для создания флажков, удален тип itemevent, удалено приведение флажка, улучшены циклы.
источник
TCL 347
По крайней мере, это лучше, чем Python и Java.
Примечание: если вы начнете с установки одного флажка и немедленного снятия его, вы получите ошибку. Вы можете исправить это, добавив
110
в конец первой строки.Ungolfed:
источник
Javascript + Knockout: ~ 250 символов
источник
AngularJS - 155 ( Демо )
Негольфированная версия:
источник
Рубин с Обуви, 133 персонажа
Пример вывода:
источник
AppleScript,
194190 байт (уверен, это немного обманывает ...)Существуют две проблемы:
: обойти правила
display alert
компонентом, который дает мне дополнительные 30 байтов длины.Причины, по которым я опубликовал это:
В основном публикуем это, чтобы показать силу AppleScript во взаимодействии Aqua / GUI.
Если вы считаете, что это слишком, пожалуйста, попросите меня удалить.
источник
FLTK, 303 символа
Ungolfed:
Пример вывода:
источник