创建一个复选框


51

编写一个程序,创建一个两个状态的复选框,人们可以使用鼠标进行交互。

具体来说,您的程序应实现以下所有目的:

  1. 在屏幕上有一个8×8像素(或更大的像素)区域,该区域是复选框的可单击区域。此后,此区域简称为复选框。

  2. 当鼠标光标在复选框内移动并按下默认*鼠标按钮时,复选框应切换状态。
    已检查变为未检查。未选中变为选中。

  3. 切换复选框后,该复选框不应移动。

  4. 在选中状态,复选框可以是任何颜色。

  5. 在未检查状态下,复选框可以是任何颜色,只要至少16个像素在视觉上与已检查状态不同即可

  6. 在一个程序实例中,所有选中状态在视觉上都应该彼此相同,而所有未选中状态在视觉上都应该彼此相同。

  7. 在程序被明确终止之前(例如,通过退出按钮或Alt + F4)不要结束程序,这样用户可以根据需要单击任意复选框。

*您可以假设默认鼠标按钮始终是左键单击,但是也可以使用由鼠标软件或操作系统定义的默认按钮,根据用户的不同,默认情况下可能不会真正单击鼠标左键。

笔记

  • 复选框区域之外的内容无关紧要。它可能只是桌面。它可能是控制台的一部分,每次切换都会更改。

  • 复选框以什么状态开始都没有关系。

  • 复选框区域可以具有等于或大于8×8像素的任何尺寸。它不必是正方形的。

  • 您可以为超出控制范围的设置(例如控制台字体大小,浏览器缩放,监视器分辨率等)留出少量余地。只要您的程序在合理的测试设置下运行,它就应该有效。

  • 如果您的程序打开了一个窗口,则可以假定它已被拖动到屏幕上的适当位置(例如,左上角)。

  • 您可以使用标记语言,例如HTML或其他我们通常不认为是成熟的编程语言的语言。

  • 您的复选框必须是可使用默认鼠标按钮切换的。如果它还能切换其他形式的输入(例如,鼠标右键),也可以,鼠标移动除外。也就是说,如果仅在复选框内移动鼠标,则状态不应更改。

  • 强烈建议您使用复选框的屏幕截图!

计分

以字节为单位的最短代码获胜。

一个23字节的规范HTML示例。

<input type="checkbox">

对我来说,在Google Chrome浏览器中,这会形成12×12像素的复选框,并且大约30像素会在选中状态和未选中状态之间明显变化。

我将浏览器缩放比例设为100%。


2
复选框可以覆盖整个屏幕吗?
Kritixi Lithos'2

@KritixiLithos是的,那将是正确的。但是请注意,即使需要更大的区域,也可以将特定的8x8区域计为官方复选框。
加尔文的业余爱好

@Helka Homba-允许应用程序除复选框本身之外显示其他控件吗?
齐柏林飞艇

复选框是否可以打开其他种类的输入?(例如,如果复选框启用了任何形式的用户输入,无论是单击鼠标,移动鼠标还是按键,该解决方案都是正确的吗?会在单击鼠标时切换,但会在打开时也有其他刺激。)

1
@zeppelin“复选框区域之外的内容无关紧要。它可能只是桌面。它可能是控制台的一部分,每次切换都会更改。” 因此,只要有该复选框,其他的都没关系。
加尔文的业余爱好

Answers:



31

HTML,20个字节

不知道这将是有效的答案。HTML要求关闭标记以进行合法验证,但是现代的浏览器会自动将其关闭,以便可执行。

<input type=checkbox


3
之前,我一直将此作为一种选择(不带引号),但完全错过了结尾>。+1和有效的恕我直言。
ElPedro

1
在此站点上,语言是由其实现定义的,因此对我来说这似乎很好。
John Gowers

1
感谢@JohnGowers,我一直在想可以接受多少次滥用的定义。
1

27

Bash67 55 50 35 32 31字节

:()(read -p$[i^=1]
›?9h -sn6
:)

