复选框是否未未选中?


65

在进行代码检查时,我偶然发现了以下代码,该代码测试复选框的状态:

if (!isNotUnchecked()) { ... }

我不得不集思广益30分钟,以找出代码期望的实际复选框状态。请给我写一个可以简化这些愚蠢表情的程序!


程序应接受表示要简化的表达式的字符串作为输入(例如:)!isNotUnchecked()。程序应输出逻辑上等效的简化表达式isChecked()!isChecked()

输入表达式中的方法名称始终以is,开头为0..n 或NotChecked()或结尾Unchecked()。该方法可以以多个前缀!

例子

isChecked() => isChecked()
isUnchecked() => !isChecked()
isNotChecked() => !isChecked()
!isNotChecked() => isChecked()
!!!isNotNotUnchecked() => isChecked()

文字总是区分大小写吗?输入是notunischecked吗?
stevefestl

1
@SteveFest不,您可以假定输入始终采用我上面描述的格式。您不需要处理isnotunchecked例如。
阿诺德(Arnaud)

6
使用这样的函数名,我会给它10比1的赔率,即它实际上并未测试与其命名相符的检查条件。
卡雷布(Caleb)

2
换句话说,您知道什么是未选中的框,您知道什么是非未选中的框(如果且仅当“ checked”和“ unchecked”是仅有的两种可能状态时,它才被选中,否则它可以是复选框:int,sign ...),而对于此特定复选框,则不是(不是“选中”,无论是否带有复选标记)。如果为true,则确保复选框没有被任何“选中”。如果为false,那么您知道该复选框是未选中的复选框,但不一定意味着它已被选中,除非只有两种可能的状态(然后选中)。
J Doe

1
@J Doe感谢您的澄清!
Arnaud

Answers:



24

视网膜,23字节

Unc
!C
Not
!
O`is|!
!!

在线尝试!

说明

Unc
!C

Unchecked!Checked

Not
!

将所有都Not变成!。我们现在得到类似的东西!!!is!!!!Checked()

O`is|!

is或的所有匹配项进行排序!。由于! < is,这会将所有移至!字符串的开头,因此上述示例将变为!!!!!!!isChecked()

!!

删除对!以取消重复的求反。



13

Python,43个字节

lambda s:sum(map(ord,s))%2*'!'+'isC'+s[-8:]

一个未命名的函数,接收字符串s并返回一个字符串。

在线尝试!

!NotUn都具有正好一个奇数序数(并且cC都是奇数)时,无需检查字符是否存在,因此只需对序数求和并使用取模2的值来决定是否要一个!

除此之外,该形式与xnor的答案相同,因为我没有找到更好的选择。以下也是43:

lambda s:'!isC'[~sum(map(ord,s))%2:]+s[-8:]

10

JavaScript(ES6),51 50字节

f=
s=>(s.split(/!|n/i).length%2?'':'!')+'isChecked()'
<input oninput=o.textContent=f(this.value)><pre id=o>

通过寻找工作!Nn字符,反转选中状态。split默认情况下返回奇数数组长度,因此我们!split长度为偶数时添加。编辑:由于@ETHproductions,节省了1个字节。备用版本,也为50个字节:

s=>`${s.split(/!|n/i).length%2?``:`!`}isChecked()`

嗯,现在我回头看看其他答案,他们都在这样做。
尼尔

您应该能够从RegEx删除全局标志以保存一个字节。
毛茸茸的

@Shaggy实际上我的长度是正确的,只是g在最新编辑中未能删除。
尼尔

1
我认为您可以使用/!|N/i
ETHproductions

@ETHproductions我认为您的意思是/!|N/不带i修饰符
SplittyDev


7

Java 7,100 77字节

String c(String s){return(s.split("[!NU]").length%2<1?"!":"")+"isChecked()";}

扩展:

String c(String s){  // Method with String parameter and String return-type
  return(s.split("[!NU]").length
                     //  Count the amount of '!', 'N' and 'U' in the input String (+ 1)
    %2<1?            //  and if they are an even number:
     "!"             //   Start with an examination mark
    :                //  Else:
     "")             //   Start with nothing
    +"isChecked()";  //  And append "isChecked()" to that
}                    // End of method

测试代码:

在这里尝试。

class M{
  static String c(String s){return(s.split("[!NU]").length%2<1?"!":"")+"isChecked()";}

