缩短已经很短的数学表达式


15

一次,我做了一些实际的工作,更新了旧代码,碰到了一个表达式,该表达式等于在老式数学中用πx+ e x编写的表达式。我认为编写它的时间可能比使用我使用的语言(APL)编写的时间短,因此提出了一个非常简单的挑战:

编写一个函数或程序(以任何方式)接受零个或多个数字,并返回(以任何方式)x = 每个给定数字的上述表达式的结果,每个结果至少具有3个有效数字。

如果您的语言没有π和/或e,请使用值3.142和2.718。

得分是字节数,因此请以开头# LanguageName, 00 bytes

不允许使用标准孔。


编辑:现在,我想出了一个解决方案,○+*已被发现。原始代码为(○x)+*x


5
输入来自哪个域?整数,实数,复数?
马丁·恩德

1
@MartinBüttner无论您喜欢什么,只要输出不限于整数即可。
2015年

Answers:


21

Dyalog APL,3个字符

作为一个默认的短语。

○+*

Monadic 将其自变量乘以π,monadic *是指数函数exp○+*(○+*)ω等于的火车(○ω)+(*ω)。由于这是APL,因此该短语适用于任意形状的参数,例如e。G。您可以传递任意长度的向量。

在J中o.+^o.存在^存在相同的解决方案是可能的*


:-)参见OP中的“编辑:”。
2015年

所以,我误判了你,只是意识到。介意进行一些小的编辑,以便我可以更改它?
ankh-morpork

@ dohaqatar7喜欢这个吗?
FUZxxl 2015年

30

Emotinomicon,48个字节/ 13个字符

我这样做不是因为它很短,而是因为它很有趣。 在这里尝试。您必须将其复制并粘贴到文本框中。

😼⏪🆙😦✖😎😿➕😨😼🆙😄⏩

说明:

😼  ⏪   🆙  😦  ✖   😎  😿  ➕   😼  🆙  😄  ⏩   explanation
😼                                              take numeric input
    ⏪                                           open loop
        🆙                                      duplicate top of stack
            😦                                  push pi
                ✖                               multiply top two elements on stack
                    😎                          reverse stack
                        😿                      pop N, push e^N
                            ➕                   add top two elements on stack
                                😼              take numeric input
                                    🆙          duplicate top of stack
                                        😄      pop N, push N+1
                                            ⏩   close loop

这是在其本机环境中的程序,即手机: the image


1
绝对是最有趣的表情。
2015年

7
大声笑,猫cat吗?
geokavel

3
我想要这种语言。
Faraz Masroor 2015年

2
我想你可以说他使用了子表达式。(•_•)(•_•)>⌐■-■(⌐■_■)
艾迪生·克伦普

9

R,25 24字节

cat(exp(x<-scan())+pi*x)    

是这个吗?它从用户处获取输入,将其分配给x,计算其指数乘以pi,最后cat()输出结果。

编辑:由于Alex A,节省了1个字节


1
在我看来不错。
2015年

2
24个字节:cat(exp(x<-scan())+pi*x)
Alex A.

在这种情况下,您必须<-像我的建议一样使用,而不是=因为否则它是在设置x参数exp而不是分配变量x。在新的会话中,当前代码将失败。
Alex A.

7

JavaScript(ES6),39 34字节

@ edc65节省了5个字节

a=>a.map(x=>x*Math.PI+Math.exp(x))

将输入作为数字数组,并以相同格式输出。

由于减少了,现在有了三个等效的45字节程序,所有程序都符合ES5:

for(;x=prompt();)alert(x*Math.PI+Math.exp(x))
for(M=Math;x=prompt();)alert(x*M.PI+M.exp(x))
with(Math)for(;x=prompt();)alert(x*PI+exp(x))

输入应该一次输入一次。按确定而不输入任何内容退出。

第三个突出显示了JS中一个有趣的功能:with语句。尽管有时使用起来不安全(因此在严格模式下已禁用),但仍可以使用它来保存键入每次对象名称和句点的时间。例如,您可以这样做:

x=[];with(x)for(i=0;i<5;i++)push(length);

push并且length随后被用作性能x,这将导致与x[0,1,2,3,4]

这适用于任何对象,甚至是非变量,因此,例如,您可以执行以下操作:

with("0123456789ABCDEF")for(i=0;i<length;i++)alert("0x"+charAt(i)-0);

charAtlength称为字符串的属性。"0x"+x-0转换x从十六进制值的数,所以这个alertS中的数字0到15。


1
M.pow(M.E,x)M.exp(x)通过定义
edc65

@ edc65我应该学习我的Math;)谢谢!
ETHproductions 2015年

我不知道with已弃用。
Conor O'Brien

