+ Ve * tuşlarını kullanarak numara almak için numara sayısını bulun


28

Giriş

Amacınız, giriş değerini almak için eklemeniz veya çoğaltmanız gereken en az sayıyı bulmaktır, bu A005245 .

Giriş

Bir pozitif bir tam sayı , N .

Çıktı

N elde etmek için eklenmesi / çarpılması gereken en az sayıda .

Örnek giriş

7

Örnek çıktı

6

açıklama

( 1+ 1+ 1) * ( 1+ 1) + 1= 7

Bu 6olanlar gerektirdiğinden , çıktı6

Test durumları

 1  1
 2  2
 3  3
 5  5
10  7
20  9
50 12

Bu bir mücadelesi olduğundan, en düşük bayt sayısı kazanır.



9
Programlama Bulmacaları ve Code Golf'a Hoş Geldiniz! İlk zorluk olarak bu sorun değil, ancak bir dahaki sefere lütfen zorlukları göndermeden önce Sandbox'ı kullanın, böylece geri bildirim alabilirsiniz!
Ocak'ta 18:18

4
Bunu , gerekli olan asgari sayıyı aradığınızı açıkça belirtecek şekilde değiştirmenizi öneririm . Aksi takdirde, orijinal numarayı basitçe basmak ve bir araya eklemeniz gereken numaraların bu olduğunu iddia etmek geçerli bir çözüm olacaktır.
Shaggy

2
f(x) != x.primeFactorisation().sum()1 haricinde örnekler var mı?
jrtapsell

1
jrtapsell: evet. Verilen $ f (7) = 6 $ örneği bir tanesidir. Herhangi bir (yeterince büyük) için $ p $ üssü $ p-1 $ faktörü alabilir ve bir tane ekleyebilirsiniz. Henüz daha iyisini yapabilirsin.
Ross Millikan,

Yanıtlar:


17

Python 2 , 74 70 bayt

f=lambda n:min([n]+[f(j)+min(n%j*n+f(n/j),f(n-j))for j in range(2,n)])

Çevrimiçi deneyin!

Alternatif sürüm, 59 bayt (doğrulanmamış)

f=lambda n:min([n]+[f(j)+f(n/j)+f(n%j)for j in range(2,n)])

Bu en azından n = 1.000.000'e kadar çalışıyor , ancak henüz tüm olumlu n'lerde işe yaradığını ispatlamamıştım .

Çevrimiçi deneyin!


Maalesef basit bir şeyi özlüyorum, ancak bunun uygulanabilir her ifade ağacını denediği açık değil. Özellikle, dış katmanımız n=a*j+bvar b<j, ancak ihtiyacımız olabilir b>=jmi?
Xnor

Hm, yalnızca her iki takdirde başarısız olur b>=jve b>=a. Ama haklısın, bunun gerçekleşmeyeceği belli değil.
Dennis,

1.000.000'a kadar karşı örnek olmaması ilginç, aslında sadece her zaman işe yarayıp yaramadığını merak ediyorum. Bir karşı örnek için en iyi düşüncem a*b+c*d, a,b,c,dtüm toplama ifadeleriyle formlu bir şey olurdu ve çok verimlidir.
xnor

10

Jöle , 16 14 bayt

2 bayt kaydettiğiniz için teşekkürler Dennis!

ÆḌḊ,Ṗ߀€+U$FṂo

Çevrimiçi deneyin!


Mantık açıklaması

Bir numara Verilen n :

  • Eğer öyleyse 1, cevap 1. Aksi takdirde:

Temsilidir ya olduğu a + bveya a × bnerede ave bifadelerdir.

Tüm olası değerleri göz önünde bulundurun ave b:

  • Eğer temsil a + b, öyleyse ave bmenzilde [1 .. n-1].
  • Temsili ise a × b, ave daha büyük olan buygun bölenler nise 1.

Her iki durumda da liste [[<proper divisors of n larger than 1>], [1, 2, ..., n-1]]hesaplanır ( ÆḌḊ,Ṗ), mevcut bağlantıyı her numara üzerinde ߀€eşleştirin, doğru çiftleri bir araya getirin ( +U$) ve minimum değeri ( FṂo) alın.

Kod açıklaması

ÆḌḊ,Ṗ߀€+U$FṂo   Main link. Assume n = 10.
ÆḌ       Proper divisors. [1,2,5]equeue, remove the first element. [2,5]
   ,Ṗ    Pair with op. Auto convert n = 10 to range 
         [1,2,3,4,5,6,7,8,9,10] and remove the last element
         10, get [1,2,3,4,5,6,7,8,9].

