确定数组是否包含2以外的值


20

取一个由数字或数组组成的数组,如果只包含2s 则输出。

输出应为真或假值(很抱歉,如果这样会破坏答案)

真实的测试案例

[2]
[2,2]
[[2],[2,2],2]
[]
[[],[]]

虚假测试用例

[1]
[22]
[2,2,2,1]
[[1,2],2]

禁止使用标准漏洞

默认IO规则适用。

代码高尔夫球,最少字节获胜!


我们可以接受代表数组的字符串吗?
小麦巫师

数组中是否会有数字和其他数组之外的对象
Wheat Wizard

只有数组和数字,并且代表该数组的字符串就可以了。
ATaco

2
什么样的数字?Compex int,compex float,float int,int,不是负数吗?
RosLuP '17

1
FTR并在适当的数学思维的名字:数组[[2]]没有包含两项。

Answers:


8

MATL,3个字节

2=p

在线尝试!

从技术上讲,这可能只是

2=

由于包含任何零元素的数组都是虚假的,但这似乎很便宜。


包含0的列表是虚假的吗?天啊。
暴民埃里克(Erik the Outgolfer)'17年

我认为2字节版本无效,因为ATaco在评论中说唯一的输出有效。
暴民埃里克(Erik the Outgolfer)'17年

我相信2=对于空矩阵失败,还是?
斯蒂夫·格里芬

@stewiegriffin这似乎是一个很奇怪的例子,需要处理,但很方便,它确实可以工作:在线尝试!
DJMcMayhem

是的,2=p工作正常。最后的较短版本2=不是。另外,“奇怪的边缘情况”是两个测试情况。:-)
Stewie Griffin's

15

Python 2中43 40个字节

f=lambda l:l>=[]and all(map(f,l))or l==2

在线尝试!


发布此答案时,仍然允许根据元共识通过抛出错误/不抛出错误来输出。因此,这个26字节的答案是有效的:

f=lambda l:l==2or map(f,l)

在线尝试!


1
这是检查元素是否为列表的一种好方法。
阿德南

这就是为什么我不喜欢这种共识。它真的毁了蟒蛇打高尔夫球。
小麦巫师

但是,由于您要使用退出代码,因此不需要all,除了错误以外,其他都是真实的。
小麦巫师

11

Prolog(SWI)43 33字节

我闻到... 递归

感谢EmignaLeaky Nun节省了10个字节!

a([]).
a([X|T]):-(X=2;a(X)),a(T).

在线尝试!验证所有测试用例!

说明:

对于非Prolog用户,列表格式如下:[Head | Tail]

Head是列表的第一个元素,和尾部是剩余的列表。 在这里测试!。这里的一个重要情况是,具有1个元素的列表的尾部等于[]。您可以在这里进行测试

% State that an empty array is truthy.
a([]).

% If the list is not empty (covered by the previous line), we need to check
% whether the Head is equal to 2 or whether the head is truthy.
% After that, we only need to check if the remaining list is truthy.
a([Head | Tail]) :- (Head = 2; a(Head)), a(Tail).


9

八度,13字节

@(x)~any(x-2)

验证所有测试用例。

这是一个带有一个输入参数的匿名函数x。它2从所有元素中减去,检查是否有任何非零元素。true对于所有值均为零的情况,它将取反输出。

之所以x-2有效,是因为它适用于所有大小的矩阵,包括空矩阵[]

x-2 如果输入中不能有空矩阵,就足够了。





6

JavaScript(ES6),22 19 23 22字节

a=>!/[^2,]|22/.test(a)

测试一下

f=
a=>!/[^2,]|22/.test(a)
console.log(" "+f([2])+": "+JSON.stringify([2]))
console.log(" "+f([2,2])+": "+JSON.stringify([2,2]))
console.log(" "+f([[2],[2,2],2])+": "+JSON.stringify([[2],[2,2],2]))
console.log(" "+f([])+": "+JSON.stringify([]))
console.log(" "+f([[],[]])+": "+JSON.stringify([[],[]]))
console.log(f([1])+": "+JSON.stringify([1]))
console.log(f([22])+": "+JSON.stringify([22]))
console.log(f([2,2,2,1])+": "+JSON.stringify([2,2,2,1]))
console.log(f([[1,2],2])+": "+JSON.stringify([[1,2],2]))


好东西!我想知道是否可以将其缩短一些,但是我对此表示怀疑。
Arnauld

谢谢,@Arnauld; 仍然没有找到一种改进的方法。
毛茸茸的



4

Mathematica,24个字节

