Orde Baru # 3: 5 8 6

16

Pendahuluan (dapat diabaikan)

Menempatkan semua angka positif dalam urutan regulernya (1, 2, 3, ...) agak membosankan, bukan? Jadi di sini adalah serangkaian tantangan seputar permutasi (perombakan) dari semua bilangan positif. Ini adalah tantangan ketiga dalam seri ini (tautan ke tantangan pertama dan kedua ).

Dalam tantangan ini, kita akan mengatur bilangan asli dalam deretan panjang yang bertambah sedemikian rupa sehingga jumlah setiap baris adalah bilangan prima. Apa yang saya temukan sangat menakjubkan tentang ini, adalah bahwa setiap bilangan alami memiliki tempat dalam pengaturan ini. Tidak ada angka yang terlewati!

Visualisasi pengaturan ini terlihat seperti ini:

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.

Kita bisa membaca elemen dari baris dalam segitiga ini. 20 elemen pertama adalah: 1, 2, 3, 4, 5, 8, 6 , 7, 9, 15, 10, 11, 12, 13, 21, 14, 16, 17, 18, 19 ( ya, ada lagu Orde Baru disembunyikan dalam urutan ini ).

Karena ini adalah tantangan "urutan murni", tugasnya adalah mengeluarkan Sebuah(n) untuk n diberikan sebagai input, di mana Sebuah(n) adalah A162371 .

Tugas

Diberikan input integer n , output Sebuah(n) dalam format integer.

Sebuah(n) didefinisikan sebagaielemen ke-n dari permutasi paling awal secara leksikografis dari bilangan asli sehingga, ketika dilihat sebagai segitiga yang dibaca oleh baris, untuk n> 1 jumlah baris adalah bilangan prima. Karena permutasi leksikografis pertama dari bilangan asli dimulai dengan 1,Sebuah(1) adalah 1. Perhatikan bahwa dengan definisi iniSebuah(1)=1 danSebuah(1) yangtidakdiperlukan untuk menjadi perdana. Ini adalah urutan OEISA162371.

Catatan: pengindeksan berbasis 1 diasumsikan di sini; Anda dapat menggunakan pengindeksan berbasis 0, jadi Sebuah(0)=1;Sebuah(1)=2 , dll. Sebutkan ini dalam jawaban Anda jika Anda memilih untuk menggunakan ini.

Uji kasus

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

Aturan

  • Input dan output adalah bilangan bulat (program Anda setidaknya harus mendukung input dan output dalam kisaran 1 hingga 32767)
  • Input yang tidak valid (0, float, string, nilai negatif, dll.) Dapat mengakibatkan output yang tidak terduga, kesalahan atau (tidak) perilaku yang didefinisikan.
  • Standar I / O aturan berlaku.
  • Celah default dilarang.
  • Ini adalah , jadi jawaban tersingkat dalam byte menang
agtoever
sumber
Bisakah kita mengeluarkan urutan secara tak terbatas, atau mengembalikan generator sebagai gantinya?
Jo King
2
Err, 1 bukan prime
Jo King
1
@JoKing tentang (1) = 1: Saya akan menambahkan itu. Itu memang pengecualian. Ini dinyatakan dengan jelas dalam entri OEIS, beli saya gagal dan sebutkan secara eksplisit. Saya akan menambahkannya ke pertanyaan. Terima kasih.
agtoever
@JoKing perhatikan bahwa definisi urutan hanya membutuhkan jumlah baris menjadi prima untuk n> 1. Karena urutannya adalah permutasi leksikografis pertama dari bilangan asli, a (1) keluar sebagai 1. Jadi memang, 1 tidak prima tetapi tantangan atau definisi urutan tidak mengatakan atau mengharuskan 1 untuk menjadi prima .. .
agtoever
4
Urutan terkait: A075348 .
jimmy23013

Jawaban:

4

Jelly , 32 byte

;®»ṀƊSÆn_S
ẎṀ©+LRḟẎḣL;Ç$ṭ
1Ç¡Fị@

Cobalah online!- sangat lambat karena membangun n baris pertama, untuk versi yang lebih cepat yang tidak, pada 37 byte, coba ini .

Jonathan Allan
sumber
3

Perl 6 , 80 77 byte

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

Cobalah online!

Penjelasan:

{                                  }  # 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)
Jo King
sumber
3

Haskell , 122 120 byte

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..])!!)

Cobalah online! (memiliki tambahan 2 byte untukf= )

EDIT: Sekarang menggunakan pengindeksan berbasis 0 untuk menyimpan 2 byte. Terima kasih @wastl untuk menunjukkan hal itu, saya pasti melewatkannya di OP.

Ini sangat menyenangkan untuk ditulis! Fungsi helper %membutuhkan waktu yang lama ldan daftar nilai yang dapat digunakan a. Ini mengembalikan daftar nilai tak terbatas untuk urutan. Panjangnya kurang dari panjang baris segitiga saat ini dan daftar tidak terbatas dan pra-diurutkan. Pertama kita hanya menghasilkan nilai pertama ldari adan kemudian melihat-lihat sisanya sampai kita menemukan nilai pertama (terkecil) yang membuat jumlah prima. Kami memecah daftar di sekitar nilai itu menggunakan spandan beberapa pencocokan pola. Sekarang yang harus kita lakukan adalah menghasilkan nilai baru dan berulang dengan panjang baris berikutnya l+1dan nilai yang tersisa di a. Untuk hasil akhir, kami menambahkan 1 (kasus khusus untuk n = 0) dan indeks ke dalamnya !!.

pengguna1472751
sumber
1
Saya pikir Anda dapat menghapus 0:sebagai tantangan menyatakan Anda dapat menggunakan pengindeksan berbasis 0.
wastl
2

JavaScript (ES6),  111  110 byte

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}

Cobalah online!

Arnauld
sumber
2

Jelly , 46 byte

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

Cobalah online!

Waktu habis untuk n besar pada tio, tetapi bekerja di sana untuk semua kecuali dua contoh terakhir.

Nick Kennedy
sumber
0

Lua , 242 228 226 211 byte

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])

Cobalah online!

wastl
sumber