最小总和为n的数字


15

这里的第一个问题,如果这是重复的或不好的挑战,请不要对我大喊。

介绍

我自己想到了这个挑战,对于初学者来说,这似乎是一个很好的基本难题。这也可能有助于我确定要学习哪种编码语言。

挑战

给定一个小于或等于整数n的数组,从数组中输出或返回最小数目的精确求和n

您可以选择编写函数或完整程序。

输入值

您可以放心假设0 <= n < 2^31

接受任何类型的数组或列表(允许vector用于C ++或Java LinkedList),以及n一个可选参数length,该参数指定数组的长度。

您还可以将输入作为用空格分隔的字符串,并n用逗号或空格分隔:

1 5 7 3 7 3 6 3 2 6 3,10

1 5 7 3 7 3 6 3 2 6 3 10

如果更容易。

输出量

输出或从数组中返回总和恰好为的最小数目的数字n。使用上面的示例:

1 5 7 3 7 3 6 3 2 6 3,10

您的程序应打印:

2

因为求和的最小数量10273)。

如果没有解决方案,请打印或返回一个负数,0“无解决方案”(尽管那不是很聪明),(如建议的那样)或任何其他虚假值(空字符串除外)。

输入和输出示例

输入:

1 5 7 3 7 3 6 3 2 6 3,10
143 1623 1646 16336 1624 983 122,18102
5 6 9,12

输出:

2
3
-1

计分

这是代码高尔夫球,因此以字节为单位的最短代码获胜。

最佳答案将在圣诞节接受。


我已经编辑了您的规范,因为我们通常允许对函数和程序使用相同的I / O方法。在这里看到共识。如果您不同意,请随时回滚。
lirtosiast 2015年

我们可以输出false没有解决方案的案件吗?
ETHproductions 2015年

@ETHproductions当然,会添加。
TheCoffeeCup

由于Pyth中的空字符串为false,您是否认为空输出为false?
lirtosiast 2015年

@ThomasKwa我不喜欢空的字符串输出,但是您可以在答案中包含“如果允许x ...”
TheCoffeeCup

Answers:


7

Pyth,12 11字节

lhafqsTQyEY

n作为输入的第一行,第二行为列表。

lhafqsTQyEY     (Implicit: Q = 1st line of input; E = 2nd line)
         E      The list
        yE      Powerset (sorted by increasing length; empty set first)
   f            Filter by lambda T:
     sT         sum(T)
    q                  ==
       Q                  Q
   fqSTQyE      Sublists that sum to Q, sorted by increasing length
  a       Y     append an empty array (in case none match)
lh              take the length of the first element (0 for empty array)

在这里尝试。


1
您的代码和说明不匹配。
isaacg 2015年

@isaacg现在已修复。
lirtosiast 2015年

5

杰普特30岁) 21 18字节

原来有一种更有效的方法。;)

Uà f_x ¥V} ml n- g

在线测试!(注意:出于兼容性原因n-已更改n@X-Y}为)

这会将输入作为空格或逗号分隔的数组,后跟一个数字。undefined没有解决方案的测试用例的输出。

Uà f_  x ¥ V} ®   l} n- g
UàfmZ{Zx ==V} mZ{Zl} n- g

            // Implicit: U = input array, V = input integer
Uà fZ{   }  // Generate all possible combinations of U, then filter to only items Z where
Zx ==V      //   the sum of Z is equal to V.
mZ{Zl}      // Map each remaining combination to its length.
n-          // Sort by subtraction; smaller items end up in the front.
g           // Take the first item.
            // Implicit: output last expression

我不敢相信我最初写这个版本时没有想到这个版本...

从那时起,已经进行了一些优化,在这里很方便:

  • 一种 U通常可以忽略程序开头的
  • Ã 是的快捷方式
  • n 现在默认情况下对数字进行正确排序。

这些每个取一个字节,总共15个:

à f_x ¥VÃml n g

在线测试!


这是25个字节,而不是21
阿尔伯特·伦肖

