Số lượng


16

Cho số dương n , tìm số ankann nguyên tử cacbon, bỏ qua các đồng phân lập thể ; hoặc tương đương, số lượng cây không có nhãn với n nút, như vậy mà mỗi nút có độ 4 .

Đây là chuỗi OEIS A000602 .

Xem thêm: Paraffin - Mã Rosetta

Thí dụ

Với n= =7 , câu trả lời là 9 , vì heptan có chín đồng phân :

  • Heptan : H3C-CH2-CH2-CH2-CH2-CH2-CH3

Heptan

  • 2-Metylhexan : H3C-CH(CH3)-CH2-CH2-CH2-CH3

2-Methylhexan

  • 3-Metylhexan : H3C-CH2-CH(CH3)-CH2-CH2-CH3

3-Methylhexan

  • 2,2-Dimethylpentane : H3C-C(CH3)2-CH2-CH2-CH3

2,2-Dimethylpentane

  • 2,3-Dimethylpentane : H3C-CH(CH3)-CH(CH3)-CH2-CH3

2,3-Dimethylpentane

  • 2,4-Dimethylpentane : H3C-CH(CH3)-CH2-CH(CH3)-CH3

2,4-Dimethylpentane

  • 3,3-Dimethylpentane : H3C-CH2-C(CH3)2-CH2-CH3

3,3-Dimethylpentane

  • H3C-CH2-C(CH2CH3)-CH2-CH3

3-etylpentan

  • H3C-C(CH3)2-CH(CH3)-CH3

2,2,3-Trimethylbutane

Lưu ý rằng 3-methylhexane và 2,3-dimethylpentane là chirus , nhưng chúng tôi bỏ qua các đồng phân lập thể ở đây.

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

n= =0

intput	output
=============
0	1
1	1
2	1
3	1
4	2
5	3
6	5
7	9
8	18
9	35
10	75
11	159
12	355
13	802
14	1858
15	4347
16	10359
17	24894
18	60523
19	148284
20	366319

3
Tôi sẽ rất ấn tượng nếu ai đó quản lý để viết một giải pháp với Nhà giả kim !
ბიმო

@PeterTaylor Vâng Nó có thể xuất ra mỗi lần một chữ số
l4m2


@ l4m2: Tôi đã sử dụng nó trước đây cho một thử thách theo trình tự và một số thách thức về số lượng , bạn cũng có thể sử dụng đầu ra đơn nguyên, rất có thể dễ dàng hơn. Và vâng, rất có thể là TC ( sử dụng bignums ), mặc dù tôi chưa chính thức chứng minh điều đó.
ბიმო

@BMO Có vẻ như chỉ có thể mô phỏng CM
l4m2

Câu trả lời:


11

CJam ( 100 98 91 89 83 byte)

1a{_[XX]*\_{_0a*}:E~\{E\_{ff*W%{0@+.+}*}:C~.+2f/}:D~.+C.+3f/1\+}q~:I*DE1$D.-X\+.+I=

Đưa đầu vào từ stdin, đầu ra đến thiết bị xuất chuẩn. Lưu ý rằng điều này khai thác giấy phép để không xử lý đầu vào 0để lưu hai byte bằng cách nội tuyến các định nghĩa của CD. Bản demo trực tuyến

NB điều này rất chậm và không hiệu quả bộ nhớ. Bằng cách cắt các mảng, một phiên bản nhanh hơn nhiều sẽ thu được (thêm 3 byte). Bản demo trực tuyến .

Mổ xẻ

Một000598(x)= =1+xZ(S3;Một000598(x))Một000678(x)= =xZ(S4;Một000598(x))Một000599(x)= =Z(S2;Một000598(x)-1)Một000602(x)= =Một000678(x)-Một000599(x)+Một000598(x2)
Z(Sn;f(x))Snf(x)

Tôi đã điều khiển nó thành một phân tách golf nhẹ hơn, và sau đó tìm kiếm các chuỗi trung gian và phát hiện ra rằng chúng cũng nằm trong OEIS:

Một000642(x)= =Z(S2,Một000598(x))Một000631(x)= =Z(S2,Một000642(x))Một000602(x)= =Một000642(x)+xMột000642(x2)-xMột000631(x)

Các phiên bản trước đó đã sử dụng lại khối C(kết hợp hai đa thức) từ câu trả lời này . Tôi đã tìm thấy một câu ngắn hơn nhiều, nhưng tôi không thể cập nhật câu trả lời vì đó là từ một câu hỏi xâu chuỗi.

