Bölümlenmiş sayılar


15

Bölümlenmiş sayıların dizisi veya asal ölçüm sayıları ( OEIS A002048 ), her bir elemanın, birbirini izleyen önceki sayıların toplamından yapılamayan en küçük pozitif (sıfırdan büyük) sayı olacağı şekilde sayı dizisidir a(0) = 1.

Misal

Hesaplamak a(7)için önce hesaplıyoruz a(0->6) = [1, 2, 4, 5, 8, 10, 14]. sonra sıfırdan başlarız ve dizideki bir veya daha fazla ardışık sayının toplamı olmayan bir tane bulana kadar sayılardan geçeriz.

1  = 1
2  = 2
3  = 1 + 2
4  = 4
5  = 5
6  = 2 + 4
7  = 1 + 2 + 4
8  = 8
9  = 4 + 5
10 = 10
11 = 2 + 4 + 5
12 = 1 + 2 + 4 + 5
13 = 5 + 8
14 = 14
15 = ????

On beş ardışık alt dizinin toplanmasıyla yapılamayacağından ve daha küçük olan her sayı on beş olabilir. a(7) = 15

Görev

Göreviniz bir sayı almak (standart yöntemlerle) ve n. Terimi bu sırayla (standart çıktı yöntemleriyle) çıkarmaktır. Bu kod golf ve bu şekilde puanlanacak.

Test Durumları

0 -> 1
1 -> 2
2 -> 4
3 -> 5
4 -> 8
5 -> 10
6 -> 14
7 -> 15
8 -> 16
9 -> 21

Yanıtlar:


12

Haskell, 62 58 bayt

@Xnor sayesinde -4 bayt!

(x:y)#z=x:filter(`notElem`scanl(+)x z)y#(x:z)
([1..]#[]!!)

Sıra 0 ile endekslenir.


1
Bence iki bayta daha ihtiyacınız var ve ()doğru bir işlev haline getirmek için son satırı çevreliyorsunuz . Uygulanan kısmi !!bir operatör bölümüdür ve ()bir işlev yapabilmesi için içine alınması gerekir . Bu sadece eksik parçacığı olan bir işlev (veya katı Haskell terimlerini kullanmak için "değer") haline gelen bir parçacık olmadan.
nimi

1
Güzel yöntem! Ancak ithalat aşırıya kaçmış gibi görünüyor; filter(`notElem`scanl(+)x z)yyapmak gerekir.
xnor

7

Perl, 50 49 bayt

İçin +1 içerir -p

STDIN üzerinde giriş ile çalıştırın:

segmented.pl <<< 7

segmented.pl:

#!/usr/bin/perl -p
${$_-=$\}++for@F;1while${-++$\};++$#F<$_&&redo}{

açıklama

@Fgeçerli son sayıyla biten ardışık sayıların (negatif) toplamlarının listesini içerir. Yeni bir numara bulunduğunda liste 0 ile genişletilir ve ardından tüm değerler değişmezi koruyan yeni sayı ile azaltılır.

Global %::, ( @Fsıfırdan) görülen tüm (negatif) sayıları sıfırdan farklı bir değere eşleyen bir karma olarak kullanılır .

$\geçerli sayıdır ve henüz girilmemiş bir değere ulaşana kadar artırılır %::.

Her şeyin gerçekleşme sırasına biraz dikkat ederek, başlatma gerektirmez, 1otomatik olarak ilk sayı olur.

Boyutu @Fkaç sayı üretildiği için durdurma koşulu olarak kullanılabilir


4

05AB1E , 17 16 bayt

Xˆ$µ>D¯ŒOså_i¼Dˆ

açıklama

Xˆ                # initialize global array to [1]
  $               # push 1 and input to stack
   µ              # while counter != input
    >             # increase variable on stack
      ¯ŒO         # list of all sums of consecutive number in global array
     D   så_i     # if current stack value is not in the list
             ¼    # increase counter
              Dˆ  # add current stack value to global array

Çevrimiçi deneyin!

Adnan sayesinde 1 bayt tasarruf edildi


Does $yerine Xsişin?
Adnan

@Adnan: Evet, elbette. Benim sersemliğim. Teşekkürler!
Emigna

4

Jöle , 14 13 11 bayt

Ḷ߀Ẇ;ḅ1‘ḟ$Ṃ

Çevrimiçi deneyin!

Nasıl çalışır

Ḷ߀Ẇ;ḅ1‘ḟ$Ṃ  Main link. Argument: n

Ḷ            Unlength; yield [0, ..., n - 1].
 ߀          Recursively map the main link over the range.
   Ẇ         Window; yield all subarrays of consecutive elements of the result.
    ;        Append n to the array of subarrays.
     ḅ1      Convert all subarrays from base 1 to integer.
             This is equivalent to S€ (sum each), but it allows ; to hook.
         $   Combine the previous two links into a monadic chain.
       ‘       Increment all sums.
        ḟ      Filter; remove the original sums from the incremented ones.
          Ṃ  Compute the minimum.

2

Pyth - 19 17 bayt

Lanet olası tüm sonuçlarımı mahvediyorum. (Aynı bayt literaly bir arttırılarak saymak Q: =hQesmaYf!}TsM.:Y)

esmaYf!}TsM.:Y)1h

Test Takımı .


Azaltma kullanımı (yalnızca) bir bayt tasarruf sağlar. Daha fazlası ...eu+Gf!}TsM.:G))hQY
Jakube

1
@Jakube haritası genellikle kendinden referans dizileri için daha kısadır
Maltysen

2

JavaScript, 125 112 110 bayt

@Neil sayesinde 2 bayt kaydedildi

f=n=>{a=[[]];for(i=1,z=0;z<=n;i++)a.some(b=>b.includes(i))||(a[z+1]=[0,...a[z++]||[]].map(v=>i+v));alert(i-1)}

Önceki cevaplar

@Neil sayesinde 112 bayt:

f=n=>{a=[[]];for(i=1,z=0;z<=n;i++)if(!a.some(b=>b.includes(i))){a[z+1]=[0,...a[z++]||[]].map(v=>i+v)}alert(i-1)}

125 bayt:

f=n=>{a=[[]];for(i=1,k=z=0;z<=n;i++)if(a.every(b=>b.every(c=>c-i))){a[i]=[i].concat((a[k]||[]).map(v=>i+v));k=i,z++}alert(k)}

1
Çünkü b.every(c=>c-i)ben denemek !b.includes(i)ya da muhtemelen !a.some(b=>b.includes(i))çalışır, [0,...a[k]||[]].map(v=>i+v)yerini alabilir [i].concat((a[k]||[]).map(v=>i+v)). Ayrıca gerçekten ihtiyacınız var kmı?
Neil

1
Artık if(!...){...}tek bir ifadeniz olduğundan, büyük olasılıkla ...||(...)veya ile değiştirebilirsiniz ...?0:....
Neil

1

Python, 113 105 92 80 bayt

s=F={1}
x=1
exec"while{x}<=s:x+=1\nF={x+j for j in{0}|F};s|=F\n"*input()
print x

Kaydettiğim son baytlar Ton'un Perl cevabından ilham aldı: benimkiyle Faynı şeyi yapıyor @F; benim sesas olarak onunla aynı şeyi yapar %::.


1

JavaScript (ES6), 77 bayt

(n,a=[],s=a,i=1)=>s[i]?f(n,a,s,i+1):--n?f(n,[0,...a].map(j=>s[j+=i]=j),s,i):i

Temelde @ TonHospel Perl cevabının algoritmasının özyinelemeli bir bağlantı noktası.

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.