Số lượng kiềm chuỗi thẳng có chiều dài cho trước


28

Một kiềm * ne chuỗi thẳng được định nghĩa là một chuỗi các nguyên tử carbon được kết nối bởi các liên kết đơn (ankan), kép (anken) hoặc ba (alkyne), (hydrogens ngầm được sử dụng.) Các nguyên tử carbon chỉ có thể tạo thành 4 liên kết, vì vậy không có nguyên tử carbon có thể bị buộc phải có nhiều hơn bốn liên kết. Một chuỗi kiềm * ne có thể được biểu diễn dưới dạng một danh sách các liên kết carbon-carbon của nó.

Đây là một số ví dụ về kiềm chuỗi thẳng * hợp lệ:

[]       CH4              Methane
[1]      CH3-CH3          Ethane
[2]      CH2=CH2          Ethene
[3]      CH≡CH            Ethyne
[1,1]    CH3-CH2-CH3      Propane
[1,2]    CH3-CH=CH2       Propene
[1,3]    CH3-C≡CH         Propyne
[2,1]    CH2=CH-CH3       Propene
[2,2]    CH2=C=CH2        Allene (Propadiene)
[3,1]    CH≡C-CH3         Propyne 
[1,1,1]  CH3-CH2-CH2-CH3  Butane
...

Mặc dù những điều này là không, vì ít nhất một nguyên tử carbon sẽ có nhiều hơn 4 liên kết:

[2,3]
[3,2]
[3,3]
...

Nhiệm vụ của bạn là tạo ra một chương trình / hàm, với một số nguyên dương n, xuất / trả về số lượng các chuỗi kiềm thẳng hợp lệ của ncác nguyên tử carbon chính xác theo chiều dài. Đây là OEIS A077998 .

Thông số kỹ thuật / làm rõ

  • Bạn phải xử lý 1chính xác bằng cách quay trở lại 1.
  • Kiềm * thích [1,2][2,1]được coi là khác biệt.
  • Đầu ra là độ dài của một danh sách tất cả các kiềm có thể có của một độ dài nhất định.
  • Bạn không phải xử lý 0 chính xác.

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

1 => 1
2 => 3
3 => 6
4 => 14

Đây là mã golf, vì vậy số byte thấp nhất sẽ thắng!


chỉ cần làm rõ, một chuỗi là hợp lệ nếu tất cả các cặp liên tiếp được tóm tắt <=4, phải không?
Maltysen

Đã sửa. @Maltysen: có.
Zacharý

4
Tại sao có một chuỗi OEIS cho tất cả mọi thứ? : P
HyperNeutrino

2
@ZacharyT, có chính xác một hydrocarbon với các nguyên tử carbon bằng không, và đó là một trong đó cũng có các nguyên tử hydro bằng không. Đó là đối số chính xác giống như đối với tam giác của Pascal có 1 ở trên đầu thay vì 0 hoặc theo nghĩa đen là hàng trăm chuỗi kết hợp khác.
Peter Taylor

1
@Emigna, đó là vì trình tự sai đã được liên kết. Tôi sẽ sửa nó.
Peter Taylor

Câu trả lời:


7

Ốc đảo , 9 7 byte

xcd-+3V

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

Giải trình

Điều này sử dụng mối quan hệ tái phát trong OEIS :

a (n) = 2 * a (n-1) + a (n-2) - a (n-3)

x    Multiply a(n-1) by 2: gives 2*a(n-1)
c    Push a(n-2)
d    Push a(n-3)
-    Subtract: gives a(n-2) - a(n-3)
+    Add: gives 2*a(n-1) + a(n-2) - a(n-3)
3    Push 3: initial value for a(n-1)
V    Push 1, 1: initial values for a(n-2), a(n-3)

1
Sử dụng tốt các giá trị ban đầu! Bạn giành chiến thắng lần này;)
Emigna

Vâng, có lẽ không có cách nào để đánh bại điều này.
Zacharý

4
@ZacharyT Chỉ khi ai đó có thể tìm ra cách để làm cho chương trình có xkcdtrong đó.
hBy2Py