Cases[t=Flatten@#,2]==t&

纯函数返回TrueFalse。在Flatten嵌套数组并调用它之后tCases[t,2]返回与“模式”匹配的元素列表2,并==t检查是否就是整个列表。

Mathematica,29个字节

(#//.{2->{},{{}..}->{}})=={}&

不那么短,但是更有趣。从输入开始,将#应用两个替换规则,直到结果停止更改(//.):首先,将所有2s替换为{}s。然后将所有条目均为空集({{}..})的列表替换为空集(重复)。如果其余为空集(=={}),我们将获胜。


出乎意料,但我仍然很想知道这里正在做些什么。
帕维尔

4

Haskell,36个字节

匿名函数,接受String并返回Bool

用于 (all((==2).fst).(reads=<<).scanr(:)[]) "[2,2,2,1]"

all((==2).fst).(reads=<<).scanr(:)[]

在线尝试!

怎么运行的

  • Haskell没有内置的混合类型列表,因此我们将字符串作为参数。
  • scanr(:)[] 生成字符串的所有后缀的列表。
  • (reads=<<)尝试在每个后缀的开头解析一个数字,然后将成功组合成一个元组列表(n,restOfString)
  • all((==2).fst)检查所有解析的数字是否为2

怎么样not.all(`elem`"2,[]")
zbw

@zbw由于像这样的数字而失败22
与Orjan约翰森

4

Python 2,38个字节

lambda l:l.strip('[],2')==l*('22'in l)

在线尝试!

输入没有空格的字符串,输出布尔值。

检查是否删除的所有字符'[],2'l给出空字符串。还检查22不是子字符串-如果是,l则使用输入代替空字符串以与删除结果进行比较,并且该操作始终失败。


4

Ruby,28 23 22字节-GB节省了5字节

->x{x.flatten-[2]==[]}

尽管“扁平化”的确很长,但它仍然比基于正则表达式的解决方案或必须挽救基本情况下的错误的递归方法要短。Ruby内置的集合和数组的混合有时非常有用。


1
x.flatten.uniq == [2]
尼克M

1
@NickM-不适用于[]或的测试用例[[],[]][2,*x].flatten.uniq==[2]稍长一点
ymbirtt

1
x.flatten | [2] == [2]会更短。
GB

@GB,而且x.flatten-[2]==[]还短一些。谢谢你的提示!
ymbirtt

1
而正则表达式却赢了:codegolf.stackexchange.com/a/120781/18535 :-)
GB

3

JavaScript(ES6),26个字节

f=a=>a.map?a.every(f):a==2

测试用例


您需要计数,f=因为您已提及它。
Leaky Nun

@LeakyNun确实。固定。
Arnauld

3

MATL,4个字节

2-a~

在线尝试!

分解:

           % Implicit input
2-         % Push 2 to the stack, and subtract from input
  a        % Any non-zero elements?
    ~      % Negate to get true for cases where all elements are zero.

好吧,出乎意料。但是我保留了这一点,因为我很高兴自己独自完成了所有工作(即使任务非常简单)。


3

R,28个字节

function(x)!any(unlist(x)-2)

unlist(x)将(嵌套的)列表转换为向量。然后2从该向量中减去。any将数字(带有警告)转换为逻辑并检查是否存在TRUEs。这!与输出反相。

这适用于嵌套列表,因为unlist默认情况下会递归地取消列出初始列表的所有列表条目。

这也适用于空列表,因为unlist(list())变为numeric(),是一个空数值向量。通过强制any使其logical(),这被解释为FALSE通过any,然后逆转TRUE!


1
pryr::f(!any(unlist(x)-2))保存几个字节。
BLT

这也是一样的长度all(unlist(x)==2)
朱塞佩

或者您也可以说any(unlist(x)-2)TRUE如果在展平的数组中有一个非2值,则返回一个一致性;如果FALSE所有值均为2... ,则返回一个一致性
Giuseppe

1
@Giuseppe不确定是否TRUE算作假:/
JAD

1
好吧,关于元数据仍未达成共识,但codegolf.meta.stackexchange.com/a/2192/67312
朱塞佩(Giuseppe)



2

视网膜14 11字节

^(\W|2\b)+$

在线尝试!


\W似乎不是一个很好的标准:2.2是不是一个数字2,但我想它会匹配
亚伦

@Aaron我刚刚问过OP关于数组是否可以包含十进制数字。如果他们指出浮点数将出现在数组中,那么我将更改我的提交。
Kritixi Lithos

是的,我看到RosLup昨天也问了同样的问题,还没有答案。希望OP会尽快澄清!
亚伦


2

JavaScript(ES6),53 50 48字节

_=>(_+"").split`,`.map(c=>!c?2:c).every(c=>c==2)

由于@Shaggy,节省了5个字节!

测试用例 :

let f =

_=>(_+"").split`,`.map(c=>!c?2:c).every(c=>c==2)

console.log(f([2]))
console.log(f([2,2]))
console.log(f([[2],[2,2],2]))
console.log(f([]))
console.log(f([[],[]]))

console.log(f([1]))
console.log(f([22]))
console.log(f([2,2,2,1]))
console.log(f([[1,2],2]))


f([])并且f([[],[]])应该是真实的
Arnauld

@Arnauld现在正确吗?
Arjun

我认同。:-)
Arnauld

