Yeni Sipariş # 3: 5 8 6


16

Giriş (yok sayılabilir)

Tüm pozitif sayıları düzenli sıraya koymak (1, 2, 3, ...) biraz sıkıcı, değil mi? Burada, tüm pozitif sayıların permütasyonları (yeniden karıştırmaları) etrafında bir dizi zorluk var. Bu, bu serideki üçüncü zorluktur ( birinci ve ikinci zorluklara bağlantılar).

Bu meydan okumada, doğal sayıları, her bir satırın toplamının asal olacağı şekilde, artan uzunluktaki satırlar halinde düzenleyeceğiz. Bu konuda gerçekten şaşırtıcı bulduğum şey, her doğal sayının bu düzenlemede bir yeri olması. Hiçbir sayı atlanmıyor!

Bu düzenlemenin görselleştirilmesi şuna benzer:

row             numbers             sum
1                  1                  1
2                2   3                5
3              4   5   8             17
4            6   7   9  15           37
5          10 11  12  13  21         67
6        14  16 17  18  19  23      107
etc.

Bu üçgendeki satırlardan öğeleri okuyabiliriz. İlk 20 element şunlardır: 1, 2, 3, 4, 5, 8, 6 , 7, 9, 15, 10, 11, 12, 13, 21, 14, 16, 17, 18, 19 ( evet, var bu sırayla gizlenmiş Yeni Sipariş şarkısı ).

Bu bir "saf dizisi" meydan okuma olduğu için, görev çıkışına olan bir(n) için, belirli bir girdi olarak olduğu A162371 .nbir(n)

Görev

Bir tamsayı girişi verildiğinde , tamsayı biçiminde çıktısı alın .nbir(n)

bir(n) , doğal sayıların sözlükbilimsel olarak en erken permütasyonunun elemanı olarak tanımlanır, öyle ki, satırlar tarafından okunan bir üçgen olarak görüldüğünde, n> 1 için satırların toplamları asal sayılardır. 1 ile doğal sayılar başlar ilk lexicographical permütasyon yana, , bu tanım ile bu 1. Not ve olduğu olmayan asal olması gerekmektedir. Bu OEIS dizisi A162371'dir .nbir(1)bir(1)=1bir(1)

Not: Burada 1 tabanlı indeksleme varsayılmıştır; 0 tabanlı indeksleme kullanabilirsiniz, böylece vb. Bunu kullanmayı seçerseniz lütfen cevabınızda bunu belirtin.bir(0)=1;bir(1)=2

Test senaryoları

Input | Output
---------------
1     |  1
5     |  5
20    |  19
50    |  50
78    |  87
123   |  123
1234  |  1233
3000  |  3000
9999  |  9999
29890 |  29913

kurallar

  • Giriş ve çıkış tamsayılardır (programınız en az 1 ila 32767 aralığında giriş ve çıkışı desteklemelidir)
  • Geçersiz giriş (0, kayan nokta, dize, negatif değerler vb.) Öngörülemeyen çıktılara, hatalara veya (tanımlanmamış) davranışa neden olabilir.
  • Varsayılan I / O kuralları geçerlidir.
  • Varsayılan boşluklar yasaktır.
  • Bu , bu yüzden bayttaki en kısa cevaplar kazanıyor

Sekansı sonsuza kadar çıkarabilir miyiz, yoksa bunun yerine bir jeneratörü iade edebilir miyiz?
Jo King

2
Hata, 1 asal değil
Jo King

1
@ (1) = 1 hakkında bilgi: Bunu ekleyeceğim. Gerçekten de istisnadır. Bu açıkça OEIS girişinde belirtilir, satın açıkça bahsetmiyorum başarısız oldu. Bunu soruya ekleyeceğim. Teşekkürler.
agtoever

