查找获得结果所需的操作


10

因此,任务很简单,给定数字和结果数组,您需要从array中找到需要对数字进行哪些操作才能获得请求的结果。

让我们简化启动过程,只允许执行基本操作,例如:加法,减法,乘法和除法。

例:

Input  : [5,5,5,5,5] 100
Output : 5*5*5-5*5

为了给Java之类的语言带来一些好处,请求是实现功能,而不是整个程序,结果可以通过参数返回或打印到控制台。

代码是根据字节数计分的,这是高尔夫球代码挑战赛中得分最低的获胜者。

另一个要求是,如果数组仅包含digids,则可以从以下数字构造数字,从而获得-10分。即

Input  : [1,2,3,4,5] 0
Output : 12-3-4-5

请注意,如果输出是建议的输出,则某些情况下可能有多个解决方案。您将根据自己的任务提供一个或多个解决方案。

编辑: 从数学的角度来看,结果必须是有效的,因此除法是有理除法,而不是整数,并且运算优先级与经典数学中的相同(首先是乘除法,然后是加法和减法)。


4
确实*/有超过precendence +-?您的两个示例相互矛盾。
Leaky Nun

1
请在未来,一定要创建基于百分比的恩泽,对于语言,比如Java,-10字节不如果冻
巴林特


4
是否需要按顺序使用数字?另外,对于将来的挑战,我衷心建议使用沙盒,在发布到Main之前可以解决这些问题。
AdmBorkBork

2
@ mbomb007这不是任何一个的重复。这些是任意的数字输入,并且仅允许基本的数学运算,而不能输出实际程序。
Patrick Roberts

Answers:



4

的Oracle SQL 11.2 322个 304 270字节

SELECT o FROM(SELECT REPLACE(SUBSTR(:1,1,1)||REPLACE(SYS_CONNECT_BY_PATH(a||SUBSTR(:1,LEVEL*2+1,1),','),','),'_')o,LEVEL l FROM(SELECT SUBSTR('+-*/_',LEVEL,1)a FROM DUAL CONNECT BY LEVEL<6)CONNECT BY LEVEL<LENGTH(:1)/2)WHERE:2=dbms_aw.eval_number(o)AND l>LENGTH(:1)/2-1;

:1是数字列表
:2是搜索结果

未打高尔夫球:

SELECT o
FROM   (
         SELECT REPLACE(SUBSTR(:1,1,1)||REPLACE(SYS_CONNECT_BY_PATH(a||SUBSTR(:1,LEVEL*2+1,1),','),','),'_')o,LEVEL l 
         FROM ( -- Create one row per operator 
                SELECT SUBSTR('+-*/_',LEVEL,1)a FROM DUAL CONNECT BY LEVEL<6
              ) CONNECT BY LEVEL<LENGTH(:1)/2  -- Create every combination of operators, one per ','
)
WHERE :2=dbms_aw.eval_number(o)  -- filter on result = evaluation
  AND l>LENGTH(:1)/2-1           -- keep only expressions using every digits

4

TSQL(SQLSERVER 2016)310个 294 280字节

编写丑陋代码的绝佳机会:

打高尔夫球:

DECLARE @ varchar(max)= '5,5,5'
DECLARE @a varchar(20) = '125'

