Đơn hàng mới số 3: 5 8 6


16

Giới thiệu (có thể bỏ qua)

Đặt tất cả các số dương theo thứ tự thông thường của nó (1, 2, 3, ...) là một chút nhàm chán, phải không? Vì vậy, đây là một loạt các thách thức xung quanh hoán vị (chia sẻ lại) của tất cả các số dương. Đây là thách thức thứ ba trong loạt bài này (liên kết đến các đầu tiênthứ hai thách thức).

Trong thử thách này, chúng tôi sẽ sắp xếp các số tự nhiên theo các hàng có độ dài tăng dần sao cho tổng của mỗi hàng là một số nguyên tố. Điều tôi thấy thực sự tuyệt vời về điều này, là mọi số tự nhiên đều có một vị trí trong sự sắp xếp này. Không có con số nào được bỏ qua!

Hình dung của sự sắp xếp này trông như thế này:

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.

Chúng ta có thể đọc các phần tử từ các hàng trong tam giác này. 20 yếu tố đầu tiên là: 1, 2, 3, 4, 5, 8, 6 , 7, 9, 15, 10, 11, 12, 13, 21, 14, 16, 17, 18, 19 ( vâng, có một bài hát New Order ẩn trong chuỗi này ).

Vì đây là một thách thức "chuỗi thuần", nên nhiệm vụ là xuất một(n) cho n cho trước làm đầu vào, trong đó một(n)A162371 .

Bài tập

Cho một đầu vào số nguyên n , đầu ra một(n) ở định dạng số nguyên.

một(n) được định nghĩa làphần tử thứn của hoán vị sớm nhất về mặt từ vựng của các số tự nhiên, khi được xem như một tam giác được đọc bởi các hàng, với n> 1 tổng các hàng là số nguyên tố. Kể từ khi hoán vị hoặc null đầu tiên của số bắt đầu tự nhiên với 1,một(1) là 1. Lưu ý rằng theo định nghĩa nàymột(1)= =1một(1)khôngcần thiết để được thủ. Đây là trình tự OEISA162371.

Lưu ý: lập chỉ mục dựa trên 1 được giả định ở đây; bạn có thể sử dụng lập chỉ mục dựa trên 0, vì vậy một(0)= =1;một(1)= =2 , v.v. Hãy đề cập đến điều này trong câu trả lời của bạn nếu bạn chọn sử dụng nó.

Các trường hợp thử nghiệm

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

Quy tắc

  • Đầu vào và đầu ra là các số nguyên (chương trình của bạn ít nhất phải hỗ trợ đầu vào và đầu ra trong phạm vi từ 1 đến 32767)
  • Đầu vào không hợp lệ (0, số float, chuỗi, giá trị âm, v.v.) có thể dẫn đến đầu ra không dự đoán được, lỗi hoặc (không) hành vi được xác định.
  • Mặc định I / O quy tắc áp dụng.
  • Lỗ hổng mặc định bị cấm.
  • Đây là , vì vậy câu trả lời ngắn nhất tính bằng byte sẽ thắng

Chúng ta có thể xuất chuỗi vô hạn hoặc thay vào đó trả về một trình tạo không?
Jo King

2
Err, 1 không phải là một thủ tướng
Jo King

1
@JoKing about a (1) = 1: Tôi sẽ thêm nó. Đó thực sự là ngoại lệ. Điều này được nêu rõ trong mục OEIS, mua tôi đã thất bại đề cập đến nó một cách rõ ràng. Tôi sẽ thêm nó vào câu hỏi. Cảm ơn.
bất cứ

@JoKing lưu ý rằng định nghĩa của chuỗi chỉ yêu cầu tổng của hàng là số nguyên tố cho n> 1. Vì dãy là hoán vị từ vựng đầu tiên của các số tự nhiên, nên (1) xuất hiện là 1. Vì vậy, thực sự, 1 không phải là số nguyên tố mà là thách thức hoặc định nghĩa của chuỗi không nói hoặc yêu cầu 1 là số nguyên tố .. .
agtoever

4
Trình tự liên quan: A075348 .
jimmy23013

Câu trả lời:



3

Perl 6 , 80 77 byte

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

Hãy thử trực tuyến!

Giải trình:

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

Hãy thử trực tuyến! (có thêm 2 byte cho f=)

EDIT: Bây giờ sử dụng lập chỉ mục dựa trên 0 để lưu 2 byte. Cảm ơn @wastl đã chỉ ra điều đó, tôi đã bỏ lỡ nó trong OP.

Điều này rất thú vị để viết! Hàm trợ giúp %có độ dài lvà danh sách các giá trị có thể sử dụng a. Nó trả về một danh sách vô hạn các giá trị cho chuỗi. Độ dài nhỏ hơn một chiều dài của hàng tam giác hiện tại và danh sách là vô hạn và được sắp xếp trước. Đầu tiên chúng ta chỉ mang lại các lgiá trị đầu tiên avà sau đó xem qua phần còn lại của a cho đến khi chúng ta tìm thấy giá trị đầu tiên (nhỏ nhất) tạo ra tổng nguyên tố. Chúng tôi chia nhỏ danh sách xung quanh giá trị đó bằng cách sử dụng spanvà một số mẫu khớp. Bây giờ tất cả những gì chúng ta phải làm là mang lại giá trị mới đó và lặp lại với độ dài dòng tiếp theo l+1và các giá trị còn lại trong a. Để có kết quả cuối cùng, chúng tôi thêm 1 (trường hợp đặc biệt cho n = 0) và lập chỉ mục cho nó với !!.


1
Tôi nghĩ bạn có thể loại bỏ 0:trạng thái thách thức mà bạn có thể sử dụng lập chỉ mục dựa trên 0.
lãng phí


2

Thạch , 46 byte

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

Hãy thử trực tuyến!

Đã hết thời gian cho n lớn trên tio, nhưng hoạt động ở đó cho tất cả trừ hai ví dụ cuối cùng.


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

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.