߀€      Apply this link over each element.
   +U$   Add with the Upend of itself.

FṂ       Flatten and get the inimum element.
  o      Logical or with n.
         If the list is empty, minimum returns 0 (falsy), so logical or
         convert it to n.

5

JavaScript (ES6), 108 96 bayt

f=n=>n<6?n:Math.min(...[...Array(n-2)].map((_,i)=>Math.min(f(++i)+f(n-i),n%++i/0||f(i)+f(n/i))))

Çok verimsiz; Array(n>>1)Bir bayt pahasına hafifçe hızlandırır. Açıklama: n%++ieğer sıfırdan farklıdır ibir faktör değildir, bu yüzden n%++i/0olduğu Infinitytakdirde (ve dolayısıyla truthy ve aynı zamanda kesinlikle asgari değil) ibir faktör değildir, ancak NaN(ve bu nedenle falsy) eğer ibir faktördür. Düzenleme: @ edc65 ilham ile 12 bayt kaydedildi.


Bunu hesaplamayı gerçekten yapıp f(50)yapamayacağını görmek için arka planda çalıştırmayı denedim, ancak ne yazık ki Windows Update bilgisayarımı yeniden başlatmadan önce yeniden başlattı.
Neil

Dizi üzerinde tek bir yürüyüş denediniz mi?
edc65

@ edc65 Üzgünüm, ama ne önerdiğin ve neden olduğu konusunda net değilim.
Neil

Her biri adiziyi tarayan 2 harita görüyorum . 2 lambdadaki değerlendirmeleri birleştirip, min. Alamaz mısın?
edc65

@ edc65 Ah evet, bir nedenden dolayı Min'i yerleştirmenin daha ucuz olmayacağını düşünmüştüm ama bir başkasıyla değiştirebileceğim (i+=2)için ++itoplamda 12 byte tasarruf ediyorum, teşekkürler!
Neil



3

Python 2,181 bayt

def F(N,n,s="",r=""):
 try:
	if n<1:return(eval(s)==N)*0**(`11`in s or"**"in s)*s
	for c in"()+*1":r=F(N,~-n,s+c)or r
 except:r
 return r
f=lambda N,n=1:F(N,n).count(`1`)or f(N,-~n)

Çevrimiçi deneyin!


@ pizzapants184 Ana işlev f, özyinelemeli olarak çağırdığı için adsız olmamalıdır.
Jonathan Frech,

Ah, üzgünüm, bunu görmedim.
pizzapants184


1

Perl 5 , -p 78 bayt

Eski stilde 79 bayt sayıyor ( +1için -p)

Perl'nin $tüm skaler erişim için fazladan kullanması gerektiği, çok fazla aritmetik iş yapan golfün uzunluğunu gerçekten etkiliyor ...

Bu yöntem daha önce yayınlanmış diğerlerine benzer (çarpmayı ve bir hedef numarası oluşturmak için eklemeyi deneyin, en ucuzunu alın). Bununla birlikte, tekrar tekrar aşağı çekilmez, bu nedenle nispeten büyük girişler için kullanılabilir.

Ayrıca, ekleme veya çarpma yoluyla bir sayı oluşturma maliyetini en aza indirmeye çalışmaz çünkü perl 5 yerleşik değildir minve sayısal sıralama looooooong'dur (hala koddaki sıralamadan görüldüğü gibi). Bunun yerine, bir sayının çarpma kullanacağım hedefin bir faktörü olup olmadığını kabul ediyorum. Bu güvenlidir, çünkü örneğin 3bir faktör ise 12(yani maliyetini toplar 3ve 12/3) döngü içinde daha sonra 9=12-3bir faktör olmayacağını düşünecektir , bu yüzden 9+3yine de denenecek maliyetle aynı 3+9olacaktır. Ancak bu hedefler için başarısız olabilir <= 4(sadece 1ve için yapar 2). $_Düzeltmeleri en aza indirmek için listeye eklemek . Asıl durum bu çünkü temel davalar için buna ihtiyacım yok çünkü zaten başlatıyorum@; uygun başlangıç ​​değerleri ile 3 bayta mal olur.

#!/usr/bin/perl -p
($_)=sort{$a-$b}$_,map{$;[$_]+$;[$'%$_?$'-$_:$'/$_]}//..$_ for@;=0..$_;$_=pop@

Çevrimiçi deneyin!

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.