,@ varchar(max)='';WITH D as(SELECT @a a UNION ALL SELECT STUFF(a,charindex(',',a),1,value)FROM STRING_SPLIT('*,+,./,-,',',')x,d WHERE a like'%,%')SELECT @+=a+','''+REPLACE(a,'.','')+'''),('FROM D WHERE a not like'%,%'EXEC('SELECT y FROM(values('+@+'null,null))g(x,y)WHERE x='+@b)

在线尝试

可读的:(插入小数点(。)并删除小数点是必需的,以便sql接受4/5不是0-删除是供测试它的人员使用)

DECLARE @a varchar(max)= '5,5,5'
DECLARE @b varchar(20) = '5'

,@ varchar(max)=''
;WITH D as
(
  SELECT @a a
  UNION ALL
  SELECT STUFF(a,charindex(',',a),1,value)
  FROM STRING_SPLIT('*,+,./,-,',',')x,d
  WHERE a like'%,%'
)
SELECT @+=a+','''+REPLACE(a,',','')+'''),('
FROM D
WHERE a not like'%,%'

EXEC('SELECT y FROM(values('+@+'null,null))g(x,y)WHERE x='+@b)

此解决方案还可以处理以下类型的输入:

输入:[1,2,3,4,5] 0输出:12-3-4-5


3

的JavaScript(ES6),165个 147字节

a=>o=>(c=[],i=c=>{for(j=0;!((c[j]?++c[j]:c[j]=1)%5);)c[j++]=0},eval(`while(eval(e=(a+'').replace(/,/g,(_,j)=>'+-*/'.charAt(c[~-j/2])))!=o)i(c);e`))

嵌套的eval...可爱。

f=a=>o=>(c=[],i=c=>{for(j=0;!((c[j]?++c[j]:c[j]=1)%5);)c[j++]=0},eval(`while(eval(e=(a+'').replace(/,/g,(_,j)=>'+-*/'.charAt(c[~-j/2])))!=o)i(c);e`))
console.log(f([5,5,5,5,5])(100))
console.log(f([1,2,3,4,5])(0))
console.log(f([3,4])(0.75))
console.log(f([3,4,5,6])(339))


3

Python 3中,170个 155字节

from itertools import*
def f(n,o):print({k for k in[''.join(map(str,sum(j,())))[1:]for j in[zip(x,n)for x in product('+-*/',repeat=len(n))]]if eval(k)==o})

创建一个具有所有可能运算符顺序的生成器,将其与数字相结合,然后进行求值直到得到答案。

https://repl.it/C2F5


2
您可以通过替换['+','-','*','/']为来节省一些字符'+-*/';由于strings是可迭代的,因此将其视为array与- 一样,并且每个元素都是-中的每个字符,string因此它的行为就像您为它提供的当前数组一样。
nasonfish '16

2

Python中,195个 186字节

这是一种残酷的方式。

def x(i,r):
 t=""
 from random import choice as c
 while True:
  for j in i:
   t+=str(j)
   if c([0,1]):t+="."+c("+-/*")
  t=t.strip("+-*/.")+"."
  v=eval(t)
  if v == r:print t
  t=""

该函数x接受的一个参数list和一个result- x([1,2,3,4,5], 15)例如。

该程序开始一个循环,在该循环中,我们开始随机选择是"+", "-", "*", or "/"在每个数字之间追加还是将它们连接在一起。这似乎比实际进行排列并尝试每种组合来查找每个结果更简洁,尽管运行时间更长且效率得多。(幸运的是,在这种情况下这不是问题!)

它还附加了“。” 到每个数字,以避免进行整数舍入运算6/4 = 1。然后,它eval是我们的表达式,并确定结果是否等于期望值,如果是,则输出该表达式。

该程序永远不会退出-它将持续输出结果,直到被杀死。

编辑1:删除if可以使用单行语句的不必要的换行符。


真的很有趣的实现。但易于保存更多字节,请在线尝试!(176字节)
bobrobbob

2

Matlab,234页 238 258 个字节

基于其他答案的局限性,我假设输入数组的数字顺序由法定命令维护。

n=length(x)-1
k=n*2+2
p=unique(nchoosek(repmat('*-+/',1,n),n),'rows')
p=[p char(' '*~~p(:,1))]'
c=char(x'*~~p(1,:))
o=p(:,r==cellfun(@eval,mat2cell(reshape([c(:) p(:)]',k,[]),k,0|p(1,:))))
reshape([repmat(x',size(o,2),1) o(:)]',k,[])'

这段代码使用一串数字x,说x = '12345'和结果r,说r = 15并返回所有表达式的字符串可以评估获得rx使用四个运营商。

我使用了两种不同的长度等效方式来避免使用ones(length())-type或repmat(length())-type表达式:~~p(1,:)它返回in p1的非非值(即与的第一维长度相同的s 列表p),0|p(:,1)并返回0或is-there -a-value-in- p(即的列表,1其长度与的第二维相同p)。

Matlab没有nchoosek with替换方法,因此我将运算符重复了正确的次数,nchoosek为较大的运算符选择计算了整个空间,然后使用unique调用将结果缩减为应有的值(删除等效的组合,例如“ *** +”和“ *** +”)。为了连接目的,我添加了一个尾随空格以匹配输入向量的长度,然后将运算符字符串与输入字符串组合到矩阵的列中。然后,我按列评估表达式以获取结果,并找到结果与我们输入匹配的那些列所对应的运算符顺序r

测试:x = '12345'r = 15

1*2*3+4+5 
1+2+3+4+5 
1-2*3+4*5 

如果我必须采用双精度值数组,则需要x = num2str(x,'%d');将数字转换为字符串,将21分(20分不带;)加到我的分数中。*多余的字节纯粹是我留下的分号,因此任何运行此代码的人都不会看到命令提示符被长数组弄乱了。由于我的编辑现在无论如何都会产生大量有关逻辑和冒号操作数的警告,因此我在新版本中删除了分号。

编辑2:忘记更换2*n+2k

旧答案:

n=length(x)-1;
p=unique(nchoosek(repmat(['*','-','+','/'],1,n),n),'rows');
l=length(p);
p=[p repmat(' ',l,1)]';
c=reshape([repmat(x',l,1) p(:)]',n*2+2,[]);
o = p(:,r == cellfun(@eval, mat2cell(c,n*2+2,ones(l,1))));
reshape([repmat(x',size(o,2),1) o(:)]',n*2+2,[])'

2

JavaScript(ES6),88个字节

a=>o=>eval(`while(eval(e=(a+'').replace(/,/g,_=>'+-*/'.charAt(Math.random()*5)))!=o);e`)

随意混合。比系统地迭代组合要容易得多。

测试套件

f=a=>o=>eval(`while(eval(e=(a+'').replace(/,/g,_=>'+-*/'.charAt(Math.random()*5)))!=o);e`)
console.log(f([5,5,5,5,5])(100))
console.log(f([1,2,3,4,5])(0))
console.log(f([3,4])(0.75))
console.log(f([3,4,5,6])(339))


1

PHP,108字节

for(;$i=$argc;eval("$s-$argv[1]?:die(\$s);"))for($s="",$x=$p++;--$i>1;$x/=4)$s.="+-*/"[$s?$x&3:4].$argv[$i];

从命令行参数以相反的顺序获取输入。用运行-r

分解

for(;                   # infinite loop:
    $i=$argc;               # 1. init $i to argument count
    eval("$s-$argv[1]?:"    # 3. if first argument equals expression value,
        ."die(\$s);")       #    print expression and exit
    )
    for($s="",              # 2. create expression:
        $x=$p++;            #    init map
        --$i>1;                 # loop from last to second argument
        $x/=4)                  # C: shift map by two bits
        $s.="+-*/"[$s?$x&3:4]   # A: append operator (none for first operand)
            .$argv[$i];         # B: append operand

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.