@CᴏɴᴏʀO'Bʀɪᴇɴ我不好;不建议弃用它,但强烈建议您避免使用它
ETHproductions 2015年

那就是我记得读的书。^ _ ^无论如何我都会在<canvas>渲染和(当然)打高尔夫球时使用它。
Conor O'Brien 2015年

6

Mathematica,11 个10字节

N@Pi#+E^#&

使用LegionMammal978,节省了1个字节。


目前这不起作用。但是,对于10个字节:1.Pi#+E^#&
LegionMammal978

#和之间缺少空格Pi。通过使用Pi#代替来解决#Pi。同样,N只需要应用于Pi#,而不是整个表达式。
DavidC

6

佩斯,11 13

VQ+*N.n0^.n1N

现在以x列表为例,例如[1.25, 2.38, 25]

上一个(11个字节): +*Q.n0^.n1Q

VQ            +       * N .n0            ^ .n1 N
For each      Add     List Item * Pi     e ^ List Item
input item

当我尝试使用在线解释器时,它仅适用于单个数字。或输入格式是什么?规范说输入是“零个或多个数字”,并且表达式必须针对“每个给定数字”进行求值。
Reto Koradi 2015年

@RetoKoradi您可以通过选中“切换到测试套件”框来使用多个数字(在单独的行上)运行它。现在您提到它,我不确定是否允许这样做。
麋2015年

5

认真地,10个字节

,`;e(╦*+`M

十六进制转储:

2c603b6528cb2a2b604d

在线试用

将输入作为列表(例如,请参阅链接)。

说明:

,                               Get input list
 `      `M                      Map this function over it
  ;                             Copy the input value.
   e                            exponentiate
    (                           dig up the other copy
     ╦*                         multiply by pi
       +                        add


5

TI-BASIC,5个字节

πAns+e^(Ans

TI-BASIC不使用ASCII字节,所以每个这些被存储在计算器一个字节:πAns+e^(,和Ans。假定先前的表达式是输入(如{1,2,3})。


5

Python 2,38个字节(数学上为52 49个字节)

lambda l:[3.142*x+2.718**x for x in l]

如果必须使用数学模块:

from math import*
lambda l:[pi*x+e**x for x in l]

输入内容应为数字列表

f([1,2,3,4,5])

> [5.8599999999999994, 13.671524, 29.505290232, 67.143510850576007, 164.04623849186558]

2
If your language does not have π and/or e, use the values 3.142 and 2.718.... Python 在模块中具有pi和。emath
Zach Gates

@ZachGates添加了带有数学模块的版本。
TF,2015年

您可以math使用from math import*
wnnmaw

@wnnmaw谢谢!
TF场

您也可以使用 for x in l:lambda l:pi*x+e**x在两个答案中而不是理解来问题
wnnmaw 2015年

4

MATL,9字节

该答案使用当前版本的语言(3.1.0),它比挑战更早。

itYP*wZe+

输入是一个包含所有数字的向量(列表用方括号括起来,并用空格,分号逗号分隔),例如[5.3 -7 3+2j]。允许使用复数值。输出有15个有效数字。

>> matl itYP*wZe+
> [1 2 3]
5.859874482048839 13.67224140611024 29.51031488395705

说明

简单的操作:

i       % input  
t       % duplicate 
YP      % pi   
*       % multiplication
w       % swap elements in stack                           
Ze      % exponential                                      
+       % addition 

4

MATLAB:70个字节

@(x)num2str(arrayfun(@(x)(round(pi*x+exp(x),2-floor(log10(pi*x+exp(x))))),x))

测试:

ans(1:10)
5.86            13.7            29.5            67.2             164             422            1120            3010            8130           22100

说明:数字格式存在多个问题。

首先,这个问题需要3个签名。Matlab没有内置功能可按sig-figs(仅按小数位)四舍五入,因此需要以下解决方法:

floor(log10(pi*x+exp(x)))) 计算最大有效数字。

@(x)(round(pi*x+exp(x),2-floor(log10(pi*x+exp(x))))),x)) 接受输入 x并四舍五入到3个有效数字。

另一个要求是处理多个输入。上面的代码只能使用一个数字。为了减轻这种情况,我们使用arrayfun评估每个矢量元素的功能。

最后一个问题,Matlab用自己的舍入显示arrayfun的结果,该结果会导致输出1.0e+04 * 0.0006违反3 sig-fig要求。因此,num2str用于将数组转换为char格式。

Matlab可以很好地进行数值分析,但是坦率地说,在进行精细数字格式化时很烂

UPD:好吧,这让我感到困惑

至少3位有效数字

3位有效数字