  public static void main(String[] a){
    System.out.println(c("isChecked()"));
    System.out.println(c("isUnchecked()"));
    System.out.println(c("isNotChecked()"));
    System.out.println(c("!isNotChecked()"));
    System.out.println(c("!!!isNotNotUnchecked()"));
  }
}

输出:

isChecked()
!isChecked()
!isChecked()
isChecked()
isChecked()

7

Aceto,49位元组

&M"pp"
L!)(de
&c;`Che"
`!d!sick
!',@p"!'
'N'U`!Lu

yadda yadda希尔伯特曲线。

首先,我们将三个重要字符压入堆栈:

!'
'N'U

然后,我们设置一个捕获标记,并从读取单个字符开始。我们d将其更新并取反,如果结果为真(因此,如果字符串为空;则输入结束),则跳至末尾:

;`
d!
,@

使用输入字符的其余副本,我们检查它是否包含在堆栈的其余部分中(即,是否为!,N,U中的一个)。如果不是,我们会引发一个错误,使我们回到读取另一个字符的捕获标记处:

&c
`!

否则,我们加载快速存储中的内容(本质上是一个最初为空字符串的寄存器;伪造的),对其求反,然后将其发送回快速存储中,然后也引发错误(返回读取字符):

&M
L!

当输入停止时,我们将被发送到最后。在那里,我们反转方向,按下感叹号,然后加载快速存储并将其取反。如果这是真的(例如,我们有很多否定的事物),我们将打印出我们感叹号:

p !'
`!Lu

最后,我们将字符串分为两部分进行打印(出于节省空间的原因):

"pp"
)(de
  Che"
  sick
   "

之后,该程序仍将运行至原始开始,但是由于这些命令均未输出任何内容或具有循环行为,因此这无关紧要。实际上,我们到达的第一个非停顿命令会引发异常,跳过大部分代码,因为我们跳转到了catch标记,这意味着Aceto在该部分看到的所有内容是:

&



!' @
'N'U

由于U目前不是由一个单引号这个符号,因此不被视为文字字符,它被解释为一个命令:U反转堆栈上的所有元素(现在是!NU,从顶部),以及'N'!推动更多字符,这意味着我们以栈结尾[U, N, !, N, !]

旁注:这是在Aceto的新编辑器的帮助下编写的第一个Aceto程序(部分)。


6

C,78 70 68字节

谢谢克里斯托夫!

c;f(char*s){for(c=1;*s;)c^=!!strchr("!NU",*s++);s="!isChecked()"+c;}

在线尝试

输出:

isChecked() => isChecked()
isUnchecked() => !isChecked()
isNotChecked() => !isChecked()
!isNotChecked() => isChecked()
!!!isNotNotUnchecked() => isChecked()

1
c;f(char*s){for(c=1;*s;)c^=!!strchr("!NU",*s++);s="!isChecked()"+c;}使用xor翻转可c节省2个字节。
克里斯多夫(Christoph)

6

Perl 5,31个字节

-2个字节,感谢@Dom Hastings

30个字节的代码+ -p标志。

/c/i;$_="!"x(y/UN!//%2).isC.$'

在线尝试!

y/UN!//计数的出现次数UnNot!。结果是许多!模2,后跟isChecked()


基于正则表达式的另一尝试为38个字节(Dom Hastings在该地址上节省了1个字节):

s/isNot|isUn(c)/!is\u$1/?redo:s/!!//g

在线尝试!


您正则表达式版本不工作,因为有两个cS IN Unchecked
尼尔

1
@Neil正则表达式仅替换第一个(因为我未使用/g标志)。测试用例对我来说看起来不错(请参阅TryItOnline链接)。所以我真的不明白你的意思……
达达

对不起,你的正则表达式版本不工作正确的原因是,虽然有cUnchecked也有一个在Checked,所以当你替补多是你结束了CheCked
尼尔,2017年

1
嘿,希望您一切正常!我没来过这里,但是我在第一个上玩了-2,第二个上
Dom Hastings

1
@DomHastings嘿!太好了,非常感谢!很高兴看到您回来:-)
Dada

6

Scala39 30字节

s=>"!"*(s.sum%2)+"isChecked()"

在线尝试!

不幸的是,我无法得出s的类型。

编辑:将类型声明移到标题(我认为这是允许的,如果不允许,我将其放回去)。





3

Japt24 23字节

o"!N" l u)ç'! +`‰C”×B()

说明

 o"!N" l u)ç'! +`‰C”×B()
