合并两个值


44

您有两个值,每个值0代表“未知”,或之一1,2,3。将它们合并为一个值,如下所示:

  • 如果两个值都不为零且相等,则输出该值:
    (3,3) -> 3
  • 如果两个值都不为零但不相等,则为未知输出0:
    (1,2) -> 0
  • 如果一个值为零,另一个为非零,则输出非零值:
    (2,0) -> 2, (0,1) -> 1
  • 如果两个值均为零,则输出零:
    (0,0) -> 0

测试用例:

有16个可能的输入对。

  | 0 1 2 3
--+--------
0 | 0 1 2 3
1 | 1 1 0 0
2 | 2 0 2 0
3 | 3 0 0 3

(0, 0) -> 0
(0, 1) -> 1
(0, 2) -> 2
(0, 3) -> 3
(1, 0) -> 1
(1, 1) -> 1
(1, 2) -> 0
(1, 3) -> 0
(2, 0) -> 2
(2, 1) -> 0
(2, 2) -> 2
(2, 3) -> 0
(3, 0) -> 3
(3, 1) -> 0
(3, 2) -> 0
(3, 3) -> 3

排行榜


8
第四条规则适合第一条规则,所以我不知道您为什么将它们分开。
致命的

1
Nitpick:第四个点是多余的,您可以从第一个点删除“ nonzero”。编辑:哇,什么是忍者@Fatalize。
暴民埃里克(Erik the Outgolfer)'18年

同样,这里3并不是必须的,尽管它确实增加了可能的输入数量。
暴民埃里克(Erik the Outgolfer)'18年

2
我考虑过简化规则,但认为仅列出所有零/非零情况并将优化留给高尔夫球手是最清晰的。
xnor

2
这需要一个排行榜,第一页开始获得第二页已经打过的答案。
与Orjan约翰森

Answers:


22

Python 3中27 25个字节

lambda x,y:(x|y)>>(x*y&2)

在线尝试!


5
我喜欢这样,因为输入超过3时会中断。您是如何想到这个的?
雅各布

4
基本上是反复试验。
丹尼斯

1
有趣。有一会儿,我想到了通过包含两个整数和几个运算符的有限长度表达式自动搜索的方法,但是即使在20字节左右的情况下,空间也太大了。需要一些情报!
雅各布

16

果冻,4字节

gf|S

在线尝试!

这个怎么运作

gf|S  Main link. Left argument: x. Right argument: y.

g     Compute a, the gcd of x and y.
  |   Compute b, the bitwise OR of x and y.
 f    Filter; yield all common elements of [a] and [b].
   S  Take the sum.

10

APL(Dyalog),5个字节

⌈×∧=⌊

在线尝试!

有用的参考

∧=⌊1如果最小公倍数等于最小公倍数,则返回。仅当值之一为零或两个值相等时,才为真。或者我可以=*⌊

⌈×:最大值乘以上述值。


7

莎士比亚编程语言,296字节

Z.Ford,.Ajax,.Act I:.Scene I:.[Enter Ford and Ajax]Ajax:Listen to thy heart.Ford:Listen to thy heart.Am I as fat as you?Ajax:If so,let us Scene C.Am I as fat as zero?If so,let us Scene C.Ford:Am I as fat as zero?If not,you zero.open heart.let us Scene V.Scene C:.Ajax:open heart.Scene V:.[Exeunt]

在线尝试!

首先参加代码高尔夫球挑战赛,所以让我们从我最喜欢的笑话语言开始吧!

说明:声明了两个变量Ford和Ajax(可用的最短变量名)

Z.Ford,.Ajax,.

第一个场景:将这两个值放入变量中,然后测试它们是否相等,然后针对0测试Ajax。如果我们必须返回的值存储在变量Ford中,请转到场景C。

Act I:.
Scene I:.
[Enter Ford and Ajax]
Ajax:
Listen to thy heart.
Ford:Listen to thy heart.
Am I as fat as you?
Ajax:
If so,let us Scene C.
Am I as fat as zero?
If so,let us Scene C.

