组合两个数字之和,乘积和差的运算符


28

挑战:

在社交网络上流传着一个愚蠢的谜题,上面写着:

8 + 2 = 16106
5 + 4 = 2091
9 + 6 = ?

实现一个功能或操作给定两个正整数时,xy这样x > y > 0,得到的正确答案为整数,如果回答的数字是数字x * y后跟数字的x + y后面的数字x - y。很简单的。

规则:

  • 不允许出现标准漏洞。
  • 这是因此以字节为单位的最短代码获胜。
  • 输入数据验证不是必需的。当输入无效时,该程序可能崩溃或返回垃圾。
  • 您可以使用数字函数和运算符(包括整数和浮点数,数学库函数以及其他接受和返回数字的函数)。
  • 如果适用,您可以使用返回数字位数的函数。
  • 不是允许使用字符串或任何类型的代码中的级联的任何地方。
  • 结果可能会被返回或推入堆栈,无论哪种语言都适用。结果必须是整数,而不是字符串。

样例代码:

Dyalog APL

以下代码创建一个名为的二元运算符X

X←{(⍺-⍵)+((⍺+⍵)×10 * 1 +⌊10⍟⍺-⍵)+⍺×⍵×10 *(2 +⌊10⍟⍺+⍵)+⌊10⍟⍺- ⍵}

说明:

  • 在APL中,您从右到左求值。

  • ⍺ and ⍵ 分别是左和右操作数

  • ⌊10⍟⍺-⍵读取:floor of log10(⍺-⍵)。首先执行减法,然后对数,然后求底。从右到左。进行log10以便计数的位数⍺-⍵(之后必须加1)。

  • ⍺×⍵×10*(...) 读取: 10 to the (...)th power, multiplied by ⍵, multiplied by ⍺

  • 因此,⍺×⍵×10*(2+⌊10⍟⍺+⍵)+⌊10⍟⍺-⍵是乘积之和向左移动了总和与差之和的位数。乘以10的幂将使整数向左移动。

  • ((⍺+⍵)×10*1+⌊10⍟⍺-⍵) 是总和,向左移动差值的位数。

  • (⍺-⍵)就是区别。此处无需移动。

  • X←{...} 是您在APL中定义运算符的方式。

例子:

      8 X 2
16106
      5 X 4
2091
      9 X 6
54153

GNU DC:

以下代码创建一个名为的宏a

[sysx10lxly-dseZdsclxly+dsd+Z1+^lxly**10lc^ld*+le+]sa

说明:

  • sxsy从堆栈中弹出一个元素,并将其分别保存在寄存器x和中y

  • lxly来自寄存器加载元件xy分别并将其推到堆栈中。

  • d 复制堆栈中的最后一个元素。

  • ^ 计算两个数字的幂。

  • Z弹出一个数字并返回其数字位数。这样做是因为dc没有对数功能。

  • [...]sa将宏存储在寄存器中ala加载它。x在堆栈顶部执行宏。

例子:

8 2 laxn
16106
5 4 laxn
2091
9 6 laxn
54153

我假设从整数到字符串的转换无效?
Anthony Pham

2
我认为我们已经遇到了类似的挑战,但不知道什么条件会找到骗子。
xnor

2
@AnthonyPham“不允许在代码的任何地方使用字符串或任何类型的串联。”
ASCII码,仅ASCII

1
我们可以接受一对整数作为输入吗?
科纳·奥布莱恩

1
我可以编写完整的程序而不是功能吗?
大公埃里克(Erik the Outgolfer)

Answers:


10

JavaScript(ES7),63 61 59字节

感谢Neil,节省了4个字节

(a,b)=>[a*b,a+b,a-b].reduce((p,c)=>p*10**-~Math.log10(c)+c)

<input id=a type=number oninput="c.innerText=((a,b)=>[a*b,a+b,a-b].reduce((p,c)=>p*10**-~Math.log10(c)+c))(+a.value,+b.value)">
<input id=b type=number oninput="c.innerText=((a,b)=>[a*b,a+b,a-b].reduce((p,c)=>p*10**-!Math.log10(c)+c))(+a.value,+b.value)">
<p id=c>


使用保存几个字节10**-~Math.log10(c)。(reduce当然,但要使用+1 )
Neil

“ ES7”哦,对编码的热爱...他们正在制作另一个?
Feathercrown

@Feathercrown是的,但是真的比听“ Java 9”还差吗?此外,它还具有诸如async/ await和求幂运算符之类的有用信息**
仅ASCII格式,

**我同意@ ASCII-only 非常有用。这应该在ES6中进行。
Feathercrown


6

巴什66

  • 感谢@chepner,节省了2个字节。