该代码包含一个CR字节(第一个换行符)和一个CSI字节(带有Windows-1252编码的小直角括号)。它要求使用xterm(或等效方法)和ISO-8859-1编码(或类似方法)。

该代码定义了一个名为的函数:,该函数在黑色矩形中交替显示白色10。xterm的默认设置有24个不同的像素。(证明

对于切换整个终端颜色的旧版本,请查看此答案的修订版10

感谢@ ais523建议 xterm,它节省了4个字节!

这个怎么运作

:(...)创建了一个函数命名:执行...

命令执行实际的魔力。

  • -p 指定输入提示,该提示将打印到STDOUT。

    • $[i^=1]是对变量i1进行XOR的算术扩展。最初可能没有动过;发生这种情况时,它将被视为0

    • 回车将光标移回行的开头。

    • ›?9h在支持的终端中捕获鼠标。每次单击将向终端发送六个字符,即←[Mbxy,其中代表ESC字节(0x1b)。←[表示一个转义序列,M鼠标,b按钮(0×20 +按钮号码),xX的点击(的坐标为0x20 +坐标),和y所述ÿ坐标。

    • -sn6使读取静音(鼠标输入不会回显到STDERR),并在精确读取6个字节后停止。它将输入保存在REPLY变量中,但是我们对其产生的输出不感兴趣。

最后,一旦读取完成(只需单击鼠标一次),就:递归调用自身,进入无限循环。

创建和调用

$ echo $':()(read -p$[i^=1]\r\x9b?9h -sn6\n:);:' > checkbox.sh
$ xxd -c 17 -g 1 checkbox.sh
0000000: 3a 28 29 28 72 65 61 64 20 2d 70 24 5b 69 5e 3d 31  :()(read -p$[i^=1
0000011: 5d 0d 9b 3f 39 68 20 2d 73 6e 36 0a 3a 29 3b 3a 0a  ]..?9h -sn6.:);:.
$ LANG=en_US xterm -e bash checkbox.sh

输出量

截屏


我当时正在为自己设计类似的解决方案(尽管使用了另一种语言,但由于没有换行符而无法找到输入方法,因此我不得不放弃)。可能的改进:将更1000h改为9h(不同之处在于1000h既可以处理鼠标的按下和释放,也可以9h处理鼠标的释放)。这可能需要或可能不需要在代码中的其他位置进行更改。

@ ais523我尝试过,但是至少我的终端仿真器(Konsole)似乎不支持它。你知道那件事吗?
丹尼斯,

gnome-terminal似乎有效,这就是我用于测试的内容(编辑:但我认为它不支持1字节CSI)。xterm应该也可以工作,并且如果您有KDE系统,则安装起来可能会更容易。(我自己进行了测试;由于某些原因,它可以使用,\x1b[但不能使用\x9b,可能与我的stty设置有关,而不是与终端本身有关。)

@ ais523我确实有xterm。我将检查何时返回计算机。
丹尼斯,

8
我喜欢它是如何成为:):(通过结束
安德拉斯·迪克

22

处理中,78 66 65 63 61字节

@TuukkaX通过使用-a%2代替来节省了2个字节a%2*-1

@TuukkaX通过使用节省了2个字节 a=-a

int a=1;void draw(){background(a);}void mousePressed(){a=-a;}

复选框在黑白之间切换。

说明

int a=1;                   //the variable that contains the state of the checkbox
void mousePressed(){a=-a;} //if the mouse is pressed, change the sign of a

现在还有许多其他选择,例如使用if语句来处理此问题,但是当鼠标被按下时,它变得怪异并不断改变背景。我首先尝试过mouseButton,但是随后我将需要更多条件和更多代码,这些最终将变得更加冗长。

现在mousePressed()要被永久调用(否则它将在程序刚启动后停止),我们需要一个draw()函数。

void draw(){               //loop infinitely
  background(a);           //set the sketch's background to -a%2
  //if a ==  1, the background colour is set to almost black
  //if a == -1, the background colour is set to white
}

在此处输入图片说明


较小的复选框为90个字节(该复选框位于左上角,因此我们可以删除一些鼠标条件):

int a=1;void draw(){fill(a);rect(0,0,8,8);}void mousePressed(){if(mouseX<9&mouseY<9)a=-1;}

2
巧妙地使用Processing如何接受单个整数作为灰度颜色!
FlipTack

@FlipTack似乎白人也可以表示为fill(-1)
Kritixi Lithos

1
我有个主意。初始化a到1,而不是0变化a++a=-a,这使得-a%2a。这将a在1和-1之间切换。我不知道1会产生什么颜色。
Yytsi'2

@TuukkaX是的,它可以工作。color(1)生产的#010101产品非常接近黑色
Kritixi Lithos '02

22

HTML + JavaScript,32 30 25个字符

<p onclick=innerHTML^=1>0


3
this是隐式的,可以删除。而且,innerHTML更短。
丹尼斯

@丹尼斯,对此很奇怪...谢谢。
Qwertiy

+1(不使用<input>元素)
RedClover

20

Unix Shell(+ x11-apps),3个字节

免责声明

下面的答案是无聊的,边缘化的和“感觉作弊的”(至少对我来说)。

但是,它似乎并没有违反“编写”或“默认漏洞”的任何挑战规则,因此我将其发布。

(如果您可以指出一条违反该规则的特定规则,请对此发表评论!)

打高尔夫球

xgc

xgc程序演示了X图形基元的各种功能。

XGC屏幕实际上是充满了各种复选框:

在此处输入图片说明

和“粘滞按钮”(在此挑战规则下,属于复选框):

在此处输入图片说明


20

GitHub风味Markdown-6个字节

- [ ] 

(有尾随空格)

要点: 检查/不检查


确定这与第一句的后半部分“写一个程序,该程序创建了两个状态的复选框,人们可以使用鼠标进行交互 ”相符吗?
manatwork

1
是的,如果将其粘贴到要点中并创建要点(用于“编译”),您将能够与其进行交互。
Axel

有趣。谢谢@ Ax31。我从没用过要点。
manatwork'2

1
我不会想到“ Github风味降价”。
乔纳斯·谢弗



14

Python REPL,45个字节

from tkinter import*
Checkbutton(Tk()).pack()

我不参加CG,也不经常阅读这些帖子。但是,让您使用外部模块确实让我感到惊讶。那不是作弊吗?我不知道Tk源代码有多少个字节,但是真的不应该将这些字节添加到您的字节数中吗?
FMaz '17

1
@Krazor tkinter是Python的标准库(但即使不是,我也只需要声明Python REPL + tkinter)。这意味着我可以通过简单地导入来使用它的功能。您建议的惩罚类似于要求用户在字节数中包括您所写语言源中的字节数。在这里,我们允许任何语言或模块竞争,只要该语言或模块在公开之前被公开发表即可挑战已发布。
蓝色

好的,谢谢您的澄清。
FMaz '17



11

HTML使用JavaScript - 136 124 120 115 113 111 109 79字节

<p style=height:20;border:solid onClick=t=this;t.innerHTML=(t.e=!t.e)?'x':''>

-2感谢@KritixiLithos

在@Jan打了些很棒的高尔夫球后,减至79。尽管新版本符合要求,但出于专业原因,我保留了旧版本。

虽然使用内置插件完全有效,但我认为从头开始创建自己的插件会更有趣。经过Chrome和Firefox测试。border:solid是否具有IE兼容性,但我不知道在较新的IE版本中是否确实需要它-我没有可供测试的IE。

px高度用于“运行代码段”,因此不包含在“实际”字节数中。没有它,它在浏览器中可以正常工作。

<p style=height:20px;border:solid onClick=t=this;t.innerHTML=(t.e=!t.e)?'x':''>

先前版本:

<p id=d style="width:20px;height:20px;border:solid 1px"onClick="d.innerHTML=d.innerHTML=='x'?'':'x'"align=center>


1
id=d可以删除d=this吗?
Kritixi Lithos'2

1
@KritixiLithos-的确可以。谢谢,并发现:)
ElPedro '17

1
您不需要设置宽度,规则说它可以是任何尺寸。如果将状态存储在属性上this,则将保存ID。如果存储this在属性中,则将节省一些字节。这align是不必要的。由于属性字符串中没有空格,因此不需要引号。 <p style=height:20px;border:solid onClick=t=this;t.innerHTML=(t.e=!t.e)?'x':''>79个字节
1

@Jan-谢谢!宽度位是我自己的职业骄傲。如果我不设置的话,它看起来很难看,因为这个答案永远不会赢,只是作为替代发布,我可能会留在那儿。除此之外,还有一些很棒的提示。非常感谢。明天更新。
ElPedro

谢谢@Easterly。更新了代码,但忘记了其他位。天色已晚。
ElPedro

9

Minecraft 1.0.0,1个字节

Minecraft中的杠杆符合复选框的所有条件。此答案仅适用于较旧版本的游戏,在该游戏的旧版本中,按一下操纵杆仍会切换它。

在此处输入图片说明

使用@Connor O'Brien的建议字节数进行评分。


两个答案之间的差值3几乎无法达成共识,但考虑到Conor的答案颇具争议(目前为+ 24 / -10),并且公认的答案得到了广泛好评(+ 17 / -0),我认为后者应用于为Minecraft答案评分。
丹尼斯

但是,《我的世界》 1.0.0
ev3commander

1
这是n在Conor,顺便说一句:)
Conor O'Brien

或者,您也可以在任何较新的版本中重新绑定左右鼠标按钮以使其生效; D
seadoggie01 2015年

@ ConorO'Brien不是1 block吗?为什么1 byte呢 我不认为mc将每个块都存储为一个字节...
RedClover

8

TI基本(15字节)

While 1:Shade(0,9:Input :ClrDraw:Input :End

非常坦率的。该复选框覆盖了大约40%的屏幕,并且在黑白之间交替。选中后,屏幕将如下所示:

屏幕


8

Windows命令行的任何版本,3个字节

(cmd.exe,批处理,powershell,开始->运行等)

osk

打开屏幕键盘,该键盘上有多个“复选框”,例如shift,ctrl,alt,capslock键,类似于xgc答案,并受SmileBASIC答案屏幕快照的启发。



7

KV Lang,8个字节

CheckBox

在此处输入图片说明


假设kv lang甚至可以运行一个非常基本的Python环境:

from kivy.app import runTouchApp
from kivy.lang import Builder
runTouchApp(Builder.load_string('CheckBox'))

这基本上CheckBox是有效的,因为kivy.Factory标准库中的每个小部件中都包含一个Kivy小部件。

这个简单的字符串创建了的实例,CheckBox并且由于runTouchApp期望运行小部件而可以使用Builder.load_string

load_string句柄的背景基本上是每个kv字符串,如果定义了一个小部件的单个实例(例如CheckBox),则将其提升到小部件的位置,例如:

Application
    openGL Window
        root widget(mostly layout)
            main tree
            and some widgets
            ...

7

SmileBASIC,49个字节

@L
O=T
TOUCH OUT T,,
X=T<O!=X
KEY 1,""[X]GOTO@L

并且是SB字体的一个空框和一个复选框。
通过触摸屏幕来切换复选框(最接近用鼠标单击的东西)

在此处输入图片说明 在此处输入图片说明

作弊答案:

0个字节:

(屏幕键盘上的按钮的作用类似于复选框,例如大写锁定和插入键)

14个字节:

EXEC"SYS/SBGED

打开内置的图形编辑器,该编辑器具有多个类似于复选框的按钮


这真是太棒了,尽管我不太了解第四条线在做什么。你能解释一下吗?
snail_

T<O当您停止触摸屏幕时为true,并!=用作逻辑XOR。X=X XOR (O && !T)
17Me21年

7

C#,124120字节

由于抓鱼,节省了4个字节。

复选框已选中但未选中 注意:由于进行了编辑,图片无法完全代表代码的含义,“ checkBox1”不会与当前代码一起显示。

using System.Windows.Forms;class P{static void Main(){var a=new Form();a.Controls.Add(new CheckBox());a.ShowDialog();}}

松散: using System.Windows.Forms; class P{ static void Main(){ var a=new Form(); a.Controls.Add(new CheckBox()); Application.Run(a); a.ShowDialog(); } }


如果您在meta上找不到任何相关信息,在meta上进行询问
马修·罗

您可以摆脱中的空格var a = new Form();
clismique '17

@ Qwerp-Derp我删除了它们以进行计数,我只是粘贴了错误的内容,谢谢。
satibel

你可以使用a.ShowDialog();保存几个字节
grabthefish

谢谢@grabthefish,尽管C#仍然输给了java :(
satibel


6

带有JavaScript的HTML,46 33 28字节

<body onclick=innerHTML^=1>0

v2

<body onclick=this.innerHTML^=1>0

v1

<body onclick=t=this;t.innerHTML=t.e=!t.e||''>

这是@ElPedro的答案的变体:创建一个Checkbox。在@Albert Renshaw的帮助下减少到28个字节可以进一步减少,但这将使其与“ 创建复选框”相同

整个应用程序区域都是可单击的。它会显示0off状态,1on状态。在https://jsbin.com/nuhetiyocu/1/edit上尝试


1
这是39个字节的精巧变化。<body onclick=t=this;t.innerHTML^=t?1:0但是,状态更改之间的16像素规则尚待争论。
艾伯特·伦肖

38<body onclick=this.innerHTML^=this?1:0
艾伯特·伦肖

1
哦,不,在您的帮助下,我已经跌到了33岁:)
1

1
28日<body onclick=innerHTML^=1>0
艾伯特·伦肖

1
现在,容器中始终有一个值,可以将其从更改body为其他元素。但我只是注意到,这将使其与另一个答案相同codegolf.stackexchange.com/questions/109155/create-a-checkbox / ...因此,我将其保留为原样
1

6

Powershell v5 +,94字节

($a=[Windows.Forms.Form]::new()).Controls.Add([Windows.Forms.Checkbox]::new());$a.ShowDialog()

在此处输入图片说明 在此处输入图片说明

这是非常糟糕的,但是我不能使用- Add-Typeusing namespace-来缩短语句的执行时间,并且该变量是必需的,因为我需要重用该对象以显示表单,并且不Controls.Add()返回任何可用的内容。

ShowDialog 我的系统上要求在运行此命令后使该框具有交互性,否则该表格将被冻结。

System.Windows.Forms.Form只能缩短到Windows.Forms.Form(至少我自己的)系统在新的会话中停止自动完成它之前。


真好!可能要补充一点,这需要5+版本。
briantist

@briantist更新,谢谢。
colsw

6

Excel VBA,38 32 31 29字节

Instants Window函数,A1在活动Excel VBA项目的第一张工作表的单元格中插入一个高度= 9和宽度= 9的复选框

Sheet1.CheckBoxes.Add 0,0,9,9

-6感谢pajonk替换[A1],[A1],9,90,0,9,9

-1替换Sheets(1)[Sheet1]

-2对于实现以上内容是愚蠢的,Sheet1而是使用


似乎1,1,9,9作为参数也有效。
pajonk

1
您不需要Sheet(1).,您可以在Excel中足够快地运行它,但它CheckBoxes是活动工作表的
继承者

@ Mr.Burns我已经检查过了,但是没有直接引用任何Worksheet对象,该CheckBoxes.Add方法引发了一个错误,指出“ Object Required”
Taylor Scott

@TaylorScott你是正确的,我将代码放在工作表模块中,而不是普通模块中。.我的错误xD
Mr.Burns

4

VBA(Word),74 57字节

-17感谢Taylor Scott

Sub a()
f = a.FormFields.Add(Selection.Range, 71)
End Sub

该文件的文件名应为a。


1
可以取代wdFieldFormCheckBox71(的整数值wdFieldFormCheckBox为17个字节的恒定节省)
泰勒斯科特

我认为您可以删除-2个字节的换行符。
devRicher

4

帕格(Pug),20个字节

input(type=checkbox)

除此以外,我认为是23。如果删除引号,它仍然可以在Firefox和Chrome(在IE上无法测试)上运行,并且排在第21位,在这种情况下,我认为它是对示例的改进,因此有效。
ElPedro

@heonlygusti-的确如此,但如果没有引号,我会赞成:-)顺便说一句,反对者不是我。
ElPedro '02

如果不是那些不需要的报价,我会投票赞成。
NightSkyCode

@theonlygusti一点也不。试试看。
NightSkyCode

4

Clojure中,201个 195 145 127字节

(ns c(:require[quil.core :as q]))(def a(atom nil))(q/defsketch b :draw #(q/background(if@a 0 99)):mouse-clicked #(swap! a not))

通过消除对-6个字节的需要m/fun-mode

-50个字节(通过删除:setup:size选项,因为它们是默认值,在non-中是不必要的)fun-mode。还删除了不必要的中间件导入。

-18个字节(仅@ASCII)。更改为“较小”的颜色,并在取消引用运算符(@)之前删除了不必要的空间。

创建一个Quil草图(Clojure库,该库提供了Processing之上的一层),因此,这需要Quil库才能运行。

(ns bits.golf.checkbox
  (:require [quil.core :as q]))

; Mutable global variable to hold the toggle state
(def a (atom nil))

(q/defsketch b
         ; Draw the background color to be either black or red depending on the toggle state.
         :draw #(apply q/background (if @a [0 0 0] [255 0 0]))

         ; Negate the state on mouse click
         :mouse-clicked #(swap! a not))

在此处输入图片说明

在此处输入图片说明


不能用99代替255吗?另外,我会尝试删除符号之前/之后的空格,看看它是否仍然有效
ASCII码,仅ASCII

@仅ASCII是的,我可以。尽管它使颜色变得丑陋,但由于某种原因,我当时优先考虑这种颜色。不,这是我所能移除的最大空间。
Carcigenicate

@only ASCII的问题是符号几乎可以包含任何字符,因此实际上可以删除空格的唯一“安全邻居”是任何类型的方括号或引号。幸运的是,这是对前者的一种狂热。
Carcigenicate

嗯,[0 0 99]那呢?(某种深蓝色)
仅ASCII格式,2003年

仅限@ASCII实际上,我认为现在可以删除0。我认为,如果向量变短,Quil自动将前面填充0。如果我记得最新的消息,我会修复它。感谢您让我思考。
Carcigenicate's

4

操作Flashpoint脚本语言,273字节

显示复选框:

createDialog"b"

但是首先必须定义:

将以下内容保存到description.ext任务文件夹中命名的文件中:

class b{idd=999;movingEnable=1;class controls{class c{idc=457;x=0.1;y=0.1;w=0.1;h=0.1;text="";action="if(ctrlText 457=={})then{ctrlSetText[457,{V}]}else{ctrlSetText[457,{}]}";type=1;style=2;colorText[]={1,1,1,1};font="tahomaB36";sizeEx=0.1;}}}

实际使用的复选框:


3

AutoIt,78字节

GUICreate(0)
GUISetState(GUICtrlCreateCheckbox(0,0,0))
Do
Until GUIGetMsg()=-3

打开一个最大化的窗口,该窗口可以像其他任何窗口一样关闭。最大化和最佳状态是打高尔夫球的副作用。

在此处输入图片说明


我将如何在Linux上运行它?
dkudriavtsev

@wat wine AutoIt3.exe script.au3,其中script.au3文件包含此代码。
mınxomaτ

3

Python,62个字节

from tkinter import*
a=Tk()
Checkbutton(a).pack()
a.mainloop()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.