无论如何,我将以这种形式留下我的答案,因为@costrom已经给出了15个字节的Matlab解决方案


2
什么?!你为什么要做所有这些?
2015年

4
这是代码保龄球吗?
Stewie Griffin

我将为答案添加解释
brainkz 2015年

1
它只说至少 3个信号图,而不是精确的3个。如果format longg在运行代码之前指定了要求,则将此处的长度缩短3/4
costrom

@costrom是的,你是对的,我承认你赢了:)
brainkz 2015年

4

朱莉娅,12个字节

x->π*x+e.^x

这是一个匿名函数,它接受一个数组并返回一个浮点数数组。要给它起个名字,例如f=x->...

朱莉娅(Julia)具有内置常数,π并且(e对于您猜对了)分别具有π和e。该.^操作被矢量幂。


3

Japt,12个字节

N®*M.P+M.EpZ

将输入作为空格分隔的数字。在线尝试!

怎么运行的

N®   *M.P+M.EpZ
NmZ{Z*M.P+M.EpZ

        // Implicit: N = array of inputs, M = Math object
NmZ{    // Map each item Z in N to:
Z*M.P+  //  Z times PI, plus
M.EpZ   //  E to the power of Z.
        // Implicit: output last expression

当您的年薪为5,554时,我不希望您投票。
Conor O'Brien 2015年

3

J,4个字节

o.+^

与APL相同○+*,但J的pi times函数称为o.,其长度增加了一个字节。



2

Par,8字节

✶[″℗↔π*+

接受输入为 (1 2 3)

说明

               ## [implicit: read line]
✶              ## Parse input as array of numbers
[              ## Map
 ″             ## Duplicate
 ℗             ## e to the power
 ↔             ## Swap
 π*            ## Multiply by π
 +             ## Add

2

拍子,27字节

map(λ(x)(+(* pi x)(exp x)))

当放在表达式的函数位置时:

(map(λ(x)(+(* pi x)(exp x))) '(1 2 3 4))

> '(5.859874482048838 13.672241406110237 29.510314883957047 67.16452064750341)

2

CJam,13个字节

q~{_P*\me+}%p

将输入作为一个由空格分隔的数组(例如[1 2 3])。在线尝试。

说明

q~    e# Read the input and evaluate it as an array
{     e# Do this for each number x in the array...
  _P* e# Multiply x by pi
  \me e# Take the exponential of x (same as e^x)
  +   e# Add the two results together
}%
p     e# Pretty print the final array with spaces

@NBZ完成,感谢您的澄清。
NinjaBearMonkey 2015年

1

Reng v.3.3,53个字节

非竞争性的,因为它推迟了挑战,但是嘿,为简洁起见,没有赢得任何奖项。:P 在这里尝试!

2²5³*:"G"(%3+i#II*ZA*9+(%2+#E1II0e1+ø
1-)E*(:0eø
$+n~

0行

这是第0行中的堆栈视图:

Sequence read | Stack
2²            | 4
5³            | 4 125
*             | 500
:             | 500 500
"G"           | 500 500 71
(             | 500 71 500
%             | 500 0.142
3+            | 500 3.142
i             | 500 3.142 <i>
#I            | 500 3.142     ; I <- i
I             | 500 3.142 <i>
*             | 500 3.142*<i>
ZA            | 500 3.142*<i> 35 10
*             | 500 3.142*<i> 350
9+            | 500 3.142*<i> 359
(             | 3.142*<i> 359 500
%             | 3.142*<i> 0.718
2+            | 3.142*<i> 2.718
#E            | 3.142*<i>     ; E <- 2.718
1II0          | 3.142*<i> 1 <i> <i> 0
e             | 3.142*<i> 1 <i> <i>==0
1+            | 3.142*<i> 1 <i> (<i>==0)+1

ø然后转到下一个第N行。当0输入时,它直接进入第2行。否则,我们进入第1行。

1号线

1-)E*(:0eø

这是E的i倍数,即e^i。我们将计数器递减(最初是I),将STOS(我们的运行e功率)乘以E,返回到计数器,然后执行此操作(i'是当前计数器):

Sequence read | Stack (partial)
              | i'
:             | i' i'
0             | i' i' 0
e             | i' i'==0

ø然后做两件事之一。如果计数器不为0,则转到“下一个”第0行,即当前行的开头。如果为零,则0e产生1,然后转到下一行。

2号线

$+n~

$下降计数器(在地板上!)。+将前两个结果相加,n输出该数字,然后~退出程序。

情况1:输入为0。TOS为1(“ e ^ 0”),STOS为0(pi * 0)。将它们相加会得到正确的结果。

情况2:输入不为0。结果与您预期的一样。

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.