f()(s=$[$1+$2]
d=$[$1-$2]
echo $[($1*$2*10**${#s}+s)*10**${#d}+d])

在线尝试


如果将变量(s,d和另一个未定义的用于乘法的变量)彼此相邻放置并作为算术表达式求值,则可以使该变量缩短近两倍。
Maxim Mikhaylov

3
@MaxLawnboy是的,尽管这听起来很像是我所禁止的字符串连接。
Digital Trauma'4

1
里面的标识符名称$[...]可以进行参数扩展而无需使用显式$(例如,d代替$d),从而节省两个字符。
chepner '17

@chepner是的-谢谢-我想念那些。
Digital Trauma

找到另外两个;用于((s=$1+$2,d=$1-$2))初始化两个变量。
chepner

5

EXCEL,61字节

=A1-B1+(A1+B1)*10^LEN(A1-B1)+A1*B1*10^(LEN(A1-B1)+LEN(A1+B1))

Excel,18个字节无效

=A1*B1&A1+B1&A1-B1

5

堆叠,36字节

,@A$(*+-){!A...n!}"!{%y#'10\^x*y+}#\

在线尝试!

先前: ,@A$(-+*){!A...n!}"!:inits$#'"!$summap:pop@.10\^1\,\*sum

在编写说明之前,我将尝试挤出一两个字节。(#'=的大小,并且"是“各做”,此处未附加任何字符串。)

26字节不竞争:$(*+-)#!!:{%y#'10\^x*y+}#\



4

GNU dc,36

定义一个m接受堆栈顶部两个成员的宏,应用该宏并将结果保留在堆栈上(按照问题中的示例):

[sadsbla-dZAr^lalb+*+dZAr^lalb**+]sm

在线尝试



3

果冻,27个字节

+,ạ,.1Fl⁵Ḟ‘€Ṛ+\⁵*
ạ,+,×Fæ.ç

定义二元链接/函数,可通过调用ç。将两个整数作为输入并返回一个整数。它具有能够取x <y或x 的额外好处>使用绝对差 y。

在线尝试!

说明:

+,ạ,.1Fl⁵Ḟ‘€Ṛ+\⁵* -- Create link which computes what order of magnitude
                        to multiply the difference, sum, and product by
ạ,+,×Fæ.ç         -- Main link, applies this using dot product

细节:

+,ạ,.1Fl⁵Ḟ‘€Ṛ+\⁵* -- Create dyadic like which does the following:
       l⁵Ḟ‘       -- Create operation which computes number of digits
                       (log base 10 (⁵ is the literal 10), floored, incremented)
           €      -- Apply this to each element in
+,ạ,.1F           -- ... the list [sum,difference,.1]
            R     -- Reverse the list
             +\   -- Add up first n elements to get list.
               ⁵* -- Raise 10 (⁵ is literal 10) to the power of each element

ạ,+,×Fæ.ç         -- Main link, applies above link
ạ,+,×F            -- The list [difference, sum, product]
      æ.          -- Dot product (multiply corresponding elements) with
        ç         -- The above link.

2

PHP,79 75字节

两个版本:

[,$a,$b]=$argv;echo(10**strlen($s=$a+$b)*$a*$b+$s)*10**strlen($d=$a-$b)+$d;
[,$a,$b]=$argv;echo(10**strlen($a+$b)*$a*$b+$a+$b)*10**strlen($a-$b)+$a-$b;

从命令行参数获取输入;与运行-r

尽管它使用数字作为字符串strlen
但我猜它可以算作“返回数字位数的函数” 。让我知道是否。


“不允许在代码中的任何地方使用字符串或任何类型的串联。”所以我认为这strlen是无效的。
numbermaniac

@numbermaniac让OP决定。Imo的限制是迫使解决方案创建一个结果,而不仅仅是彼此打印三个结果。除此之外,一切都在挑剔。
泰特斯

2

C(gcc),70个字节

#define _ for(c=1;a+b>=(c*=10););d=c*d+a-(b=-b);
c,d;f(a,b){d=a*b;_ _}

在线尝试!

基于Steadybox答案,将所有内容都放入宏中以进行更多操作。

(注意:意外地将结果分配给d而不是a工作。我看了一下生成的汇编代码,似乎还可以。)


2

Haskell,54个字节

a%0=a
a%b=10*a%div b 10+mod b 10
a#b=(a*b)%(a+b)%(a-b)

拼图是通过infix函数#(例如)实现的8#2 = 16106。另一个函数%定义以10为基的串联(假设RHS大于0)。



1

PHP,87字节

[,$a,$b]=$argv;echo($s=$a-$b)+($t=$a+$b)*10**($l=strlen($s))+$a*$b*10**($l+strlen($t));

无效的37字节解决方案

[,$a,$b]=$argv;echo$a*$b,$a+$b,$a-$b;

1

Ruby,61个字节

->a,b{[a*b,a+b,a-b].reduce{|x,y|z=y;x*=10while(z>z/=10);x+y}}

它看起来很像这个 Javascript答案,但是没有使用对数。


1

Python,92 91个字符

def g(x,y):
    l=lambda x,i=0:l(x/10,i+1)if x else 10**i
    a=x-y
    a+=(x+y)*l(a)
    return x*y*l(a)+a

感谢巫师的建议;)


欢迎光临本站!)和之间不需要空格if
小麦巫师

1

R(3.3.1),104字节

function(x,y)Reduce(function(p,q)p*10^(floor(log10(q)+1))+q,lapply(c(`*`,`+`,`-`),function(z)z(x,y)),0)

返回一个匿名函数。

这是我第一次打高尔夫球,因此希望您能给予任何反馈。


1
我要说尽量避免通过保留字“功能”定义功能,因为它会占用大量字节。只需进行计算即可。
user11599 '17

0

REXX,70个字节

f:arg a b
c=a-b
c=(a+b)*10**length(c)+c
c=a*b*10**length(c)+c
return c

当然,本机方式会更短:

f:arg a b
return a*b||a+b||a-b

0

PowerShell,88字节

param($x,$y)$l=2;if(($a=$x+$y)-gt9){$l++};($x*$y)*[math]::Pow(10,$l)+$a*10+$x-$y

PowerShell对电源操作员没有帮助,这无济于事。也不能计算整数的长度,除非您将其作为字符串计算,这是我们做不到的,所以我检查一下是否-gt知道它的长度为9。可能会更简洁,但我必须重新开始工作。


0

Python 2.7版,109个 96字节

import math
a=lambda n:10**int(math.log10(10*n))
b,c=input()
d=b-c+(b+c)*a(b-c)
print d+b*c*a(d)

在遵循比赛规则后已更正。致谢mbomb007,将代码从109字节减少到96字节


1
从这个挑战的规则-•You're not allowed to use strings or any kind of concatenation anywhere in your code.
AdmBorkBork

您可以通过创建alambda 来节省一些字节。a=lambda n:10**int(...。您也可以这样做b,c=input(),用逗号分隔两个输入。
mbomb007'4

@ mbomb007 b,c = input()给出TypeError:'int'对象不可迭代。我已经试过了 而且lambda函数不会保存字节,因为我在代码中两次调用了该函数。也尝试过。:(
Koishore Roy

@KoishoreRoy我不认为你明白我的意思。96个字节
mbomb007 '04

0

J,25个字节

X=.10#.[:;10#.inv&.>*;+;-
  1. *;+;- 装箱每个操作的结果。
  2. 10#.inv&.>将每个结果转换为以10为基数的数组。(inv^:_1
  3. [:; 取消装箱并加入阵列。
  4. 10#. 将以10为基数的数字数组转换为整数。
  5. X=.将以上定义为运算符X

结果:

   8 X 2
16106
   5 X 4
2091
   9 X 6
54153

You don't need X=.
Cyoce

@Cyoce - the sample APL code in the challenge defines an operator. I'm pretty sure we're supposed to define a reusable operator for this challenge.
Dane

"3. [:; Unbox and join the arrays." - "You're not allowed to use strings or any kind of concatenation anywhere in your code."
ngn

@ngn - Please expand on your comment. At no point are strings used.
Dane

I just wanted to point out that "join" ("link"?) might constitute a "kind of concatenation", though I'm not very familiar with J, and I'm not sure how to interpret the problem statement in this case. My own solution raises similar questions - I use stranding (juxtaposition of nouns in APL forms a vector) which might be the same as J's "link" but without a glyph to represent it.
ngn

0

Mathematica, 67 bytes

c=Ceiling;l=Log10;#-#2+(#+#2)10^(c@l[#-#2]/. 0->1)+10^c@l[2#]10#2#&

Takes x-y, then takes the log10 of x-y, rounds it up, calculates 10 to the power of that and then multiplies it by x+y. But we also need to consider log10(x-y) being 0, so we replace 0 with 1. Then we take the log10 of 2x, rounded up, plus 1, and find 10 to the power of that. Multiply that by xy, and add that on.


0

05AB1E, 23 22 16 bytes

-Dg°¹²+*Dg°¹²**O

Try it online!

We could have saved a few bytes if we'd been allowed to use strings in the program (but not in calculations) by looping over a string containing the operations "-+*", as the code performed for each operation is the same.
Of course, if we'd been allowed to use concatenation we'd saved a lot more.


0

R, 64 bytes

x=scan();(b=(a=diff(-x))+10^nchar(a)*sum(x))+10^nchar(b)*prod(x)

Usage:

> x=scan();(b=(a=diff(-x))+10^nchar(a)*sum(x))+10^nchar(b)*prod(x)
1: 8 2
3: 
Read 2 items
[1] 16106
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.