如果Ford为0,则打印Ajax,否则将Ajax设置为0,然后打印Ajax。然后转到程序末尾。

Ford:Am I as fat as zero?
If not,you zero.
open heart.
let us Scene V.

场景C:打印福特

Scene C:.
Ajax:open heart.

场景V:程序结束。

Scene V:.
[Exeunt]


2
@JoKing无疑,您的版本比我的版本好,我认为如果将其发布为答案会更好,因为该程序背后的原因是完全不同的,并且我不想因为您的工作而
受到赞誉

6

红宝石,21字节

->a,b{(a|b)*531[a*b]}

在线尝试!

因为露比

简短说明:

  • a|b 是位或,因此,如果a == b或其中之一为零,它将为我们提供正确的数字。

  • 幻数531为2 ^ 9 + 2 ^ 4 + 2 ^ 1 + 2 ^ 0,[]运算符提取单个位。这意味着:如果a * b为0、1、2、4或9,则乘以1,否则乘以0。

  • 不适用于值> 3



5

Pyth8 7字节

@{+0SQ3

在线尝试!

@{+0SQ3   Implicit: Q=input()

    SQ    Sort input
  +0      Prepend 0
 {        Deduplicate
@     3    Get 4th element (index 3), modular indexing

情况1-两个值非零且相等

Sorted Input   [3,3]
Prepend 0      [0,3,3]
Deduplicate    [0,3] - index 3 yields 3

情况2-两个值非零且不相等

Sorted Input   [1,2]
Prepend 0      [0,1,2]
Deduplicate    [0,1,2] - index 3 yields 0

情况3-恰好是一个零值

Sorted Input   [0,1]
Prepend 0      [0,0,1]
Deduplicate    [0,1] - index 3 yields 1

情况4-两个值均为零

Sorted Input   [0,0]
Prepend 0      [0,0,0]
Deduplicate    [0] - index 3 yields 0

备用解决方案,也是7个字节

*eSQ}s{

在线尝试

*eSQ}s{QQ   Trailing Q's inferred

      {Q    Deduplicate input
     s      Take the sum
    }   Q   Is this in the input? True treated as 1, false as 0
*           Multiplied by
 eSQ        Max from input (end of sorted input) 

先前版本,8字节

@+0{-QZ3

@xnor感谢您发现它,现在应该修复
Sok

@{+0Q3适用于6个字节。
Xcoder先生18年


4

Stax,8 个字节

Ç∞∟∙◄╥*♣

运行并调试

拆开包装,松开包装并进行评论,看起来像这样。

    e.g.        [2, 0]
c:s [2, 0] 2    calculate the "span" of the input array (max(a) - min(a))
+   [2, 0, 2]   append the span to the input array
o   [0, 2, 2]   sort the 3-element array
E   0 2 2       explode the 3 elements into 3 separate stack entries
a   2 2 0       rotate the third stack element to the top of stack
!   2 2 1       logical not, produces 1 iff the top value was 0
*   2 2         multiply
                implicitly print top of stack

运行这个




4

C(gcc),25个字节

f(a,b){a=a^b&&a*b?0:a|b;}

伪代码:

foo(A,B)
    if A XOR B and A*B are > 0
        return 0
    else 
        return A OR B`

3

C(gcc),26个字节

f(a,b){a=a*b?a-b?0:a:a+b;}

在线尝试!

扩展/取消投放:

int f(int a, int b) { // implicit-int (C89)
    // return replaced with assignment: link
    return a*b ? // if a and b are both not zero, then
        a-b ? // if a != b
        0 : // a != b, so return 0
        a // a == b, so return a
    : a+b // one of a,b is zero, so return whichever is nonzero 
    ;
}

3

MATL,9个字节

dGp*~GX>*

在线尝试!

说明:

           % Implicit input as a vector with two elements implicitly. Stack: [0,2]
d          % The difference between the two elements. Stack: [2]
 G         % Push input again. Stack: [2], [0,2]
  p        % The product of the last element (the input). Stack: [2], [0]
   *       % Multiply the two elements on the stack. Stack: [0]
    ~      % Negate. Stack: [1]
     G     % Push input again. Stack: [1], [0,2]
      X>   % Maximum value. Stack: [1], [2]
        *  % Multiply the two elements on the stack. Stack: [2]
           % Implicit output

失败的郊外活动:t?td~*]X>
18

3

GNU sed,23个字节

s/^0?(.)\1?0?$/\1/
t
c0

(必须与-r标志一起运行)

在线尝试!


1
欢迎使用PPCG :)当前的共识是不计算标志(我在手机上,因此无法链接相关的Meta)。
粗野的

1
太酷了!我也会在手机上编辑,稍后再编辑。一个免费的-3个字节非常欢迎PPCG :)
KernelPanic '18

3

QBasic,34个字节

不同的方法!

INPUT a,b
?(a OR b)*-(a*b=0OR a=b)

观察到输出网格中的非零值都是OR两个输入数字的按位排列。这只是a OR b在QBasic中。我们希望在时输出此值a*b=0 OR a=b0否则可以通过乘以上述条件的负值(负值,因为真值-1在QBasic中)来实现。


2

Brainfuck,25个字节

,>,[>]<<[[->->+<<]>[>]]>.

输入的是两个字节的值(不是ascii)


2

迅捷,118字节

func c(n1:Int,n2:Int){n1==n2 ? print("\(n1)") : (n1*n2 != 0 ? print("0") : (n1==0 ? print("\(n2)") : print("\(n1)")))}

4
欢迎来到PPCG!我不了解Swift,但是您可以通过将变量名每个设置为1个字符,并删除诸如!=和三元运算符周围的空格来节省大量字节。
世纪

1
嗨,欢迎来到PPCG!如@Οurous所述,您可以更改n1并更改n2为单个字符以缩短它们;删除一些空格和括号,并删除一些空格。另外,==0可以<1!=0可以是>0,因为我们知道只有输入0,1,2,3是可能的。从来没有在Swift中编程过,但是我将其压缩为91个字节,如下所示:func c(a:Int,b:Int){a==b ?print("\(a)"):a*b>0 ?print("0"):a<1 ?print("\(b)"):print("\(a)")} 在线尝试。
凯文·克鲁伊森

此外,您似乎可以将其缩短为51个字节,如下所示:func c(a:Int,b:Int){print(a==b||a*b<1 ?max(a,b):0)} 在线尝试。再次欢迎您来到PPCG,祝您住宿愉快!
凯文克鲁伊森

1
除了@KevinCruijssen的高尔夫以外,您还可以将提交的内容转换为匿名封口,以节省87个字节:{$0==$1||1>$0*$1 ?max($0,$1):0} 在线尝试!
Xcoder先生18年

2

批次38 36 35 30字节

@cmd/cset/a"(%1|%2)>>(%1*%2&2)

@Dennis的Python答案的端口,因为批处理中的条件条件过于昂贵。




2

05AB1E9 8 字节

àIËIP_+*

-1个字节感谢@MagicOctopusUrn

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

说明:

à         # Take the maximum of the input-list
          #  [0,2] → 2
IË        # Are all elements in the input-list equal?
          #  [0,2] → 0
  IP_     # Take the product of the input-list, and verify if it equals 0
          # (`_` transforms 0 into 1; everything else into 0)
          #  [0,2] → 0 (product) → 1 (==0)
     +    # Add them together (since only 1 is truthy in 05AB1E, this is basically an OR)
          #  0+1 → 1
*         # Multiply both values on the stack
          #  2*1 → 2

广义的解释:

IËIP_+    # If both values are equal, or one of them is a zero:
 à        #  Output the maximum of the two values
          # Else:
          #  Output 0

Ës0å~iZë0是我的; 好东西。实际上不确定是否可以击败9个字节。
魔术章鱼缸

1
我将其收回à®Ë®P_+*_逻辑上等同于
魔术章鱼缸

_变成0到1,所有其他值到0。
魔术章鱼瓮

@MagicOctopusUrn谢谢!当我做出这个回答时,我正在查看文档以查看是否有== 0命令,但不知道_是不是确实如此。将来也应该对其他挑战有用。瓷砖。:)
Kevin Cruijssen

2

Javascript,35个字节

f=(m,n)=>(m||n)&&(m!=n)?(m>n?m:n):0


2

的Javascript ES6,25 22 21 20字节

a=>b=>a?b-a?!b*a:a:b

14 13字节,如果按排序顺序提供了参数

a=>b=>a%b?0:b


2

QBasic,38 36 35字节

INPUT a,b
?(a*b>0)*(b-a*(a<>b))+a+b

部分受Erik的IF ... THEN ... ELSE答案启发,这是仅数学解决方案。

我怎么到这里

理解带条件数学的重要说明:在QBasic中,比较运算符的结果为0-1,不是01

我们从Erik的代码开始:

IF a*b THEN?a*-(a=b)ELSE?a+b

换句话说,如果ab均为非零,则打印a*-(a=b)a如果a=b,否则0);否则(至少为ab为零),输出a+b(非零数字,或者0它们都为零)。

这里已经有一些数学与条件论进行了。让我们更进一步,看看是否可以IF完全消除该语句。我们将不得不使用a*b>0外部条件:a*b可以具有多个不同的真实值,这虽然很好,IF但会引起数学问题。

c=a*b>0
?c*a*(a=b)+(c+1)*(a+b)

这是标准的把戏IF在剔除。当ctrue时,c*a*(a=b)is -a*(a=b)(c+1)*(a+b)is 0; when c为假,c*a*(a=b)is 0(c+1)*(a+b)is a+b。因此,此表达式给出与相同的结果IF ... THEN ... ELSE。唯一的问题是,它使我们的程序从40个字节变为38个字节。也许我们可以通过重新排列数学来缩短它。

c=a*b>0
?c*a*(a=b)+c*(a+b)+a+b

还有40个字节...

c=a*b>0
?c*(a+b+a*(a=b))+a+b

现在我们的程序回到38个字节。但是由于只使用了c一次,所以不必再将其分配给变量:

?(a*b>0)*(a+b+a*(a=b))+a+b

现在我们只有36个字节。

但是,还有更多……这种a+b+a*(a=b)表达看起来有点多余。a*(a=b)-a如果a=b0否则。将其添加到时a,将得到0if a=baelse。也许我们可以通过逆转条件以更少的字节数来实现同一件事。

b+a*-(a<>b)

首先,它看起来并不短。但是我们可以通过减去而不是添加负数来保存字节:

b-a*(a<>b)

那里有35字节的解决方案。


那边
的好戏

1

干净46个 43 42个字节

import StdEnv
?[a,b]|a<1||a==b=b=0

?o sort

在线尝试!

匿名组合:: [Int] -> Int,对配对进行排序,然后匹配第一个成员。

作为组合的lambda进行操作的长度是相同的:

import StdEnv

(\[a,b]|a<1||a==b=b=0)o sort

1

果冻7 6字节

׬o=a»

在线尝试!尝试所有组合!

怎么样?

׬o=a»   Dyadic link
×        Multiply the two arguments.
 ¬       Logical not. Gives 1 if one argument is 0, 1 otherwise.
   =     Are the two arguments equal?
  o      Logical or the result of = and ¬. 
     »   Greater of the two arguments.
    a    Logical and. Gives the greater of the two arguments if they are equal
         or if one of them is zero and gives 0 otherwise.

使用APL答案中的方法,我们得到相同的字节数。比该答案长一个字节,因为最小公倍数是两个字节。

6个字节

«=æl×»

在线尝试!


我还要注意以下一种替代方法
-H.PWiz,

@ H.PWiz哦,我以为您使用的链接中使用的方法相同
dylnan

我给出两种方法∧=⌊=*⌊。果冻更喜欢其中的第二个
-H.PWiz,

@ H.PWiz我不会说APL,我只是在使用您描述的方法。怎么=*⌊办?
dylnan '18

除了最低限度外,它与Jelly几乎相同。或者可以同时使用×两种语言
H.PWiz,
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.