1a            e# Starting from [1]...
{             e# Loop I times (see below) to build A000598 by f -> 1 + Z(S_3; f)
  _[XX]*      e#   Copy and double-inflate to f(x^3)
  \_          e#   Flip and copy: stack is f(x^3) f(x) f(x)
  {_0a*}:E~   e#   Assign copy-and-inflate to E and execute
              e#   Stack: f(x^3) f(x) f(x) f(x^2)
  \           e#   Flip
  {           e#   Define and execute block D, which applies f -> Z(S_2;f)
              e#     Stack: ... f
    E\_       e#     Stack: ... f(x^2) f(x) f(x)
    {         e#     Define and execute block C, which convolves two sequences
      ff*     e#       Multiply copies of the second sequence by each term of the first
      W%      e#       Reverse
      {       e#       Fold
        0@+.+ e#         Prepend a 0 to the first and pointwise sum
      }*
    }:C~      e#     Stack: ... f(x^2) f(x)^2
    .+2f/     e#     Pointwise average
  }:D~        e#   Stack: f(x^3) f(x) f(x^2) Z(S_2;f(x))
  .+C         e#   Stack: f(x^3) f(x)*(f(x^2) + Z(S_2;f(x)))
  .+3f/       e#   Add and divide by 3 to finish computing Z(S_3; f)
  1\+         e#   Prepend a 1
}
q~:I          e# Read input to I
*             e# Loop that many times
              e# Stack: I+1 terms of A000598 followed by junk
D             e# Stack: I+1 terms of A000642 followed by junk
E1$D          e# Stack: A000642 A000642(x^2) A000631
.-X\+.+       e# Stack: A000602
I=            e# Extract term I

5

Node.js 11.6.0 ,  229 223 221  218 byte

Bắt nguồn từ việc triển khai Java được đề xuất trên Rosetta Code .

f=(N,L=1,u=[...r=[c=[],1,...Buffer(N)]],k=u[(g=(n,B,S,i,b=B,m,d=0)=>{for(;++b<5;)for(x=c[B]=(d+r[m=n])*(d++?c[B]/d:i),u[S+=n]+=L*2<S&&x,r[S]+=b<4&&x;--m;)g(m,b,S,c[B])})(L,0,1,1),L]-=~(x=r[L++/2])*x>>1)=>L>N?k:f(N,L,u)

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


5

Nhà giả kim (1547 byte)

_->In_NN+2b+al+g
al+g+0NN->ak
al+g+NN->ah
ah+b->ah+m+d+z+a
ah+0b->C+Z+Q
Z+j+z->Z+j+d
Z+j+0z->M+s
M+g+b->M+g+r
M+g+h->M+g+d
M+g+0b+0h+q->J+U
J+o+h->J+o+m
J+o+a->J+o+d
J+o+0h+0a->2C+an+Q
an+j+h->an+j+d
an+j+0h->aC+s
aC+g->e+am+P
am+l+b->am+l+d
am+l+0b->al+s
ak+b->ak+m+d
ak+0b->C+aj+Q
aj+j+h->aj+j+b
aj+j+0h->I+n
I+f+e->I+f+a
I+f+b->I+f+m+d+z
I+f+0e+0b->C+ai+Q
ai+j+h->ai+j+b
ai+j+0h->aB+n
aB+f->H
H+z->H+d
H+a+e->H
H+0z+0e->G+i
G+i+0b->ag
G+i+b->az+b+n
az+f+0b->Out_a
az+f+b->G+b+n
G+f->G+t
ag+e->ag
ag+0e->af+t
af+i+e->af+i+a
af+i+0e->Out_a
Q->F+s
F+g+b->F+g+y
F+g+A->F+g
F+g+0b+0A->av+o
av+o+0m->w
av+o+m->m+ae+A
ae+m->ae+b
ae+0m->u+n
u+f+b->u+f+m
u+f+e->u+f+E
u+f+A->u+f+k+c
u+f+0b+0e+0A->ad
ad+c->ad+A
ad+0c->ac
ac+y->ac+d+c
ac+0y->ab
ab+c->ab+y
ab+0c->V+l
V+l+0k->x
V+l+k->aa+t
aa+i+0e->W
aa+i+e->Y
Y+E->Y+D+c
Y+0E->X
X+c->X+E
X+0c->aa+i
W+D->W+e
W+0D->V+P
x+E->x
x+d->x
x+b->x+k
x+0E+0d+0b->aw
aw+h->aw+d
aw+0h->aE+s
aE+g->p
p+b->p+2r
p+k->p+d
p+B->p
p+q->p
p+0b+0k+0B+0q->r+q+av+U
w+h->w+d
w+y->w+r
w+C->w+B+q
w+0h+0y+0C->aD+U
aD+o->j
U->au+s
au+g+b->au+g+d
au+g+0b->v
v+d->d+aA+t
aA+i+k->R
aA+i+0k->at
at+B->at+k+c
at+0B->L
L+c->L+B
L+r->L+b
L+0c+0r->as+n
as+f+b->as+f+r
as+f+0b->R
R+0e->K
R+e+q->ar+D+c
ar+e+q->ar+c
ar+0q->aq
aq+c->aq+q
aq+0c->R
K+D->K+e
K+h->K+b
K+0D+0h->ap+P
ap+l+b->ap+l+h
ap+l+0b->v
v+0d+k->v
v+0d+r->v
v+0d+0k+0r->o
s+0d->g
s+d->d+ao+t
ao+i->ao+P
ao+l->s
P->O+c
O+b->2c+O
O+0b->N
N+c->b+N
N+0c+e->O
N+0c+0e->l
n+b->n+c
n+0b->T
T+c->ay
T+0c->e+n
ay+c->b+T
ay+0c->f
t+d->t+c
t+0d->S
S+c->ax
S+0c->e+t
ax+c->d+S
ax+0c->i