4
@ hBy2Py Vâng, xkcd-+311hoạt động , bởi vì khiện tại là không có ...
Luis Mendo

10

MATL , 10 byte

7K5vBiY^1)

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

Giải trình

Điều này sử dụng đặc tính tìm thấy trong OEIS

a (n) là mục trên cùng bên trái của công suất thứ n của ma trận 3 X 3 [1, 1, 1; 1, 0, 0; 1, 0, 1]

7    % Push 7
K    % Push 4
5    % Push 5
v    % Concatenate all numbers into a column vector: [7; 4; 5]
B    % Convert to binary: gives 3×3 matrix [1, 1, 1; 1, 0, 0; 1, 0, 1]
i    % Input n
Y^   % Matrix power
1)   % Take the first element of the resulting matrix, i.e. its upper-left corner.
     % Implicitly display

6

Ốc đảo , 9 8 byte

Đã lưu một byte nhờ Adnan

xc+d-63T

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

Giải trình

a(0) = 0
a(1) = 1
a(2) = 3
a(3) = 6

a(n) = xc+d-

x         # calculate 2*a(n-1)
 c        # calculate a(n-2)
  +       # add: 2*a(n-1) + a(n-2)
   d      # calculate a(n-3)
    -     # subtract: 2*a(n-1) + a(n-2) - a(n-3)

1
Tốt đẹp! Ngoài ra, xlà viết tắt của 2*:).
Ad Nam

1
Beat ya :-P (Tôi chưa thấy câu trả lời của OASIS)
Luis Mendo

@Adnan Có cách nào để nói với Oasis rằng bạn muốn thay đổi chỉ số chuỗi đầu ra bằng 1 không? Ý tôi là, trừ 1 cho đối số đầu vào (thay vì sử dụng chữ cái đầu 0ở đây)
Luis Mendo

1
@LuisMendo Ah, điều đó chưa được thực hiện. Nhưng đó là một ý tưởng tốt cho phiên bản tiếp theo :).
Ad Nam

Để tham khảo trong tương lai, điều này hiện đang được triển khai
Luis Mendo

4

Thạch, 10 byte

745DBæ*µḢḢ

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

Sử dụng thuật toán của Luis Mendo .

Giải trình

745DBæ*µḢḢ    Main link. Argument: n
745D          Get the digits of 745
    B         Convert each to binary
     æ*       Matrix power
        ḢḢ    First element of first row

Thạch, 15 byte

3Rṗ’µ+2\<5PµÐfL

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

Sử dụng vũ lực.

Giải trình

3Rṗ’µ+2\<5PµÐfL    Main link. Argument: n
3R                 Start with [1, 2, 3]
   ’               Take the (n-1)'th
  ṗ                Cartesian power
            Ðf     Filter on:
     +2\             Sums of overlapping pairs
        <5           1 for sums < 5, 0 otherwise
          P          Product: 1 if all pairs < 5
              L    Length

4

MATL , 14 byte

q3:Z^TTZ+!5<As

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

Giải trình

Điều này tạo ra sức mạnh của Cartesian [1 2 3]"tăng" đến số lượng nguyên tử trừ đi 1, và sau đó sử dụng tích chập để kiểm tra xem không có hai số liền kề nào trong mỗi tuple của Cartesian nhiều hơn 4.

q    % Take number of atoms n implicitly
3:   % Push [1 2 3]
Z^   % Cartesian power. Gives a matrix with each (n-1)-tuple on a row
TT   % Push [1 1]
Z+   % 2D convolution. For each tuple this gives the sum of contiguous numbers
5<   % For each entry, gives true if less than 5
!    % Transpose
A    % True if all elements of each column are true. Gives a row vector
s    % Sum of true results. Implicitly display

3

Toán học, 48 byte

