1 ile 7 arasındaki rakamların toplamı


21

Meydan okuma

Pozitif bir tamsayı Verilen Netmek toplayarak numaraların çıkış listesi, yukarıda 28 veya No kullanımların her rakamı 1ile 7tam olarak bir kere. Bir program veya işlev olarak verebilirsiniz.

Her biri bir kez tekrar etmeden kullandığınız sürece, rakamlar kendi başlarına belirebilir veya birleştirilebilir. Örneğin, [12, 34, 56, 7]olduğu gibi [1, 27, 6, 4, 35]ve [1234, 567]ancak geçerlidir [123, 34567]veya[3, 2, 1476] . Sayıların listelenme sırası önemli değildir.

Eğer N 1-7 ile yapılamaz, iade veya çıkış şey.

Diğer bilgiler

  • Bu kod golf, bu yüzden 15 Ekim Perşembe gününe kadar bayttaki en kısa kod kazanıyor.

  • Yorumlarda herhangi bir soru sorun.

  • Mücadelede belirtmediğim her şey size kalmış.

  • Standart boşluklara izin verilmez.

Örnekler

Bunlar karışıklığı giderebilir:

Giriş

28

Çıktı

[1, 2, 3, 4, 5, 6, 7]

Giriş

100

Çıktı

[56, 7, 4, 31, 2]

Giriş

1234567

Çıktı

[1234567]

Giriş

29

Çıktı

Hiçbir şey, 29 geçersiz.

Giriş

1891

Çıktı

[1234, 657]

Giriş

370

Çıktı

[15, 342, 7, 6]

Gerekirse daha fazlasını yapacağım.

İşte FryAmTheEggman'ın izniyle, bu yedi sayı ile yaratılmış tüm olası sayıların bir pastebini.


Çıktı ne için 29?
Geobits

4
Çıktının bir hiç olmasını istiyorsanız, çıktı olarak koymayın (N/A).
mbomb007

1
@LukStorms [1234566, 1]geçerli bir çıktı değil, çünkü 6 tekrarlanıyor. Çıktıdaki sayıları tekrar edemezsiniz.
The_Basset_Hound

2
Belki de ... ... 1'den 7'ye kadar olan rakamlardan yapılan ve N «'e tekabül eden sayılardan oluşan bir liste, şu anda söz konusu olandan daha net bir ifadedir.
Paŭlo Ebermann

3
Biraz daha az kaba kuvvet çözümü için: Bu, her birine 10'luk bir güç katsayısı atamakla eşdeğerdir, 1, ..,, 7böylece en az 1's 10' kadar , en az 10's 100' s, vb.
xnor

Yanıtlar:


9

Pyth, 18 14 bayt

hfqSjkTjkS7./Q

2 baytlık golf oynadığı ve daha 2 yol açtığı için @isaacg'a teşekkürler.

Çıktı üretmemesi durumunda kodun çökmesine neden olur; bu, çıktının üretilmesine neden olmaz.

Bu, eğer yeterince sabırlı olursanız küçük girişler için ve yeterli zaman ve bellek verilirse daha büyük olanlar için işe yarar.

Amaçlandığı gibi kod, sen yerini alabilecek işleri doğrulamak için 7bir ile 3için 3'e kadar basamak 1 özetliyor . Burayı tıklayınTest paketi .

Örnek çalıştırmalar

$ time pyth/pyth.py -c 'hfqSjkTjkS7./Q' <<< 28
(1, 2, 3, 4, 5, 6, 7)

real    4m34.634s
user    4m34.751s
sys     0m0.101s
$ time pyth/pyth.py -c 'hfqSjkTjkS7./Q' <<< 29 2>/dev/null

real    9m5.819s
user    9m6.069s
sys     0m0.093s

