诺亚的整数列表


25

介绍:

我想我们都听说过,但这里有一个简短的摘要:诺亚在大洪水中收集了地球上每种动物的两种,雄性和雌性,保存在他的方舟中。圣经中的实际引用是:

创世记7:2-3
你必须带走每种清洁动物中的七只,雄性及其伴侣,每种不清洁动物中的两只,雄性及其伴侣,以及天空中每种鸟类中的七种,无论雌雄,都将其后代保存在地球上。
资源

但是为了这个挑战,我们将忽略干净/不干净的部分以及他为每只动物取七个的部分。此挑战仅涉及以下部分:

每种不洁动物中的两种,雄性及其伴侣

挑战:

输入:

您会得到一个正整数列表(随机顺序)。

输出:

两个不同的值指示它是否是“诺亚列表”。这并不一定非得是truthy / falsey价值,所以也可能是0/ 1是Java / C#,或'A'/ 'B'以任何语言,举一些例子。

什么时候是“挪亚榜”?当列表中每个整数正好有两个时。

挑战规则:

  • I / O是灵活的。输入可以是整数/浮点数/字符串的列表/数组/流,也可以从STDIN逐一读取。输出可以是从函数返回或输出到STDOUT /文件的任何两个不同的值。
  • 在输入列表中的整数是随机顺序,并保证是该范围内的正1n100000
  • 输入列表保证为非空。
  • 如果整数大于2(即4、6、8等),将是错误的。即[6,4,4,6,4,7,4,7]是假的,尽管您仍然可以像这样创建相等的对:[[4,4],[4,4],[6,6],[7,7]]

一般规则:

  • 这是,因此最短答案以字节为单位。
    不要让代码高尔夫球语言阻止您发布使用非代码高尔夫球语言的答案。尝试针对“任何”编程语言提出尽可能简短的答案。
  • 标准规则适用于具有默认I / O规则的答案,因此允许您使用STDIN / STDOUT,具有正确参数的函数/方法以及返回类型的完整程序。你的来电。
  • 默认漏洞是禁止的。
  • 如果可能的话,请添加一个带有测试代码的链接(即TIO)。
  • 另外,强烈建议为您的答案添加说明。

测试用例:

Truthy:
[7,13,9,2,10,2,4,10,7,13,4,9]
[1,2,3,1,2,3]
[10,100,1000,1,100,10,1000,1]
[123,123]
[8,22,57189,492,22,57188,8,492,57188,57189,1,1]

Falsey:
[6,4,4,6,4,7,4,7]
[2,2,2,2,2,2]
[5,1,4,5,1,1,4]
[77,31,5,31,80,77,5,8,8]
[1,2,3,2,1]
[44,4,4]
[500,30,1]
[1,2,1,1]
[2,4,6,4,4,4]
[2,23,34,4]
[2,23,3,3,34,4]

12
在古兰经中 古兰经》(Surah Al-Mumenoon),第27节:因此,我们(用此信息)启发了他:“在我们的视野内和我们的指导下建造方舟:然后当我们的命令来临,大地的喷泉涌出时,您便登上船对不论男女,以及您的家庭中的每一个,除了那些已经被圣言所针对的物种之外:不向过错的人称呼我;因为他们将被淹死(在洪水中)。阿里)
伊沙克汗

Answers:




9

Brachylog,4个字节

ọtᵛ2

在线尝试!

说明

ọ           Get the list of occurences of elements in the input: [[x,2], [y,2], …]
  ᵛ         Verify that for each of those pairs…
 t          …the tail (i.e. the number of occurences)
   2        …is 2

8

R,20个字节

-6字节归功于digEmAll通过更改输入法

any(table(scan())-2)

在线尝试!

FALSE如果是Noah列表,则输出,TRUE否则输出。适用于任何输入类型,不仅限于整数。

计算列表中每个值的计数,并检查计数是否与2不同。


您可以从节省6个字节的stdin中获取输入:在线尝试!
digEmAll

@digEmAll谢谢;我误解了挑战规则,并认为这是不允许的。
罗宾·赖德



6

Haskell,33个字节

f x=and[sum[1|b<-x,b==a]==2|a<-x]

在线尝试!

对于输入的每个元素,我们确保它在输入列表中出现两次。

sum[1|b<-x,b==a]只是的高尔夫版本length(filter(==a)x)


6

Perl 6、18个字节

{so.Bag{*}.all==2}