认为您可以用!c代替来保存几个字节c==""
毛茸茸的

@Arnauld感谢您指出这一点。该挑战实际上作为第19个字节中的CMC发布。对于[[],[]]等测试用例,CMC没有什么可说的。当挑战发布在主站点上时,我迅速添加了解决方案(甚至要求我输入验证码!),而无需查看规则!再次感谢!:)
Arjun


2

Java 8,126 55 27字节

s->s.matches("(\\W|2\\b)+")

@KritixiLithos端口惊人的Retina答案(不包括)^...$,因为它String#matches始终匹配整个String并^...$隐式添加。

-2个字节,感谢@Jakob提醒我^...$不需要String#matches

在这里尝试。


我不想取消您在列表解决方案上的所有工作,但是您不能强迫使用字符串并使用字符串解决方案吗?
雅各布

@Jakob您的意思是解释吗?我目前正在使用正则表达式字符串解决方案。我只保留了原来的List答案及其解释,因为String解决方案是一个端口。您是否要删除列表解决方案?或为String解决方案添加说明?
凯文·克鲁伊森

我的意思是,只要您有列表解决方案,就可以通过在其中使用字符串解决方案来缩短它。像boolean c(java.util.List l){return(l+"").matches("^(\\W|2\\b)+$");}会工作,对不对?只是想指出这一点,以防您打算进一步打高尔夫清单解决方案。
雅各布

1
哦,由于仅对整个字符串进行测试,因此通过删除^$在正则表达式中可能会丢失2个字节String.matches
雅各布

@Jakob完全删除了列表答案,转换为Java 8,并删除了^...$。忘了这一点,尽管我已经使用了相当多的时间在过去..
凯文Cruijssen

1

Python 2中44个 43 42字节

注意到x作为列表的字符串表示。这也假定像示例中的表示一样没有空格。

lambda x:set(x)<=set("[],2"*0**("22"in x))

在线尝试!


说明

这两个都接受输入的字符串表示形式中的字符,并确定除 [], 2。他们通过强制转换为一组并将这些字符与一组字符进行比较来做到这一点。但是,如果我们有一个非2的数字而只有2的数字(例如22或222),则此操作将失败,为了修补这种情况,我们将用于创建集合的字符串乘以是否x包含的取反"22"。如果包含它,它将是空集,否则将与以前相同。



失败[22]
Leaky Nun

@LeakyNun固定
小麦巫师

@LeakyNun您的建议因[]
巫师

lambda x:set(x)<=set("[],2"*-~-("22"in x))对于-1
ovs '17

1

欧姆,6个字节

∙e]Å2N

使用CP-437编码。

说明:

∙e]Å2E
∙e           ■Evaluate the input to form an array
   Å         ■any(              ,             )
  ]          ■    flatten(input)
    2N       ■                   lambda x:x!=2
             ■implict end of any and print

1

PHP,46字节

<?=!preg_match('/:"(?!2")/',serialize($_GET));

@JörgHülsermann您能举个例子吗?所有测试用例似乎都有效。如果不通过浏览器进行测试,是否将标量值$_GET作为字符串传递?
user63956 '17

<?=!preg_match('/:"(?!2")/',$argn);和输入是串行化阵列的字符串表示- 11字节
约克Hülsermann

1

PHP <7.0,29字节

输入为JSON编码的字符串数组

<?=!ereg("22|[013-9]",$argn);

PHP <7.0,42字节

使用不推荐使用的功能ereg

<?=!ereg("22|[013-9]",json_encode($_GET));

PHP,50字节

打印1为真,否为假

-1字节用于其他明智的删除 !

或+ 1个字节,表示true 1,false 0在+前面加上!

<?=!preg_match('#22|[013-9]#',json_encode($_GET));

在线尝试!


2
您不需要$r变量:<?array_walk_recursive($_GET,function($i){$i-2&&die;})?>1
user63956 '17

1

Pyth,6个字节

!-.nQ2

与我的CJam答案非常相似。我对Pyth还是很陌生,所以请告诉我是否有什么我可以打高尔夫球的。

说明:

    Q   Input:     [[[], [2]], [1]]
  .n    Flatten:   [2, 1]
 -   2  Remove 2s: [1]
!       Not:       False
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.