MatrixPower[{{1,1,1},{1,0,0},{1,0,1}},#][[1,1]]&

Như Luis Mendo đã chỉ ra , đây là A006356 trong OEIS. Đây là những nỗ lực ban đầu của tôi:

Count[Length@Split[#,+##<5&]&/@Tuples[{1,2,3},#-1],0|1]&

Đối với một đầu vào n, Tuples[{1,2,3},n-1]là danh sách tất cả (n-1)các phần tử của các phần tử {1,2,3}đại diện cho tất cả các chuỗi có thể có của các liên kết đơn, đôi hoặc ba cho ncác nguyên tử carbon. +##<5&là một hàm thuần trả về việc tổng các đối số của nó có nhỏ hơn hay không 5, do đó, Split[#,+##<5&]&chia một danh sách thành các danh sách con bao gồm các phần tử liên tiếp có tổng các cặp nhỏ hơn 5. Mô tả một kiềm * ne hợp lệ tương đương với danh sách này có độ dài 0(trong trường hợp n=1) hoặc 1, vì vậy tôi chỉ Countlà số lượng (n-1)-tuples trong đó độ dài của danh sách đó khớp 0|1.

Count[Fold[If[+##>4,4,#2]&]/@Tuples[{1,2,3},#-1],Except@4]&

If[+##>4,4,#2]&trả về 4nếu tổng các đối số của nó lớn hơn 4và trả về đối số thứ hai nếu không. Fold[If[+##>4,4,#2]&]không một bên trái Foldcủa đầu vào của nó với chức năng này. Vì vậy, ở đây tôi Countsố lượng (n-1)-tuples mà áp dụng toán tử này không cung cấp 4. Trường hợp n=1được bảo hiểm kể từ khi Foldvẫn không được đánh giá khi đối số thứ hai của nó là danh sách trống {}.


1
Điều này sẽ làm việc? (Loại tách ngay từ OEIS với các điều chỉnh) LinearRecurrence[{2,1,-1},{1,3,6},#][[#]]&?
Zacharý

Một phần lý do tại sao tôi thích trang web này là tìm hiểu tất cả các tính năng mà
Mathicala

Ý this sitebạn là OEIS hay PPCG?
Zacharý

PPCG. Tôi đã chọn rất nhiều Mathicala từ các đề xuất của mọi người.
ngenisis

3

Python, 51 byte

f=lambda n:n<4and(n*n+n)/2or 2*f(n-1)+f(n-2)-f(n-3)

Đây là một thực hiện đơn giản của mối quan hệ tái phát. Cảm ơn Tim Pederick cho 3 byte. Đầu ra là một số float trong Python 3 và một số nguyên trong Python 2.

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


(n*n+n)/2ngắn hơn [1,3,6][n-1]. Và nếu bạn đang sử dụng Python 3 không thích kết thúc với đầu ra dấu phẩy động, (n*n+n)//2thì vẫn ngắn hơn.
Tim Pederick


2

Ruby, 62 byte

->n{c=0
(10**n/10).times{|i|"#{i}#{i*11}"=~/[3-9]/||c+=1}
c}

Cơ sở 10 cách tiếp cận mạnh mẽ không hiệu quả. Có thể được cải thiện thành cơ sở 5 cho các byte bổ sung.

Các số được tạo trong đó mỗi chữ số biểu thị một liên kết (n-1 chữ số.) Thể 0hiện thứ tự liên kết là 1, 2thể hiện thứ tự liên kết là 3. Các chữ số trên 2 không hợp lệ.

Chúng tôi nhân số này với 11 để tổng các cặp chữ số liền kề. Một lần nữa chữ số trên 3 không hợp lệ.

Chúng tôi kết hợp hai số trong một chuỗi và thực hiện regex để tìm kiếm các chữ số không hợp lệ. Nếu không tìm thấy, chúng tôi tăng bộ đếm.

trong chương trình thử nghiệm

f=->n{c=0
(10**n/10).times{|i|"#{i}#{i*11}"=~/[3-9]/||c+=1}
c}

p f[gets.to_i]

2

Ruby, 51 byte

->n{a=[1,1,3]
n.times{a<<2*a[-1]+a[-2]-a[-3]}
a[n]}

Dựa trên mối quan hệ tái phát theo OEIS A006356.

Bắt đầu với một mảng cho các phần tử 0,1 và 2 của chuỗi là 1 (theo tính toán của tôi, để làm cho nó hoạt động), 1 và 3 tương ứng.

Lặp lại thêm nnhiều phần tử vào chuỗi, sau đó trả về phần tử n. Nó luôn tính toán 2 yếu tố nhiều hơn thực tế, nhưng đó vẫn là thời gian tuyến tính, hiệu quả hơn nhiều so với câu trả lời trước đây của tôi.

trong chương trình thử nghiệm

f=->n{a=[1,1,3]
n.times{a<<2*a[-1]+a[-2]-a[-3]}
a[n]}

p f[gets.to_i]

2

Toán học, 42 40 byte

Số lượng byte giả định mã hóa một byte tương thích như CP-1252 (mặc định trên các cài đặt Windows).

±0=±1=1;±2=3;±n_:=±(n-1)2+±(n-2)-±(n-3);

Điều này chỉ đơn giản là thực hiện tái phát được đưa ra trên OEIS như là một toán tử đơn nguyên.


2

CJam (19 byte)

{2,{__-2=+1b+}@*W=}

Bộ kiểm tra trực tuyến . Đây là một khối ẩn danh (hàm) lấy một mục trên ngăn xếp và để lại một mục trên ngăn xếp. Lưu ý rằng bộ kiểm tra bao gồma(0) = 1 .

Sự tái phát được sử dụng dựa trên sự quan sát cho chuỗi OEIS liên quan A006356 :

Bằng với biến đổi INVERT của (1, 2, 1, 1, 1, ...) tương đương với a (n) = a (n-1) + 2 * a (n-2) + a (n-3) + a (n-4) + ... + 1. a (6) = 70 = (31 + 2 * 14 + 6 + 3 + 1 + 1). - Gary W. Adamson, ngày 27 tháng 4 năm 2009

nhưng với phần bù thích hợp, loại bỏ sự cần thiết cho trận chung kết + 1như hiện tại a(0).

Mổ xẻ

{         e# Define a block
  2,      e#   Take starting sequence [0 1] (beginning at index -1 for golfiness)
  {       e#   Loop...
    _     e#     Copy sequence so far
    _-2=+ e#     Append an extra copy of a(n-2)
    1b    e#     Sum
    +     e#     Append
  }@*     e#   ...n times
  W=      e#   Take the final value from the sequence
}

2

Brain-Flak, 56 byte

Sử dụng thuật toán chi tiết trong bình luận đầu tiên trên trang OEIS.

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

({}[()]<(((())))>){({}[()]<{({}<>({}))<>}<>>)}{}({}<>{})

Giải trình

Trình tự có thể được định nghĩa như sau:

For u(k), v(k), and w(k) such that
u(1) = v(1) = w(1) = 1
u(k+1) = u(k) + v(k) + w(k)
v(k+1) = u(k) + v(k)
w(k+1) = u(k)
u(k) is the number of straight-chain alk*nes with length k

Chương trình bắt đầu tại 1và liên tục áp dụng sự lặp lại này để tính toánu(k)

Mã chú thích (chú thích thực tế sẽ đến)

# Setup: decrement the input by one and push three 1's to the stack under it
({}[()]<(((())))>)

# Calculation:
{                          }           # While the input is not zero (main loop)
 ({}[()]                  )            # Pop the counter decrement it by one and push it
        <                >             # Before the counter gets pushed back to the stack...
         {            }                # Loop while the top of the stack is not zero (subloop)
          (        )                   # Push...
           {}                          # The top of the stack (popped)...
             <>                        # to the other stack...
               ({})                    # plus the top of the other stack (peeked)
                    <>                 # Switch back to the first stack.
                       <>              # Switch to the other stack
                            {}         # Pop the input (now zero)
                              (      ) # Push...
                               {}      # The top of the stack (u(k))...
                                 <>    # to the other stack...
                                   {}  # plus the top of the other stack (zero).

Hình dung của ngăn xếp

Trong một lần lặp của vòng lặp chính, đây là những gì xảy ra (lưu ý rằng các số 0 có thể có hoặc không có nhưng dù sao đi nữa cũng không thành vấn đề):

Start of main loop iteration/subloop first iteration:
A    B

u
v
w
0    0
^

After first subloop iteration:
A    B

v
w    u
0    0
^

After second subloop iteration:
A    B

    u+v
w    u
0    0
^

After third subloop iteration (top of stack is zero so subloop terminates):

A    B

   u+v+w
    u+v
     u
0    0
^

End of main loop iteration:
A    B

   u+v+w
    u+v
     u
0    0
     ^

Tình trạng của ngăn xếp bây giờ là giống như nó là lúc bắt đầu của vòng lặp ngoại trừ việc chồng hiện tại có giá trị tiếp theo cho u, vwtrên đó.


2

Perl 6, 48

{my @a=1,0,0;@a=reverse [\+] @a for 1..$_;@a[0]}

Ban đầu

sub f {$_>2??2*f($_-1)+f($_-2)-f($_-3)!!(1,1,3)[$_]}

nhưng tôi quên tôi cần sub fgiải pháp lặp đi lặp lại.


2

APL Dyalog, 30 byte

{⍵<3:⍵⌷1 3⋄+/∧/¨4≥2+/¨,⍳1↓⍵/3}

Sử dụng vũ lực. Giải thích (ít nhất là nỗ lực của tôi tại một, ít nhất):

⍵<3:⍵⌷1 3 - if ⍵ (function arg) is 1 (case 1) or 2 (case 2), return 1 (case 1) or 3 (case 2)
⋄ - separate statements
⍵/3 - otherwise, 3 repeated ⍵ times
1↓ - without the first element
⍳ - the matrix of possible indices of a matrix of that size
,  - ravel, return a list of all the elements of the matrix
2+/¨ - sum of each contiguous pair on each element
4≥ - tests whether each element is less than or equal to 4
∧/¨ - all elements are true, applied to each item.
+/ - Sum.

1

APL Dyalog, 29 byte

{⍵<4:⍵⌷1 3 6⋄+/2 1 ¯1×∇¨⍵-⍳3}

Hoạt động bằng cách sử dụng định nghĩa đệ quy của dãy số nguyên OEIS A006356.


1

Python với Numpy, 62 byte

Tôi đã phải thử nó, nhưng có vẻ như Python thuần túy và đệ quy ngắn hơn numpy và phép tính dựa trên ma trận rõ ràng trên trang OEIS.

from numpy import*
lambda n:(mat('1 1 1;1 0 0;1 0 1')**n)[0,0]

1

R, 61 58 55 51 50 byte

Lấy đầu vào từ stdin, sử dụng lũy ​​thừa ma trận để xác định kết quả chính xác.

el(expm::`%^%`(matrix(!-3:5%in%2^(0:2),3),scan()))

Nếu bạn thích một giải pháp đệ quy, đây là một triển khai đơn giản về mối quan hệ lặp lại được liệt kê trong OEIS, cho 55 byte .

f=function(n)`if`(n<4,(n*n+n)/2,2*f(n-1)+f(n-2)-f(n-3))

1

Excel, 123 byte

Triển khai công thức từ OEIS:

=4*(SIN(4*PI()/7)^2*(1+2*COS(2*PI()/7))^A1+SIN(8*PI()/7)^2*(1+2*COS(4*PI()/7))^A1+SIN(2*PI()/7)^2*(1+2*COS(8*PI()/7))^A1)/7

Như mọi khi, đầu vào A1 , công thức trong bất kỳ ô nào khác.

Đào các danh tính Trig cũ để xem có thể hữu ích không. Bây giờ đầu tôi đau.


0

Tiếng Litva , 79 byte

#N:(((if(< N 4)((/(+ N(* N N))2))((-(+(* 2(f(- N 1)))(f(- N 2)))(f(- N 3)))))))

Triển khai chuỗi số nguyên đệ quy được liệt kê trong OEIS.

Thực hiện dễ đọc và bộ thử nghiệm.

% alkaline.lithp
% run with: ./run.js alkaline.lithp
(
    (def f #N : ((
        (if (< N 4) (
            (/ (+ N (* N N)) 2)
        ) (else (
            (- (+ (* 2 (f (- N 1))) (f (- N 2))) (f (- N 3)))
        )))
    )))

    % Test cases 1 to 4
    (import lists)
    (each (seq 1 4) #I :: ((print (f I))))
)
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.