Bản demo trực tuyến .

Lưu ý: điều này khá chậm. Nếu thử nghiệm với trình thông dịch hỗ trợ áp dụng quy tắc nhiều lần cùng một lúc (ví dụ: phiên bản của tôi - mặc dù đảm bảo rằng bạn có phiên bản mới nhất sửa lỗi trong trình phân tích cú pháp) thì bạn có thể tăng tốc đáng kể bằng cách thêm hai quy tắc:

T+2c->b+T
S+2c->d+S

tuyến tính nào thông qua các quy tắc hiện có

T+c->ay
ay+c->b+T
S+c->ax
ax+c->d+S

Bóc tách một phần

Ở cấp độ cao, điều này sử dụng cách tiếp cận tương tự như câu trả lời của tôi.

Mô hình tính toán của Nhà giả kim thực chất là máy đăng ký Minsky . Tuy nhiên, Nhà giả kim rất tiết lộ sự tương đương của mã và dữ liệu và bằng cách cho phép nhiều mã thông báo ở phía bên trái của quy tắc sản xuất một cách hiệu quả, trạng thái không bị giới hạn bởi một nguyên tử: chúng ta có thể sử dụng một bộ nguyên tử và điều này cho phép (không đệ quy) chương trình con. Điều này rất hữu ích cho golf. Điều duy nhất nó thực sự thiếu là macro và khả năng sửa lỗi.

0xMột(2Một+1)2xPebnbebtded

a, b = b, 0

mở rộng tối thiểu 17 byte:

S+a->S+b
S+0a->T

nơi Slà trạng thái hiện tại và Tlà trạng thái tiếp theo. Một "bản sao" không phá hủy thậm chí còn đắt hơn, bởi vì nó phải được thực hiện như một "di chuyển" từ ađến bvà một phụ trợ tmp, tiếp theo là "di chuyển" từ tmptrở lại a.

Obfuscation

Tôi đã đặt bí danh cho nhiều biến số khác nhau và loại bỏ khoảng 60 trạng thái trong quá trình chơi golf và nhiều trong số chúng không có tên đặc biệt nào, nhưng để đánh golf hoàn toàn, tôi đã viết một bộ giảm thiểu để các tên hiện không thể giải mã được. Chúc may mắn đảo ngược kỹ thuật đó! Đây là công cụ thu nhỏ (trong CJam), đưa ra một vài giả định về mã nhưng có thể được điều chỉnh để giảm thiểu các chương trình Nhà giả kim khác:

e# Obfuscate / minimise Alchemist program

e# Tokenise
qN%[SNS]e_*S%

e# Get token frequencies for substitution purposes, special-casing the I/O ones
_["+" "0" "2" "->" "_" N "In_n" "n" "Out_tmp2" "tmp2"]-
$e`$W%1f=

e# Empirically we want a two-char input for n and a one-char one for tmp2
["In_n" "Out_tmp2" "n" "tmp2"]\+
["In_NN" "Out_a" "NN"] "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"1/:A+ A2m*:e_"NN"a-+
1$,<

er
_s,p

Đợi ... phiên dịch đó có hoạt động không? AFAICT ... bạn chọn một quy tắc ngẫu nhiên, sau đó tính xem có thể áp dụng bao nhiêu lần. Điều đó thậm chí hoạt động chính xác?
ASCII - chỉ

Hừm. Bạn sẽ cải thiện khả năng sửa lỗi như thế nào
chỉ có ASCII vào

Chỉ có ASCII, nó sẽ hoạt động nhưng thực tế nó không như vậy. Đầu tiên, nó chọn một quy tắc có thể áp dụng và sau đó tìm ra số lần áp dụng. Gỡ lỗi là khó khăn. Một trong những ý tưởng của tôi cho một dự án luận án ngày trước là một trình soạn thảo GUI RM với trình gỡ lỗi ngược.
Peter Taylor

nhưng ... thứ tự thực thi quy tắc ảnh hưởng đến thứ tự chương trình thì không
ASCII - chỉ

@ Chỉ ASCII, có. Đó là lý do tại sao có rất nhiều biến số. Chỉ có khoảng 16 trong số đó là dữ liệu: phần còn lại là trạng thái. Tôi đã sử dụng tính không xác định để chơi gôn bằng cách song song hiệu quả các hoạt động "di chuyển" độc lập.
Peter Taylor

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.