1
@AlbertRenshaw Japt支持IEC_8859-1编码,在这些编码下,每个字符均为1个字节。您可以将该程序另存为IEC_8859-1-编码的文本文件,然后将其上传到在线解释器中
ETHproductions 2015年

很好!谢谢你通知我
阿尔伯特·伦肖

1

Mathematica,73 65字节

Min[Length/@Select[IntegerPartitions[#2,#2,#],Sort@#==Union@#&]]&

纯函数,如果没有解决方案,则返回。


1

Python 3,128个字节

这并不像我希望的那样打高尔夫球,但我会在以后进行研究。

from itertools import*
def s(a,n):
 for i in range(len(a)):
  for j in permutations(a,i+1):
   if sum(j)==n:return i+1
 return 0

1

Mathematica,45个字节

Min@Cases[Subsets@#,i_/;Tr@i==12:>Length@#2]&

1

CJam,34个字节

0q~_,2,m*\f.*{:+1$=},\;0f-{,}$0=,+

在线尝试。输入格式是总和,后跟值列表,例如:

18102 [143 1623 1646 16336 1624 983 122]

请注意,如果找不到解决方案,这将引发异常。当从命令行运行CJam时,stderr例外,并且正确的结果(0)仍打印到stdout。因此,这符合在是否应允许提交错误退出?

该代码可能看起来比您期望的更长。主要原因是CJam没有内置生成组合的功能。或至少这是我的借口,我一直坚持下去。

说明:

0       Push 0 result for exception case.
q~      Get and interpret input.
_,      Copy and get length of input value list.
2,      Push [0 1].
m*      Cartesian power. This generates all possible lists of 0/1 values with the
        same length as the input value list.
\       Swap input value list to top.
f.*     Apply element-wise product of input value list with all 0/1 lists.
        We now have all combinations of values, with 0 in place of unused values.
{       Start filter block.
  :+      Sum values.
  1$      Copy target sum to top.
  =       Compare.
},      Filter.
\;      Swap target sum to top and discard.
0f-     Remove 0 values. We now have all solution lists.
{,}$    Sort by length.
0=      Get first solution, which after sorting is the shortest.
        This will raise an exception if the list of solutions is empty, bailing
        out with the initial 0 on the stack.
,       Get length of solution.
+       Add the 0 we initially pushed for the exception case.

1

JavaScript(ES6),84个字节

f=(a,n,m=1e999,x)=>n&&a.map((v,i)=>(x=[...a],x.splice(i,1),x=f(x,n-v)+1)<m?m=x:0)&&m

说明

取一个ArrayNumberS和Number作为参数。Infinity如果没有结果,则返回一个数字。它是一个递归函数,它n从数组中逐个减去并删除每个元素,直到n == 0

f=(a,n,m=1e999,x)=> // m and x are not passed, they are here to declare them in the local
                    //     scope instead of globally, initialise m to Infinity
  n&&               // if n == 0, return 0
  a.map((v,i)=>     // iterate over each number in a
    (x=[...a],      // x = copy of a
    x.splice(i,1),  // remove the added number from the array
    x=f(x,n-v)+1)   // x = result for the numbers in this array
      <m?m=x:0      // set m to minimum result
  )
  &&m               // return m

测试

此测试设置mInfinity更高版本,而不是默认参数,以使其在Chrome(而不只是Firefox)中运行。


1

Haskell,72个字节

import Data.List
n#l=head$sort[length x|x<-subsequences l,sum x==n]++[0]

0如果没有解决方案,则返回。

用法示例:10 # [1,5,7,3,7,3,6,3,2,6,3]-> 2

在输入列表l中找到总和为的所有子列表n。计算每个此类子列表的长度并进行排序。附加一个0并采用第一个元素。

如果允许输出一个单例列表,例如[2],我们可以节省7个字节: n#l=minimum[length x|x<-subsequences l,sum x==n]。如果没有解决方案,[]则返回空列表。

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.