在线尝试!

  • .Bag将输入列表转换为Bag具有多重性的--a集。
  • {*} 提取所有的多重性。
  • .all 创建多重性的和。
  • == 2 导致另一个布尔数和连接点,如果多重性为2,则每个布尔数为true。
  • so 将结折叠为单个布尔值。

5

J,10个字节

[:*/2=#/.~

在线尝试!


3
也有10个字节:[:*/2=1#.=我确实想删除该上限,但不知道如何做。
科尔

1
@cole,当我尝试此操作时,我得到了您的解决方案。如果您真的想卸下盖子,您也可以2*/@:=1#.=10个字节
Conor O'Brien

@cole不错的选择!
Galen Ivanov

@ ConorO'Brien是的,@:在这里也很方便。
Galen Ivanov

1
@GalenIvanov必须爱摩纳哥=,所以在利基高尔夫场景中非常有用
科尔

4

MS SQL服务器2017152个 150 146字节

CREATE FUNCTION f(@ NVARCHAR(MAX))RETURNS
TABLE RETURN SELECT IIF(2=ALL(SELECT
COUNT(*)FROM STRING_SPLIT(@,',')GROUP BY
PARSE(value AS INT)),1,0)r

可读版本:

CREATE FUNCTION f(@ NVARCHAR(MAX)) RETURNS TABLE RETURN
  SELECT IIF(2 = ALL(SELECT COUNT(*)
                     FROM STRING_SPLIT(@, ',')
                     GROUP BY PARSE(value AS INT)), 1, 0) AS r

SQL Fiddle上尝试一下!

-2个字节,感谢Kevin Cruijssen


1
由于您不使用别名,因此不能将c其删除COUNT(*)吗?
凯文·克鲁伊森

@KevinCruijssen,您是对的,谢谢。
Andrei Odegov

4

Haskell61 45字节

import Data.List
all((2==).length).group.sort

在线尝试!

感谢@KevinCruijssen提供12个字节,而@nimi提供4个字节。

Haskell的第一个答案,但它非常容易做到。可以或许被golfed很多。举个例子...


3
我不知道Haskell,但我敢肯定all(True==).map(2==)可以all(2==)。:)
Kevin Cruijssen

4
...并移动lengthallall((2==).length).group.sort。无需为函数命名,即删除f=
nimi

确实,我忽略了all(2==)在GHCi中进行测试的时间。感谢Kevin和Nimi,我将更新答案。
J.Sallé

4
...哦,供将来使用:all(True==)and
nimi

4

JavaScript(ES6),37个字节

返回诺亚或非诺亚。

a=>a.some(v=>a.map(x=>t-=v==x,t=2)|t)

在线尝试!

已评论

a =>               // a[] = input
  a.some(v =>      // for each value v in a[]:
    a.map(x =>     //   for each value x in a[]:
      t -= v == x, //     decrement t if v is equal to x
                   //     (i.e. if v appears exactly twice, t is decremented twice)
      t = 2        //     start with t = 2
    )              //   end of map()
    | t            //   yield t, which is supposed to be equal to 0
  )                // end of some()

3

APL(Dyalog Unicode),8 字节SBCS

匿名默认前缀功能。返回0/ 1

∧/2=⊢∘≢⌸

在线尝试!

 对于每个值作为左参数,并将该值的出现索引作为右参数,调用:

 符合正确的参数(次)
 ,然后
 返回,忽略了左参数

2= 布尔值列表,指示哪些记数是2

∧/ AND减法(即它们都是真的吗?)


3

PowerShell66 37 26字节

-11个字节,感谢mazzy

!(($args|group|% c*t)-ne2)

在线尝试!

分组$l并获取所有匹配值的计数。然后从该列表中筛选出所有计数2。如果列表为空,则为Noah号。否则,它仍将填充非2计数。True如果列表为空且False填充了该列表,则会产生提示


1
如果这些值彼此平衡,即[1,2,1,1]失败,则计数为4,则唯一计数为2,因此即使不是诺亚也将解析为诺亚。
过期的数据

@ExpiredData Heck
Veskah,

在意识到它无法正常工作之前,我尝试了另一种语言的方法
过期的数据

1
¯\ _(ツ)_ /¯ 26
MAZZY

1
@mazzy谢谢。忘记了所有group存在的事物
Veskah

3

PHP,60字节

function($a){return!array_diff(array_count_values($a),[2]);}

在线尝试!

PHP具有出色的内置功能,尽管只有20个字符,但array_count_values()并不是一个很好的选择。


PHP始终具有出色的内置函数,带有长名称,叹气!
2

3

Mathematica,25个 24字节

MatchQ[{{_,2}..}]@*Tally

在线尝试!

Tally函数返回表单的列表,然后将其与检查所有计数是否均为2 的模式匹配。{{element, count}, ...}


3

附件,16字节

${All&x!{_~x=2}}

在线尝试!

说明

${All&x!{_~x=2}}
${             }    lambda with input x
  All&x!{     }     over each element _ of x:
         _~x            check that the number of occurrences of _ in x
            =2          is 2

备择方案

17个字节: {All&_!`=&2@`~&_}

18个字节: {All[`=&2@`~&_,_]}

23个字节: Same@2&`'@Sum@Table[`=]

