自己合計数


12

数字を数字の合計に変換する

ない任意の合計:私たちが必要とする最短の和を
任意の数字ではない:あなただけ使用することができます番号の桁数を

入力として整数
が与えられますn>0

言ってみようn=27。可能な限り短い方法で、数字のみを使用27してsumとして表現する必要があります。指定された番号のすべての数字を使用する必要はありません! [2,7]

だから27=2+2+2+7+7+7。それからそれらの数字を数えて数えます[2,2,2,7,7,7]
の最終回答n=276

以下のためのもう一つの例n=195得るために最短合計私たちは、次の数字を使用する必要があります
[5,5,5,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9]答えがあります23

チャレンジ

整数与えられn>0、出力の最小桁数(番号に含まれる)は、この数まで和

テストケース

Input->Output

1->1  
2->1  
10->10  
58->8  
874->110  
1259->142  
12347->1765  
123456->20576  
3456789->384088  

これはです。バイト単位の最短回答が勝ちです!


合計できない数値がありますか/入力されますか?
スティーブン

1
@スティーブン彼らはすべてできます!

7
@Stephenすべての数字はd_0 + 10 * d_1 + 100 * d_2などと表現できるため
...-geokavel

入力を文字列、文字配列、整数配列として取ることができますか?
ケビンCruijssen

1
@KevinCruijssen文字列は大丈夫です。char-arrayまたはinteger-arrayはそうではありません。

回答:


4

、12バイト

Lḟo=⁰ΣṁΠḣ∞d⁰

2桁の数字を非常に高速に処理します。 オンラインでお試しください!

説明

