Kendi kendine toplanan sayılar


12

Bir sayıyı toplam basamağa dönüştürme

Herhangi bir toplam değil: en kısa miktara ihtiyacımız var
Herhangi bir rakam değil: sadece rakamın rakamlarını kullanabilirsiniz

Örnek
Sizebir tamsayı girişi verilecektirn>0

Diyelim n=27. Mümkün olan en kısa şekilde , yalnızca rakamları kullanarak 27bir toplam olarak ifade etmeniz gerekir . Verilen sayının tüm rakamlarını kullanmak zorunda değilsiniz! [2,7]

Yani 27=2+2+2+7+7+7. Daha sonra bu rakamları alıp bunları saymak : [2,2,2,7,7,7].
Kesin cevap n=27DİR6

Bir daha için örnek n=195almak için en kısa toplamı aşağıdaki basamakları kullanmak zorunda:
[5,5,5,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9]ve cevap olduğunu23

Meydan okuma

Bir tamsayıdır verilen n>0çıkış minimum basamak sayısı (kısmında yer almaktadır) olup bu numaraya Özetle

Test Durumları

Input->Output

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

Bu . Bayt en kısa cevap kazanır!


Kendilerini toplayamayan rakamlar var mı / girilecek mi?
Stephen

1
@Stephen Hepsi yapabilir!

7
@Stephen Çünkü her sayı d_0 + 10 * d_1 + 100 * d_2, vb. Olarak ifade edilebilir ...
geokavel

Girişi dize, karakter dizisi veya tamsayı dizisi olarak alabilir miyiz?
Kevin Cruijssen

1
@KevinCruijssen Dize tamam. char-array veya integer-array değildir.

Yanıtlar:


4

Kabuk , 12 bayt

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

İki basamaklı sayıları oldukça hızlı işler. Çevrimiçi deneyin!

açıklama

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 bayt