Uo"!N" l u)ç'! +`‰C”×B()`
Uo"!N"                     # Only keep "!", "n" and "N" from the input
           ç'!             # Repeat the string "!" by
       l u)                # the parity of the length of the newly formed string
               +`‰C”×B()` # and concatenate with the string "isChecked()"

在线尝试!


1
等待...如何...为什么... o不区分大小写?我不知道...
ETHproductions '17

我也不知道,但是我在用“!NU”测试时才发现。“ Unchecked”中的小写字母“ n”也保留了,因此我可以删除“ U”:)
路加福音

3

PHP(5.5-5.6),52 50 49字节

<?='!'[count(spliti('!|N',$argn))%2]?>isChecked()

在这里尝试。

-2 Bytes by @Titus. Ty :)
-1 Byte  by @ETHproductions. Ty :)

PHP(> = 5.5),66 65 61

for($b=b;$a=$argn[$i++];)$b^=$a;echo$b&"!"|" ","isChecked()";

如果没有正则表达式,它将获得更多的compex :) 在这里尝试。

-4 Bytes by @Titus. Ty :)

1
error_reporting默认值为E_ALL&~E_NOTICE&~E_STRICT&~E_DEPRECATED
泰特斯

1
@Titus在正则表达式挑战中击败了JS!
克里斯多夫(Christoph)

$b^=$a很不错的发现!您也可以在没有相同大小的PHP标记的情况下执行此操作。
泰特斯

1
如果允许前导空格,则为61个字节:for($b=b;$a=$argn[$i++];)$b^=$a;echo$b&"!"|" ","isChecked()";
Titus,

@Titus我必须承认它是受此答案启发的。
克里斯多夫(Christoph)

3

果冻 16  15 字节

OSḂ⁾!iṫ⁾sCø³ṫ-7

将字符串作为命令行参数并输出结果的完整程序

在线尝试!

OSḂ⁾!iṫ-7³ṫṭ⁾sCOSḂ⁾!iṫ-7³ṫ⁾sC;两者都可以工作15岁。

怎么样?

使用与我的Python答案相同的想法,但是使用Jelly中的!isCor isC和其他隐式打印的不同构造来保存字节...

OSḂ⁾!iṫ⁾sCø³ṫ-7 - Main link: s
O               - cast to ordinals
 S              - sum
  Ḃ             - mod 2
   ⁾!i          - literal ['!','i']
      ṫ         - tail -> ['i'] if OSḂ was 0; ['!','i'] if OSḂ was 1
                - this is printed due to the following starting a new leading
                - constant chain. Printing smashes so either "i" or "!i" is printed.
       ⁾sC      - literal ['s','C']
                - this is printed (as "sC") due to the following niladic chain.
          ø     - start a new niladic chain
           ³    - program's first input (3rd command line argument), s
            ṫ-7 - tail from index -7 = ['h','e','c','k','e','d','(',')']
                - implicit print (of "hecked()")

以前的@ 16字​​节9(使用串联和配对具有相同的基础思想):

OSḂ⁾!iṫ;⁾sC,ṫ€-7

啊,该死,我以为我正在使用mod 2技巧。然后我发现:PI具有18个字节,可能有帮助:OS1&”!x;“isC”;ṫ-7$
Conor O'Brien

2

Perl 6的 35  31个字节

{'!'x m:g/<[!NU]>/%2~'isChecked()'}

试试吧