@JoKing, dizinin tanımının yalnızca satır toplamının n> 1 için asal olmasını gerektirdiğini unutmayın. Dizi, doğal sayıların ilk sözlükbilimsel permütasyonu olduğu için, bir (1) 1 olarak ortaya çıkar. Dolayısıyla, aslında 1 asal değildir, ancak sekansın meydan okuması veya tanımı 1'in asal olmasını söylemez veya gerektirmez. .
agtoever

4
İlgili sıra: A075348 .
jimmy23013

Yanıtlar:



3

Perl 6 , 80 77 bayt

{({$!=@_;+(1...{$_$!&&(|$!,$_).rotor(1..*).one.sum.is-prime-1})}...*)[$_]}

Çevrimiçi deneyin!

Açıklama:

{                                  }  # Anonymous code block
 (                        ...*)[$_]   # Index into the infinite sequence
  {                      }   # Where each element is
   $!=@_;  # Save the list of previous elements into $!
   +(1...{             })    # Return the first number that
          $_$!         # Has not appeared in the list so far
          &&            # And
          (|$!,$_)      # The new sequence
          .rotor(1..*)  # Split into rows of increasing length
                        # And ignoring incomplete rows
          .one          # Have exactly one row
          .sum          # Where the sum
          .is-prime-1   # Is not prime (i.e. just the first row)

3

Haskell , 122 120 bayt

import Data.Numbers.Primes
l%a|(p,q)<-splitAt l a,(s,k:t)<-span(not.isPrime.(+sum p))q=p++k:(l+1)%(s++t)
((1:1%[2..])!!)

Çevrimiçi deneyin! (için fazladan 2 bayt vardır f=)

EDIT: Şimdi 2 bayt kaydetmek için 0 tabanlı dizinleme kullanır. Bunu işaret ettiğiniz için teşekkürler @ wastl, ben OP kaçırmış olmalı.

Bu yazmak çok eğlenceliydi! Yardımcı işlevi %bir uzunluk lve kullanabileceği değerlerin bir listesini alır a. Dizi için sonsuz bir değer listesi döndürür. Uzunluk, geçerli üçgen sırasının uzunluğundan bir daha azdır ve liste sonsuzdur ve önceden sıralanmıştır. İlk önce sadece ilk ldeğerleri veririz ave sonra toplamı asal yapan ilk (en küçük) değeri bulana kadar a'nın geri kalanına bakarız. Listeyi bu değer etrafında spanve bazı desen eşleşmelerini kullanarak parçalara ayırıyoruz. Şimdi tek yapmamız gereken yeni bir değer vermek ve bir sonraki satır uzunluğu l+1ve kalan değerler ile tekrarlamak a. Nihai sonuç için 1 (n = 0 için özel durum) başını ekleriz ve içine indeksleriz !!.


1
Bence 0:meydan okuma durumları olarak 0 tabanlı indeksleme kullanabilirsiniz kaldırabilirsiniz .
Wastl

2

JavaScript (ES6),  111  110 bayt

n=>{for(g=n=>{for(d=n;n%--d;);},i=l=0;i--||(k=s=0,i=l++),n--;g[k]=s+=r=k)for(;g[++k]|g(!i*++s)|d>1;);return r}

Çevrimiçi deneyin!


2

Jöle , 46 bayt

S©‘æR®Ḥ‘¤_®ḟ;F¥Ṃ
FLḤRḟFḣ0ịLƊ;祵W
1;Ç$⁸½Ḥ¤¡Fị@

Çevrimiçi deneyin!

Tio'da büyük n zaman aşımına uğradı, ancak son iki örnek dışında herkes için çalışıyor.


0

Lua , 242 228 226 211 bayt

s={}u={}i=0 n=0+...while i<n do
n=n-i
x,S=1,0
for j=1,i do
while u[x]do x=x+1 end
s[j]=x
S=S+x
u[x]=0
end
while u[x]or p do
x=x+1
d=S+x
p=F
for c=2,d-1 do
p=p or d%c<1
end
end
i=i+1
s[i]=x
u[x]=0
end
print(s[n])

Ç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.