Nasıl çalışır

           ./Q    Compute all integer partitions of the input.
 f                Filter the integer partitions:
    jkT             Join the integers with empty separator.
   S                Sort the characters of the resulting string.
      jkS7          Join [1, ..., 7] with empty separator.
  q                 Check both results for equality.
                  Keep the partition of `q' returned True.
h                 Retrieve the first element of the filtered list.
                  For a non-empty list, this retrieves the solution.
                  For the empty list, it causes an error and produces no output.

2
Aferin! Oldukça yenilikçi bir yaklaşım. `` MS7` `den daha kısa r\1\8. Ayrıca @ .. 0aynı h.
isaacg 09:15

@isaacg Teşekkürler! Nasıl özlediğimden emin değilim h, ama Sbu şekilde kullanabileceğinizi bilmiyordum . (Çevrimiçi tercümandaki char referansı bundan bahsetmiyor.) Artık jkS7daha fazla ihtiyacım olmadığından daha kısa görünüyor s.
Dennis,

5

Python 3, 109

def f(n,s=set('1234567'),l='0,'):[f(n,s-{x},l+x+c)for c in(',','')for x in s]or n-sum(eval(l))or~print(l[2:])

Sayı alan ve benzeri bir demet çıkaran bir işlev 123,4567, . Evet, bu geçerli bir demet.

Fikir gibi tüm olası dizeleri üretmektir 43,126,7,5,basamağa sahip olduğu 1aracılığıyla 7ardışık hiçbir iki virgül ile virgülle ayırarak. Bu ifadeyi bir tuple olarak değerlendirin ve toplamı eşittir n, yazdırır ve hatayla sonlandırır.

Bu tür tüm dizeleri oluşturmak siçin kullanılacak karakter dizisini izliyoruz ve her birini bir virgülle eklemeyi deniyoruz, bu sayede basamağı girdiyi sonlandıracak ya da olmasın, bu durumda gelecekteki basamaklar bir araya getirecek.

Kısa devre, slist-comp boş olduğu için boş olduğunu kontrol etmek için kullanılır ve bu n==sum(eval(l))durumda lbir hata ile yazdırıp sonlandırırız ~.None yazdırarak iade edildi (bunun için SP3000 sayesinde.).

Python s={*'1234567'}3.5'te iki karakterin yazarak kurtarılabileceğine inanıyorum (Sp3000 sayesinde).

Karakterleri yiyen bazı rahatsızlıklar var. Birincisi bu durumdal virgülsüz gibi görünmesi1234567 tek bir sayı olarak ayrıştırılması ve çağrının sumhata vermesidir. Bu, lelemana başlama 0ve baskı sırasında sıyırma kesmesiyle gerçekleştirilir. Bu 6 karaktere mal olur.

yineleme cVirgül ve boş dize sinir bozucu endişe verici for c in(',','')çünkü Python 3 bu başlığın çıplak olmasına izin vermiyor. ?Rakamlarla göz ardı edilen bazı karakterlerin ',?'4 karakterden daha az olması için çok isterdim ama böyle bir karakter yok gibi görünüyor.


Eski yöntem:

Python 2, 117

def f(n,s={1,2,3,4,5,6,7},l=[],p=0):
 if{n,p}|s=={0}:print l;1/0
 if p:f(n-p,s,l+[p])
 for x in s:f(n,s-{x},l,p*10+x)

Sayı alan ve bir liste basan bir işlev tanımlar.

Fikir her dalı denemek için özyinelemeyi kullanmaktır. Değişkenler iz

  • Kalan toplam n gerekli
  • Basamak kümesi s kalan
  • Liste lŞimdiye kadar yapılan numaraların
  • Geçerli kısmen oluşturulmuş sayı p

Ne zaman n==0ves boş, yazdırl yanılma yoluyla sona erdirebilir.

Geçerli kısmen oluşturulmuş sayı ise p sıfır listeye eklemeyi ve kalan toplamdan kaldırmayı deneyin.

xKullanabileceğimiz her basamak için s, onu eklemeyi pve çıkarmayı deneyin s.


4

Pyth, 23

#iRThfqQsiR10Ts./M.pS7q

Naif kaba kuvvet, çok yavaş çevrimiçi, bilgisayarımda yaklaşık bir dakika sürer. Sonuç olarak filtrelenmiş kombinasyon listesine erişmenin imkansız sayılar için bir hataya neden olduğu pyth golf modelini kullanır 29.

Pitonik liste gibi çıktılar, örneğin

1891
[1234, 657]
100
[1, 2, 34, 56, 7]
370
[12, 345, 6, 7]

İşte olan macun bu şekilde yapılabilir 10136 sayıların hepsinin.


Pastebin linkini örnek olarak kullanabilir miyim?
The_Basset_Hound

@The_Basset_Hound Elbette, devam et.
FryAmTheEggman

3

Python 2.7, 178 172 169 bayt

n=input()
for i in range(8**7):
 for j in len(set('%o0'%i))/8*range(128):
    s=''
    for c in'%o'%i:s+='+'[:j%2*len(s)]+c;j/=2
    if eval(s)==n:print map(int,s.split('+'));1/0

Son üç satırın sekmelerle girintili olması gerektiğini unutmayın, ancak bu düzenleyicide nasıl yapılacağını çözemiyorum.

Düzenleme: Sp3000 yardımı ile bir kat yuvalama düzleştirildi


SE ne yazık ki sekmeleri çıkardı, bu yüzden sadece girintili olmasının ne demek olduğunu söylemek gayet iyi :)
Sp3000

Ah tamam, hala bu site etrafında yolumu buluyorum.
xsot

3

JavaScript (ES6), 165 196

Düzenle Biraz Kısaltıldı. Kullanarak kısa olabilirdieval , ancak hızlı olmasını seviyorum

Utanç verici şekilde Pith versiyonundan daha uzun fakat daha hızlı olan kaba kuvvet. Aşağıdaki pasajı EcmaScript 6 uyumlu bir tarayıcıda çalıştırmayı test edin.

f=z=>{for(r=i=1e6;r&&++i<8e6;)for(m=/(.).*\1|[089]/.test(w=i+'')?0:64;r&&m--;t.split`+`.map(v=>r-=v,r=z))for(t=w[j=0],l=1;d=w[++j];l+=l)t+=l&m?'+'+d:d;return r?'':t}

function test() { O.innerHTML=f(+I.value) }

test()

// Less golfed

f=z=>{
  for(r=i=1e6; r&&++i<8e6;)
    for(m=/(.).*\1|[089]/.test(w=i+'')?0:64; r&&m--; t.split`+`.map(v=>r-=v,r=z))
      for(t=w[j=0],l=1;d=w[++j];l+=l)
        t+=l&m?'+'+d:d;
  return r?'':t
}
<input id=I value=28><button onclick=test()>-></button><span id=O></span>


Dil yüzünden daha uzun olması utanılacak bir şey değil, JS cevaplarınızdan gerçekten zevk alıyorum, +1
FryAmTheEggman

1

Python 2, 270 268 bayt

from itertools import*;P=permutations
x,d,f=range(1,8),[],input()
r=sum([[int(''.join(str(n)for n in i))for i in list(P(x,j))]for j in x],[])
z=1
while z:
 t=sum([[list(j)for j in P(r,z)]for i in x],[])
 v=filter(lambda i:sum(i)==f,t)
 if v:print v[0];break
 else:z+=1

Hala golf oynamaya çalışıyorum.

Bir eşleşme bulunana kadar bu döngüler.


import asnadiren gereklidir - yapabilirsinizfrom itertools import*;P=permutations
Sp3000

map(str,i)Listeyi anlamadan daha kısadır ve listeyi iç içe geçmiş bir listeyi düzleştirmek yerine doğrudan oluşturabilirsiniz:, r=[int(''.join(map(str,i)))for j in x for i in P(x,j)]ve t için benzer bir şey.
Ruth Franklin,

Bunun `n`yerine kullanabilirsiniz str(n), çünkü nhiçbir zaman maksimum tamsayının üstünde olmayacak.
mbomb007

1

Haskell (145 bayt)

main=getLine>>=print.head.f[1..7].read
f[]0=[[]]
f b s=[n:j|(n,g)<-m b,j<-f g$s-n]
m b=[(d+10*z,g)|d<-b,(z,g)<-(0,filter(/=d)b):m(filter(/=d)b)]

Özyineleme kullanır.

Ungolfed (337 bayt):

delete d = filter (/= d)
main = getLine >>= print . (`form` [1..7]) . read

form s [] | s == 0    = [[]]
form s ds | s <= 0    = []
form s ds | otherwise = [n:ns | (n, ds') <- makeNumbers ds, ns <- form (s-n) ds']

makeNumbers [] = []
makeNumbers ds  = [(d + 10 * n',ds') | d <- ds, (n',ds') <- (0,delete d ds):makeNumbers (delete d ds)]

0

Scala, 195 bayt

Bu en verimli değil ve 29 un üzerinde çıktı almak 15 dakikadan fazla sürdü ama işe yarıyor

def g(s: Seq[Int]): Iterator[Seq[Int]]=s.combinations(2).map(c=>g(c.mkString.toInt +: s.filterNot(c.contains))).flatten ++ Seq(s)
def f(i: Int)=(1 to 7).permutations.map(g).flatten.find(_.sum==i)

İşte bazı çıktı

scala> f(100)
res2: Option[Seq[Int]] = Some(Vector(46, 35, 12, 7))

scala> f(1891)
res3: Option[Seq[Int]] = Some(Vector(567, 1324))

scala> f(370)
res4: Option[Seq[Int]] = Some(Vector(345, 12, 6, 7))

scala> f(29)
res5: Option[Seq[Int]] = None

0

Yakut, 105 bayt

Kaba kuvvet! 1 ila 7654321 arasındaki tamsayıların 0 ila 7'si arasındaki uzunlukların her alt kümesini kontrol eder ve bunlardan herhangi birinin kriterlerimize uyup uymadığını görür. Muhtemelen bunun sona ermesini beklemek istemezsiniz.

->n{8.times{|i|[*1..7654321].permutation(i){|x|return x if
x.join.chars.sort==[*?1..?7]&&eval(x*?+)==n}}}

Algoritmayı çalıştırmak ve doğrulamak için 7654321, cevapta olacağını bildiğiniz en büyük sayı ile değiştirerek arama alanını daraltabilirsiniz . Örneğin, n = 100 için 56 veya n = 1891 için 1234. İşte ikincisinin deneme sürümü:

$ ruby -e "p ->n{8.times{|i|[*1..1234].permutation(i){|x|return x if x.join.chars.sort==[*?1..?7]&&eval(x*?+)==n}}}[gets.to_i]" <<< 1891
[657, 1234]

0 - 7 arası tamsayılar? Tam 7 tamsayı kullanmalısınız: 1,2,3,4,5,6,7
edc65

@ edc65 Tam olarak 7 rakam demek istiyorsun . Sonuç, bir tam sayı kümesidir ve kümenin boyutu girişe bağlıdır.
daniero

Ruby'yi konuşmuyorum, programın çalıştığını sanıyorum ama açıklamıyorum. Eğer tamsayılarınız 1234567'den az ise 7654321'i nasıl elde edersiniz?
edc65

@ edc65 Haklısın, bu numarayı değiştirmem gerekecek. Bunu daha iyi açıklamaya çalışacağım.
daniero,
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.