lef!-TsM`Q./

Çevrimiçi deneyin!

Ne yazık ki bu kadar büyük girişlerde bellek hataları 58.

açıklama

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

açıklama eklemek ister misiniz?
Jonah

@Jonah Açıklama eklendi.
notjagan

1
Teşekkürler. Pyth'in sorunu çözen bir ilkeli olması ilginç./
Jonah

12 bayt alternatifi: lef<.{TjQ;./(filtre - uygun alt küme - girişin rakamları)
Bay Xcoder

2

Mathematica, 78 bayt

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

son test vakasını 5 saniyede bulur


Biraz daha kısa:Length@IntegerPartitions[#, All, Sort@DeleteCases[0]@IntegerDigits@#, 1][[1]] &
Kuba

2

R , 78 bayt

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

Çevrimiçi deneyin! (golf edilmiş sürüm)

Saf kaba kuvvet algoritması, bu yüzden tüm test senaryolarını çözmez ve son test davası için 40.000 GB ayırmaya çalıştığını düşünüyorum ...

TR varsayılan olarak ayarlanmıştır, 1bu nedenle dönüş adımında düzelttiğimiz tek tek bir hata alırız, ancak Fhangi varsayılanların işe yaradığını da alırız 0.

ungolfed açıklama:

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

Çevrimiçi deneyin! (daha az golf versiyonu)


2

Python 2, 168 155 144 bayt

O değil kısa olması gerektiği, ancak en iyi-ilk olduğunu ve değil gerçek çalışma zamanı akıllıca, feci.

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...Bunu yaparken yapabileceğim öğrenilen bir rakam olarak 0 kaldırmaktır.

En büyük sorun, bunu en büyük girdiler üzerinde çalıştırmama izin vermeyen python yığın kareleridir. Yani, geçerli bir çözüm değil, gerçekten, sadece seg-hatalarına neden olan özyineleme sınırını arttırmakla oynadım. Bu ya bir döngü ve bir yığınla ya da python'da çalışmak için çok daha akıllıca yapılmalıdır.

edit: 13 bayt için caird ve Chas Brown teşekkürler!


Sen kullanabilirsiniz inputve tırnak çevrili olduğu giriş yapılmalıdır.
caird coinheringaahing

2
Teoride başarılı olduğu sürece, fiziksel sınırlamalar nedeniyle başarısız olmak tamamen kabul edilebilir.
Jonathan Allan

Değiştirerek 9 bayt kaydet filter(None,sorted(map(int,set(n)))[::-1])ile sorted(set(map(int,n))-{0})[::-1](her ne kadar Noneşey hakkında bilmek oldukça güzel).
Chas Brown

@ChasBrown Çoğu durumda filter(len,...)listeler ve dizeler ile filter(abs,...)tamsayılar ve kayan noktalar için kullanabilirsiniz.
ovs


0

JavaScript (ES6), 82 bayt

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>

Girişi dize olarak alır.


Neden kullandığınızı açıklayabilir misiniz 1/0?
Zacharý

1
@ Zacharý En kısa rakamı yani minimum basamak sayısını istiyorum. Geçersiz bir çözüme yol açan girişimler sayılmamalıdır, bu yüzden onları hariç tutmak için, minimum puanı etkilemeyen Sonsuzluk puanı alırlar.
Neil

Oh, özyinelemenin farkında değildi.
Zacharý

@ Zacharý f=Başlangıçta büyük bir ipucu, çünkü tekrarlayıcı olmayan lambdalar için buna ihtiyacınız yok.
Neil

0

Yakut , 70 bayt

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

Çok yavaş, bir çözüme ulaşana kadar boyutu artıran tüm olası kombinasyonları deneyin.

TIO'da Ruby 2.4 için teşekkürler Dennis.

Çevrimiçi deneyin!


0

Jöle , 23 bayt

D;0ṗµḟ€0
ÇS€=µT
Çị1ĿL€Ṃ

Çevrimiçi deneyin!

Bu o kadar verimsiz ki, bir zaman sınırı nedeniyle TIO'da üçüncü testten sonra test senaryoları için çalışmaz> _ <

Herhangi bir golf ipuçları bekliyoruz!


0

Piton 2 , 183 176 172 166 161 bayt

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]

Çevrimiçi deneyin!

Diğer Python cevabından daha uzun, ancak tüm test 987654321senaryolarını artı TIO'da bir saniyeden kısa sürede gerçekleştiriyor .

d1<d2Rakamlar varsa d2-1 d1, toplamda en fazla olması gerektiği gerçeğinden yararlanır (çünkü d2örnekleri daha kısa bir miktar için örneklerle d1değiştirilebilir ). Böylece, basamakları artan düzende sıralarken, dikkate alınması gereken en fazla toplam sadece "vardır" ; ve maksimum özyineleme derinliği (değerine bakılmaksızın ).d1d29! = 3628809n


0

Haskell , 91 bayt

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]

Çevrimiçi deneyin! Örnek kullanım: f 58verim 8. İki basamaklı sayılar için hızlı, daha büyük girişler için korkunç derecede yavaş.

İşlev f, nsıfırları filtrelerken giriş numarasını bir basamak listesine dönüştürür . Daha sonra bu liste ve nkendisi (#)tek bir liste döndüren işleve teslim edilir . !!0bu tekil listenin elemanını döndürür.

(#)seçenek türü olarak singleton ve boş listeler kullanır. n=58Ve s=[5,8]öğesinin bir girdisi göz önüne alındığında , fikir tüm rakamları sburadan çıkarmak n, daha sonra tekrarlayan bir şekilde uygulamak (#)ve hangi basamağın minimum adım sayısıyla sonuçlandığını kontrol etmek ve sonuç olarak bir artı bu minimum değeri döndürmek. İlk bölüm (s#).(n-)=<<s, ile aynı olan hesaplanır concat(map(s#)(map(n-)s)). Yani bizim örneğimizde ilk önce [58-5,58-8]hesaplanır, ardından [[5,8]#53,[5,8]#50]hangi sonuçlarda [[7],[7]]veya [7,7]sonrasında sonuç alınır concat. x:mListede en az bir öğe ( minimumaksi halde başarısız) olduğundan emin olmak için sonuç desenle eşleştirilir , ardından 1 tekli liste artı sonucun minimum değeri yeniden ayarlanır. Eğernsıfırdan küçükse veya yinelemeli çağrı boş bir liste döndürdü, aramanın başarısız bir dalındayız ve boş bir liste döndürüldü. n==0Şube başarılı olmuş ve [0]iade edilmişse .


Haskell , 101 bayt

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]

Çevrimiçi deneyin! Çok daha verimli bir yaklaşım, tüm test senaryolarını bir saniyenin altında kontrol eder.

Bu kez, girişin basamak listesinin azalan sırada olduğu hesaplanır, bu da mümkün (#)olan en büyük rakamı, daha sonra ikinci en büyük rakamı ve böylece bir çözüm bulunana kadar kullanmaya izin verir . Bu şekilde bulunan ilk çözümün en küçük çözüm olduğu da garanti edilmektedir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.