Chuỗi bổ sung ngắn nhất


23

Chuỗi bổ sung là một chuỗi các số nguyên bắt đầu bằng 1, trong đó mọi số nguyên khác với 1 ban đầu là tổng của hai số nguyên trước đó.

Chẳng hạn, đây là một chuỗi bổ sung:

[1, 2, 3, 4, 7, 8, 16, 32, 39, 71]

Dưới đây là các khoản tiền làm cho nó trở thành một chuỗi bổ sung:

1 + 1 = 2
1 + 2 = 3
1 + 3 = 4
3 + 4 = 7
1 + 7 = 8
8 + 8 = 16
16 + 16 = 32
7 + 32 = 39
32 + 39 = 71

Trong thử thách này, bạn sẽ được cấp một số nguyên dương nvà bạn phải xuất ra một trong những chuỗi bổ sung ngắn nhất kết thúc n.

Ví dụ - lưu ý rằng có nhiều kết quả đầu ra khả dĩ, tất cả những gì bạn cần tìm là một chuỗi bổ sung chỉ ngắn như sau:

1: [1]
2: [1, 2]
3: [1, 2, 3]
4: [1, 2, 4]
5: [1, 2, 3, 5]
6: [1, 2, 3, 6]
7: [1, 2, 3, 4, 7]
11: [1, 2, 3, 4, 7, 11]
15: [1, 2, 3, 5, 10, 15]
19: [1, 2, 3, 4, 8, 11, 19]
29: [1, 2, 3, 4, 7, 11, 18, 29]
47: [1, 2, 3, 4, 7, 10, 20, 27, 47]
71: [1, 2, 3, 4, 7, 8, 16, 32, 39, 71]

Quy tắc I / O tiêu chuẩn, vv Các lỗ hổng tiêu chuẩn bị cấm. Code golf: Ít byte nhất thắng.




1
Chúng ta có được phép xuất chuỗi theo thứ tự ngược lại không?
Arnauld

@Arnauld Không, thứ tự cụ thể này.
isaacg

Câu trả lời:


6

Haskell , 57 byte

c=[1]:[x++[a+b]|x<-c,a<-x,b<-x]
f n=[x|x<-c,last x==n]!!0

Một giải pháp vũ phu. Hãy thử trực tuyến!

Giải trình

Danh sách vô hạn cchứa tất cả các chuỗi bổ sung, được sắp xếp theo chiều dài. Nó được định nghĩa theo quy nạp theo chính nó, bằng cách lấy một danh sách xtừ cvà hai yếu tố từ x, và nối thêm tổng của chúng vào x. Hàm ftìm thấy danh sách đầu tiên trong cđó kết thúc bằng số mong muốn.

c=            -- c is the list of lists
 [1]:         -- containing [1] and
 [x           -- each list x
  ++[a+b]     -- extended with a+b
 |x<-c,       -- where x is drawn from c,
  a<-x,       -- a is drawn from x and
  b<-x]       -- b is drawn from x.
f n=          -- f on input n is:
 [x           -- take list of those lists x
 |x<-c,       -- where x is drawn from c and
  last x==n]  -- x ends with n,
 !!0          -- return its first element.

4

Brachylog , 14 byte

∧≜;1{j⊇Ċ+}ᵃ⁽?∋

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

