正確にnになる合計数の最小数


15

ここでの最初の質問は、これが重複するのか悪い挑戦なのかを私に怒鳴らないでください。

前書き

私はこの挑戦を自分で考えましたが、初心者のコード愛好家には良い基本的なパズルのようです。また、学習するコードゴルフ言語を決定するのに役立つかもしれません。

チャレンジ

以下の整数の配列が与えられた場合、n正確に合計する配列からの最小数の数値を出力または返しnます。

関数を書くか、完全なプログラムを書くかを選択できます。

入力

あなたは安全に仮定することができ0 <= n < 2^31ます。

任意の種類の配列またはリスト(vectorC ++または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

合計する最小数1027および3)であるためです。

解決策がない場合は、空の文字列を除き、負の値、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メソッドを許可するため、仕様を編集しました。ここでコンセンサスを見てください。同意しない場合は、気軽にロールバックしてください。
リルトシアスト

false解決策がないケースについて出力できますか?
ETHproductions

@ETHproductions確かに、それを追加します。
TheCoffeeCup

空の文字列はPythではfalseyであるため、空の出力をfalseyとみなしますか?
リルトシアスト

@ThomasKwa私は、空の文字列を出力好きではないが、あなたは、「xが許可された場合は...」などというあなたの答えに...含めることができます
TheCoffeeCup

回答:


7

Pyth、12 11バイト

lhafqsTQyEY

これはn、入力の1行目と2行目のリストとして使用されます。

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

@isaacg修正されました。
リルトシアスト

5

Japt30 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通常、プログラムの最初のA は省略できます。
  • Ãはのショートカットです
  • n デフォルトで数値を適切にソートするようになりました。

これらはそれぞれ1バイトずつ、合計15個を取り出します。

à f_x ¥VÃml n g

オンラインでテストしてください!


これは25のバイトではなく21だ
アルバート・レンショウ

1
@AlbertRenshaw Japtは、これらの各文字が1バイトであるIEC_8859-1エンコーディングをサポートしています。このプログラムをIEC_8859-1でエンコードされたテキストファイルとして保存し、オンラインインタープリターにアップロードできます。
ETHproductions

あ、いいね!お知らせいただきありがとうございます
アルバートレンショー

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

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とAをNumber引数として。Infinity結果がない場合の数を返します。これはn、配列から各要素を1つずつ減算し、削除する再帰関数です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、後の代わりに、それは(だけでなくFirefoxのの)Chromeで動作させるために、デフォルト引数として。


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]。解決策がない場合、空のリスト[]が返されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.