25个字节: Same«2'Sum@Table[`=,_]»

25个字节: Same<~2'Sum@Table[`=,_]~>

25个字节: {Same[2'Sum@Table[`=,_]]}

35个字节: {Commonest@_==Unique@_and _[0]~_=2}


3

TI基本(47字节)

Input(L1
SortA(L1
not(remainder(dim(L1,2)) and prod(not(△List(L1))=seq(remainder(I,2),I,1,-1+dim(L1

我是TI-Basic的忠实粉丝。实际上,这不是一门伟大的语言,但是我喜欢其中的编程(和打高尔夫球)。

此代码如何工作?

首先,它对列表进行排序。

其次,它使用△List函数生成另一个列表,这是已排序列表元素之间的差异。(例如,△List({1,3,7,8})将产生{2,4,1})。不适用于此列表,该列表将列表的每个非零元素都转换为零,并且将每个零转换为1。

然后,程序检查结果列表是否适合该模式{1, 0, 1, 0, ...},仅当原始列表为Noah列表时才为true。

还需要另外检查列表的长度是否为偶数,以捕获某些边缘情况。

以下是一些测试用例的屏幕截图:

一些测试案例 一些测试用例


3

朱莉娅1.0,32字节

l->sum(isone,l./l')/length(l)==2

在线尝试!

l用转置将输入数组的每个元素除以l'给出矩阵。如果每个元素正好出现两次isonel则对该矩阵求和得出的长度是其两倍。



3

朱莉娅30个字符 26字节

!a=all(x->2==sum(a.==x),a)

谢谢H.PWiz提供的技巧!

在线尝试!


1
您可以拥有!a=all(x->2==sum(a.==x),a)26个字节。注意 我建议在此站点上以字节计数
H.PWiz

非常感谢你!我不知道您可以(ab)使用!匿名功能
user3263164


2

VDM-SL,64字节

f(a)==forall y in set inds a&card{x|x in set inds a&a(x)=a(y)}=2

说明

VDM的工作原理主要类似于二阶逻辑语句。

forall y in set inds a                //Bind y to each of the indices of a

{x|x in set inds a&a(x)=a(y)}         //build a set of the indices of a who have the same
                                      //value as the value at y

card {...} = 2                        //and check the cardinality of that set is 2

由于您无法TIO VDM,因此这里是调试会话的输出


我知道可能没有任何在线编译器,但是您是否可以添加(部分)测试用例的屏幕截图作为验证?:)
凯文·克鲁伊森

@KevinCruijssen保存了一些字节来修复该错误,这可能使代码本身更易于理解。我也将添加一个解释:)
过期的数据





2

Excel,45个字节

=SUM(IF(FREQUENCY(A:A,A:A)=2,1))=COUNT(A:A)/2

假定列A中的数据,并且在列A中的一个单元格以外的其他任何单元中输入了该数据。如果存在对,则返回TRUE,否则将返回FALSE。

        FREQUENCY(A:A,A:A)                     Counts how many of each value there is
     IF(                  =2,1)                If this is 2, add value of 1 to array otherwise 0
=SUM(                          )               Sum the count in that array that have a exactly 2
                                 COUNT(A:A)/2  Count how many total values in column
                                =              If this is equal, return TRUE else FALSE

尝试删除/ 2并加.5,以求和,但这不起作用。
尝试计算<> 2的频率,但未返回正确的数量。


2

八度 / MATLAB,22 21字节

@(x)any(sum(x==x')-2)

匿名函数,用于输入数字向量,并0在向量满足条件或1其他条件时输出。

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

说明

@(x)                   % define anonymous function with input x
            x          % x
               x'      % x transposed and conjugated
             ==        % equality comparison, element-wise with broadcast. Gives a
                       % square matrix
        sum(     )     % sum of each column
                  -2   % subtract 2, element-wise
    any(            )  % true if and only if any value is not zero

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.