Một đệ trình vũ phu xây dựng tất cả các chuỗi bổ sung có thể bằng cách sử dụng sâu lặp đi lặp lại, dừng lại khi tìm thấy một chuỗi chứa đối số đúng của nó. Không giống như hầu hết các đệ trình Brachylog, đây là một đệ trình hàm nhập vào thông qua đối số bên phải của nó (theo cách gọi thông thường là Đầu ra) và đầu ra thông qua đối số bên trái của nó (theo cách gọi thông thường là Đầu vào); làm điều này gây tranh cãi, nhưng ), bởi vì phía bên phải của chương trình sẽ không thể sử dụng các ràng buộc ngầm định (do đó sẽ cần phải vô hiệu hóa và một ràng buộc rõ ràng mới được đưa ra, với chi phí là 2 byte ). câu trả lời meta được bình chọn cao nhất về chủ đề này nói rằng nó hợp pháp (và làm như vậy phù hợp với mặc định I / O bình thường của chúng tôi cho các chức năng). Nếu chúng ta sử dụng đầu vào và đầu ra theo cách thông thường hơn, đây sẽ là 16 byte (∧≜;1{j⊇Ċ+}ᵃ⁽.∋?∧

Giải trình

∧≜;1{j⊇Ċ+}ᵃ⁽?∋
∧               Disable implicit constraint to read the left argument
 ≜;        ⁽    Evaluation order hint: minimize number of iterations
    {    }ᵃ     Repeatedly run the following:
   1      ᵃ       From {1 on the first iteration, results seen so far otherwise}
     j            Make {two} copies of each list element
      ⊇           Find a subset of the elements
       Ċ          which has size 2
        +         and which sums to {the new result for the next iteration}
             ∋    If the list of results seen so far contains {the right argument}
            ?     Output it via the left argument {then terminate}

Một sự tinh tế thú vị ở đây là những gì xảy ra ở lần lặp đầu tiên, trong đó đầu vào là một số chứ không phải là một danh sách như trên các lần lặp khác; chúng ta bắt đầu với số 1, tạo hai bản sao của mỗi chữ số (tạo số 11), sau đó tìm một dãy 2 chữ số của nó (cũng là số 11). Sau đó, chúng tôi lấy tổng số của nó, là 2 và như vậy chuỗi bắt đầu [1,2]như chúng tôi muốn. Ở những dòng máy tương lai, chúng tôi đang bắt đầu với một danh sách như [1,2], tăng gấp đôi nó [1,2,1,2], sau đó tham gia một dãy hai yếu tố ( [1,1], [1,2], [2,1], hoặc [2,2]); rõ ràng, tổng của mỗi trong số này sẽ là các yếu tố tiếp theo hợp lệ của chuỗi bổ sung.

Ở đây có một chút bực bội ở đây là gợi ý thứ tự đánh giá là cần thiết ở đây, đặc biệt là thành phần (có vẻ như nó lấy gợi ý thứ tự đánh giá từ bên trong chứ không phải bên ngoài theo mặc định, do đó sử dụng khá thô sơ để buộc vấn đề).


Tôi đã cố gắng khoảng 30 phút để tìm một cách ngắn để thực hiện thử thách này. Giải pháp của tôi là cách lâu hơn thế này.
Gây tử vong vào

1
@Firthize: là một trong những nội dung hiếm khi xuất hiện, nhưng khi bạn cần, bạn thực sự cần nó, vì không có cách nào ngắn gọn để thực hiện nó bằng các cấu trúc điều khiển khác. Khi tôi nhận ra đây là một thử thách, phần còn lại đến khá trực tiếp từ đó.

2

Thạch , 17 byte

’ŒP;€µ+þ;1Fḟ@µÐḟḢ

Đưa ra giải pháp từ vựng đầu tiên theo thời gian theo cấp số nhân.

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

Làm thế nào nó hoạt động

’ŒP;€µ+þ;1Fḟ@µÐḟḢ  Main link. Argument: n (integer)

’                  Decrement; n-1.
 ŒP                Powerset; generate all subarrays of [1, ..., n-1], sorted first
                   by length, then lexicographically.
   ;€              Append n to all generate subarrays.
     µ       µÐḟ   Filterfalse; keep only subarrays for which the chain between the
                   two chain separators (µ) returns a falsy value.
     µ             Monadic chain. Argument: A (array of integers)
      +þ               Add table; compute the sums of all pairs of elements in x,
                       grouping the results by the right addend.
        ;1             Append 1 to the resulting 2D array.
          F            Flatten the result.
           ḟ@          Filterfalse swapped; remove all elements of A that appear in
                       the result. This yields an empty list for addition chains.
                Ḣ  Head; select the first result.

2

JavaScript (ES6), 83 86 byte

Chỉnh sửa: cố định để xuất danh sách theo thứ tự không đảo ngược

n=>(g=(s,a=[1])=>s-n?s>n||a.map(v=>g(v+=s,a.concat(v))):r=1/r|r[a.length]?a:r)(r=1)&&r

Bản giới thiệu


2

PHP, 195 byte

function p($a){global$argn,$r;if(!$r||$a<$r)if(end($a)==$argn)$r=$a;else foreach($a as$x)foreach($a as$y)in_array($w=$x+$y,$a)||$w>$argn||$w<=max($a)?:p(array_merge($a,[$w]));}p([1]);print_r($r);

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


Thật không may, thuật toán này không đưa ra câu trả lời tối ưu, ví dụ: 15.
Neil

@ Bây giờ nó dài hơn nhưng nó hoạt động. Tôi không có ý tưởng trong lúc này làm thế nào để quyết định cách nào trong cả hai cách là đúng. Có lẽ số lượng các số nguyên tố đóng vai trò
Jörg Hülsermann

mã này không vượt qua bài kiểm tra 149. Độ dài phải là 10, không phải 11
J42161217

@Jenny_mathy Đã sửa
Jörg Hülsermann

1

Toán học, 140 byte

t={};s={1};(Do[While[Last@s!=#,s={1};While[Last@s<#,AppendTo[s,RandomChoice@s+Last@s]]];t~AppendTo~s;s={1},10^4];First@SortBy[t,Length@#&])&

.

tạo ra một chuỗi bổ sung ngắn nhất khác nhau mỗi khi bạn chạy nó

Dùng thử trực tuyến,
dán mã bằng ctrl + v, đặt đầu vào tức là [71] vào cuối mã và nhấn shift + enter


Vì tôi không có quyền truy cập vào Mathematica, chuỗi này có độ dài chuỗi nào cho đầu vào là 15?
Neil

bên phải {1, 2, 3, 5, 10, 15}
J42161217

3
Đối với đầu vào 149, tôi đã nhận được một chuỗi có độ dài 11 từ chương trình của bạn, nhưng tồn tại một trong các độ dài 10 ( [1,2,4,5,9,18,36,72,77,149]). Có vẻ như chương trình của bạn sử dụng lấy mẫu ngẫu nhiên và không được đảm bảo để tìm giải pháp tối ưu.
Zgarb

đã sửa! nhưng phải mất nhiều thời gian hơn
J42161217

1

Bình thường, 13 byte

h-DsM^N2/#QyS

Bộ kiểm tra

Cung cấp cho chuỗi từ vựng ngắn nhất đầu tiên. Nó khá chậm, nhưng không tệ lắm -19 hoàn thành trong khoảng 30 giây bằng cách sử dụng pypy.

Một số ý tưởng từ giải pháp của @ Dennis.

Tôi thực sự thích cái này - có rất nhiều mánh khóe liên quan.

Giải trình:

h-DsM^N2/#QyS
h-DsM^N2/#QySQ    Implicit variable introduction
            SQ    Inclusive range, 1 to input.
           y      Subsets - all subsets of the input, sorted by length then lexicographically
                  Only sorted subsets will be generated.
                  Our addition chain will be one of these.
        /#Q       Filter for presence of the input.
  D               Order by
 -                What's left after we remove
     ^N2          All pairs of numbers in the input
   sM             Summed
h                 Output the list that got sorted to the front.

Điều này vẫn còn một chút khó hiểu, nhưng hãy để tôi cố gắng giải thích chi tiết hơn một chút.

Chúng tôi bắt đầu với ySQ, cung cấp cho tất cả các tập hợp con có thể có của[1, 2, ... Q] , theo thứ tự tăng kích thước. Chuỗi bổ sung ngắn nhất chắc chắn là một trong số này, nhưng chúng ta cần tìm ra nó.

Điều đầu tiên chúng ta sẽ làm là lọc danh sách để chỉ giữ các danh sách có chứa a Q. Chúng tôi làm điều này với /#Q.

Tiếp theo, chúng tôi sắp xếp danh sách theo những gì còn lại sau khi chúng tôi xóa kết quả của một chức năng nhất định. -Dđơn đặt hàng của phần còn lại sau khi loại bỏ một cái gì đó.

Điều chúng tôi xóa là sM^N2, Ndanh sách chúng tôi đang xóa mọi thứ ở đâu. ^N2cung cấp cho sản phẩm cartesian của Nchính nó, tất cả các cặp có thể có của hai yếu tố trong N. sMsau đó tổng hợp từng cặp.

Kết quả nhỏ nhất có thể là gì, sau khi chúng tôi thực hiện việc này? Chà, phần tử nhỏ nhất trong danh sách đầu vào chắc chắn sẽ vẫn còn, bởi vì tất cả các số đều dương, vì vậy bất kỳ tổng nào của hai số sẽ lớn hơn số nhỏ nhất. Và sẽ có ít nhất một số, bởi vì chúng tôi đã kiểm tra rằng đầu vào đã có trong danh sách. Do đó, kết quả nhỏ nhất có thể sẽ là khi mọi số trừ số nhỏ nhất là tổng của hai số khác trong danh sách và số nhỏ nhất trong danh sách là 1. Trong trường hợp này, khóa sắp xếp sẽ là[1] . Những yêu cầu này có nghĩa là danh sách phải là một chuỗi bổ sung.

Vì vậy, chúng tôi sắp xếp các chuỗi bổ sung vào phía trước. Hãy nhớ rằng ycung cấp cho các tập hợp con của nó theo thứ tự tăng kích thước, vì vậy danh sách được sắp xếp ở phía trước phải là một trong những chuỗi bổ sung ngắn nhất. hchọn danh sách đó

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.