{'!'x tr/!NU//%2~'isChecked()'}

试试看
(要求可变的输入字符串将被残缺)

展开:

{
  #(
    '!'
  x               # string repeat

    # m:g/<[!NU]>/
    tr/!NU//      # find the number of negatives
      % 2         # modulus 2
  #)

  ~                # string concat

    'isChecked()'
}

2

Sed,36字节

与所有其他直接替换答案相同的想法。

:
s/Unc/NotC/
s/isNot/!is/
s/!!//
t

2

sed,37 38字节

:;s/is(Not|Un)/!is/;s/!!//;t;s/ch/Ch/

37 + 1用于-r切换:

sed -r ':;s/is(Not|Un)/!is/;s/!!//;t;s/ch/Ch/'

1
最后s/c/C/为Perl 5答案带来了问题……
尼尔

是的,s/c/C/在没有“ Un”的情况下,它看起来正在捕获第二个“ c”
凯文(Kevin)

1
另外,您可以通过删除gs/!!//在循环内部移动来保存字节。
凯文(Kevin)

2

Mathematica,82 61 60字节

稍作调整,又添加了一个中缀运算符:

"!"~Table~Mod[#~StringCount~{"o","n","!"},2]<>"isChecked()"&

先前:

"!"~Table~Mod[StringCount[#,{"o","n","!"}],2]<>"isChecked()"&

算出所有的o,n和!然后是mod 2并放很多!在前。

旧版本:

"!"~Table~Mod[StringCount[StringReplace[#,{{"o","n"}->"!"}],"!"],2]<>"isChecked()"&

2

Excel,90个字节

=IF(ISODD(SEARCH("C",SUBSTITUTE(SUBSTITUTE(A1,"Un","!"),"Not","!"))),"","!")&"isChecked()"

2

Windows Batch,120字节

以前为268257253245245221221182176169123字节

@set a=%1
@set s=#%a:~,-2%
@set s=%s:!=N#%
@for %%a in (%s:N= %)do @set/ac+=5
@if %c:~-1%==0 cd|set/p=!
@echo isC%a:~-8%

该程序将所有in替换!N#。因为现在所有否定符号!(现在是N#NotUn包含N,该程序可以计算的出现次数N并确定是否需要引导!

每次程序对an计数时N,计数器都加5。之所以加5,是因为当加5时每个交替值都以0或5结尾。这可用于确定该值是奇数还是偶数以及前导!我们根据需要添加。

此外,还使用了xnor的最后八个字符的技巧。


有人会认为在Windows批处理中编程是不可能的……
NieDzejkob

当然……批处理脚本是荒唐的
。...– stevefestl

1

果冻29 28 25 21字节

f“NU!”LḂ”!x;“µịÆẹṠƊẹ»

在线尝试!

f“NU!”LḂ”!x;“µịÆẹṠƊẹ»  Main link, argument is z
f“NU!”                 Filter to only keep "NU!"
      LḂ”!x            Repeat exclamation mark by the parity of the length
           ;“µịÆẹṠƊẹ»  Concatenate to "isChecked()"

-4个字节感谢Jonathan Allan!
-4个字节感谢Jonathan Allan!(通过使用压缩字符串)


将Lynn在此处创建的接口另存为模块(例如jellyCompress.py),然后将其与一起形成jellyCompress.Compress().string("is").dictionary("Checked").string("()").go()。(如果您在Windows cmd中运行,请安装并切换为DejaVu Sans Mono字体,并chcp 65001在启动Python以显示字符之前使用命令更改代码页)
Jonathan Allan

@JonathanAllan哦,好的。谢谢!
HyperNeutrino

1

PHP,55字节

<?=preg_match_all("#!|N#i",$argn)&1?"!":""?>isChecked()

在线尝试!

PHP,58字节

<?=preg_match_all("#[!NU]#",$argn)%2?"!":"","isChecked()";

相反,"#[!NU]#"您可以使用"#[!N]#i"

在线尝试!

PHP,68字节

没有正则表达式的版本

for(;$c=$argn[$i++];)$d^=!trim($c,"UN!");echo"!"[!$d],"isChecked()";

在线尝试!


3
<?=preg_match_all("#[!UN]#",$argn)&1?"!":""?>isChecked()-2个字节
Titus

在我count(split())想到:D @Titus好主意之前,得到了完全相同的答案!
克里斯多夫(Christoph)

1
" !"[$d&1]如果前导空格可以,则保存另一个字节。$d^=!trim($c,"UN!")保存3个字节(因为您&1不再需要了)。
泰特斯

1
@Titus是一个例子,那就是您比我自己拥有更多的知识。谢谢你,拖尾空白问题我已经作出"!"[!$d],而不是
约尔格Hülsermann

1
@Christoph你对我忘了我们对此深感抱歉
约尔格Hülsermann

1

Japt,19个字节

`‰C”×B()`i'!pU¬xc u

在线尝试!

开箱及其工作方式

`‰C”×B()`i'!pUq xc u

`‰C”×B()`   Compressed string for "isChecked()"
i     Insert the following string at the beginning...
'!p     "!" repeated the following number of times...
Uq        Split the input into chars
xc        Sum the charcodes
u         Modulo 2

使用Jonathan Allan的Python解决方案中的charcode-sum技巧。


1

帕斯卡(FPC),119字节

var s:string;j:word;c:char;begin read(s);for c in s do j:=j+ord(c);if 1=j mod 2then write('!');write('isChecked()')end.

在线尝试!

使用几乎每个答案都可以使用的方法,将输入中字符的代码点求和,然后检查和的奇偶校验。

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.