Lḟo=⁰ΣṁΠḣ∞d⁰  Input is n, say n = 13.
          d⁰  Digits of n: [1,3]
         ∞    Repeat infinitely: [[1,3],[1,3],[1,3],[1,3]...
        ḣ     Prefixes: [[],[[1,3]],[[1,3],[1,3]],[[1,3],[1,3],[1,3]],...
      ṁ       Map and concatenate
       Π      Cartesian product: [[],[1],[3],[1,1],[3,1],[1,3],[3,3],[1,1,1],[3,1,1],...
 ḟo           Find the first element
     Σ        whose sum
   =⁰         equals n: [3,3,3,3,1]
L             Return its length: 5

2

Pyth、12バイト

lef!-TsM`Q./

オンラインでお試しください!

残念ながら、最大の入力でメモリエラーが発生し58ます。

説明

lef!-TsM`Q./
          ./    All lists of integers that sum to [the input]
  f             Filter for:
    -TsM`Q           Remove all occurrences of the digits in the input
   !                 Check if falsey (i.e. an empty list)
le              Length of the last occurrence, which is the shortest because all the
                filtered partitions share the same digit pool

説明を追加してもいいですか?
ジョナ

@ジョナの説明が追加されました。
-notjagan

1
ありがとう。興味深いことに、Pythには基本的に問題を解決するプリミティブがあります./
ジョナ

12バイトの代替:lef<.{TjQ;./(フィルタ-適切なサブセット-入力の桁)
氏Xcoder

2

Mathematica、78バイト

(t=1;While[(s=IntegerPartitions[x=#,t,IntegerDigits@x])=={},t++];Tr[1^#&@@s])&  

5秒で最後のテストケースを見つける


少し短い:Length@IntegerPartitions[#, All, Sort@DeleteCases[0]@IntegerDigits@#, 1][[1]] &
クバ

2

R、78バイト

function(n){while(all(F-n)){F=outer(F,n%/%10^(0:nchar(n))%%10,"+")
T=T+1}
T-1}

オンラインでお試しください!(ゴルフバージョン)

純粋なブルートフォースアルゴリズムなので、実際にはすべてのテストケースを解決するわけではなく、最後のテストケースに40,000 GBを割り当てようとしたと思います...

TRではデフォルトである1ため、戻りステップで修正するオフバイワンエラーが発生しますが、Fどのデフォルトに0どのデフォルトが返されるかも取得します。

説明されていない説明:

function(n){
 d <- n%/%10^(0:nchar(n))%%10   # digit list with a 0 appended at end
 d <- unique(d[d>0])            # filter zeros (not technically necessary)
                                # and get unique digits
 x <- 0                         # storage for sums
 i <- 0                         # counter for number of sums done
 while(!any(x==n)){             # until we find a combination
  x <- outer(x,d,"+")           # take all sums of x and d, store as x
  i <- i + 1}                   # increment counter
i}                              # return counter

オンラインでお試しください!(より少ないゴルフバージョン)


2

パイソン2、168の 155 144バイト

これは最短時間ではありませんが、ベストなものであり、実際には悪いことではありません。

n=input()
g=sorted(set(n)-{0})[::-1]
def h(k):
 if k<0:return
 if`k`in g:return 1
 for d in g:
  f=h(k-int(d))
  if f:return 1+f
print h(int(n)) 

これfilter(None...は、数字として0を削除することです。これは、これを行うときにできることを学びました。

最大の問題は、Pythonスタックフレームです。現実的には、これを最大の入力で実行することはできません。したがって、これは有効な解決策ではありません。実際、セグメンテーション違反につながった再帰制限を増やすことで遊んでみました。これは、ループとスタックを使用するか、Pythonで動作するためにもっと賢く行う必要があります。

編集:13バイトのcairdとChas Brownに感謝します!


あなたは使用することができますinputし、引用符で囲まれての入力が必要です。
ケアニコインヘリンガー

2
理論的に成功する限り、物理的な制限のために失敗することは完全に受け入れられますが、これはそうです。
ジョナサンアラン

に置き換えることfilter(None,sorted(map(int,set(n)))[::-1])で9バイト節約できますsorted(set(map(int,n))-{0})[::-1](ただし、None知っておくと便利です)。
チャスブラウン

@ChasBrownほとんどの場合filter(len,...)、リストと文字列、およびfilter(abs,...)整数と浮動小数点に使用できます。
ovs


0

JavaScript(ES6)、82バイト

f=(n,l=0,a=n,[c,...b]=a)=>n?1/c?Math.min(!+c|+c>n?1/0:f(n-c,l+1,a),f(n,l,b)):1/0:l
<input type=number oninput=o.textContent=f(this.value)><pre id=o>

入力を文字列として受け取ります。


なぜ使用しているの1/0か説明できますか?
ザカリー

1
@Zacharý最短の合計、つまり最小桁数が必要です。無効なソリューションにつながる試行はカウントしてはならないため、それらを除外するには、Infinityをスコアリングしますが、これは最小に影響しません。
ニール

ああ、それが再帰的だとは知らなかった。
ザカリー

@Zacharý f=最初は、非再帰的なラムダには必要ないため、大きな手がかりです。
ニール

0

ルビー、70バイト

->n{w,s=n.digits,0;s+=1while !w.product(*[w]*s).find{|x|x.sum==n};s+1}

非常に遅いので、解決策が見つかるまでサイズを増やして、可能なすべての組み合わせを試してください。

TIOのRuby 2.4をデニスに感謝します。

オンラインでお試しください!



0

パイソン2183の 176 172 166 161バイト

def f(n,D=0,p=0,b=0):
	D=D or set(map(int,`n`))-{0}
	d=min(D);c=0;D=D-{d}
	q=[p+n/d,b][n%d>0]
	while c<min(D or{0}):q=b=f(n-c*d,D,p+c,b);c+=1
	return[q,b][q>b>0]

オンラインでお試しください!

他のPythonの回答よりも長いですが、すべてのテストケースを組み合わせて実行し987654321、TIOで1秒未満で実行します。

d1<d2数字である場合、多くても必要であるという事実を利用しますd2-1 d1、合計にd2ます(のインスタンスはより短い合計のインスタンスにd1置き換えることができるため)。したがって、数字を昇順で並べ替えると、考えられる最大の合計は「のみ」です。最大再帰深度(の値に関係なく)。d1d29! = 3628809n


0

Haskell、91バイト

f n=[read[c]|c<-show n,c>'0']#n!!0
s#n|n>0,x:m<-(s#).(n-)=<<s=[1+minimum(x:m)]|1<3=[0|n==0]

オンラインでお試しください!使用例:f 58yields 8。2桁の数字の場合は速く、大きな入力の場合は恐ろしく遅くなります。

この関数fは、nゼロを除外しながら、入力番号を数字のリストに変換します。次に、このリストとnそれ自体が(#)関数に渡され、関数はシングルトンリストを返します。!!0このシングルトンリストの要素を返します。

(#)オプションタイプとしてシングルトンリストと空のリストを使用します。との入力が与えられるn=58s=[5,8]、アイデアはsfromからすべての数字を減算しn、再帰的に適用して(#)、どの数字が最小ステップ数になったかを確認し、結果に1プラスこの最小を返します。最初の部分はによって計算さ(s#).(n-)=<<sconcat(map(s#)(map(n-)s))ます。これはと同じです。したがって、この例で[58-5,58-8]は、最初に計算され、続いて[[5,8]#53,[5,8]#50]が結果として[[7],[7]]または[7,7]後になりconcatます。結果はパターンで照合され、x:mリストに少なくとも1つの要素が含まれていることを確認し(minimumそうでない場合は失敗します)、1の結果と最小値のシングルトンリストが再調整されます。もしnゼロより小さいか、再帰呼び出しが空のリストを返した場合、検索の失敗ブランチにあり、空のリストが返されます。場合n==0の分岐が成功したと[0]返されます。


Haskell、101バイト

f n=[d|d<-[9,8..1],show d!!0`elem`show n]#n!!0
s@(d:r)#n|n>=d,[x]<-s#(n-d)=[x+1]|1<3=r#n
s#n=[0|n==0]

オンラインでお試しください!より効率的な方法で、すべてのテストケースを1秒未満でチェックします。

今回は、入力の数字のリストが降順で計算されます。これにより(#)、可能な限り最大の数字を使用し、次に2番目に大きい数字を使用して、解が見つかるまで試行することができます。この方法で最初に見つかったソリューションは、最小のものであることが保証されています。

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