Jumlah alkana


16

Diberi angka positif n , temukan jumlah alkana dengan atom karbon n , abaikan stereoisomer ; atau setara, jumlah pohon yang tidak berlabel dengan n node, sehingga setiap node memiliki derajat 4 .

Ini adalah urutan OEIS A000602 .

Lihat juga: Parafin - Kode Rosetta

Contoh

Untuk n=7 , jawabannya adalah 9 , karena heptana memiliki sembilan isomer :

  • Heptana : H3C-CH2-CH2-CH2-CH2-CH2-CH3

Heptan

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

2-Methylhexane

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

3-Methylhexane

  • 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

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

3,3-Dimethylpentane

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

3-Ethylpentane

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

2,2,3-Trimethylbutane

Perhatikan bahwa 3-methylhexane dan 2,3-dimethylpentane adalah kiral , tetapi kami mengabaikan stereoisomer di sini.

Uji kasus

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
Saya akan terkesan jika seseorang berhasil menulis solusi dengan Alchemist !
ბიმო

@PeterTaylor Yah Ini dapat menampilkan setiap kali satu digit
l4m2


@ l4m2: Saya menggunakannya sebelumnya untuk tantangan urutan dan sejumlah tantangan, Anda juga dapat menggunakan output unary yang kemungkinan besar lebih mudah. Dan ya, kemungkinan besar TC ( menggunakan bignum ), saya belum membuktikannya secara formal.
ბიმო

@BMO Tampaknya hanya dapat mensimulasikan CM
l4m2

Jawaban:


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=

Mengambil input dari stdin, output ke stdout. Perhatikan bahwa ini mengeksploitasi lisensi untuk tidak menangani input 0untuk menghemat dua byte dengan menguraikan definisi dari CdanD . Demo online

NB ini sangat lambat dan tidak efisien memori. Dengan memangkas array, versi yang jauh lebih cepat diperoleh (3 byte lebih banyak).Demo online .

Pembedahan

SEBUAH000598(x)=1+xZ(S3;SEBUAH000598(x))SEBUAH000678(x)=xZ(S4;SEBUAH000598(x))SEBUAH000599(x)=Z(S2;SEBUAH000598(x)-1)SEBUAH000602(x)=SEBUAH000678(x)-SEBUAH000599(x)+SEBUAH000598(x2)
dimana Z(Sn;f(x)) menunjukkan indeks siklus grup simetris Sn diterapkan pada fungsi f(x).

Saya memanipulasi ini menjadi dekomposisi yang sedikit lebih golf, dan kemudian mencari urutan menengah dan menemukan bahwa mereka juga di OEIS:

SEBUAH000642(x)=Z(S2,SEBUAH000598(x))SEBUAH000631(x)=Z(S2,SEBUAH000642(x))SEBUAH000602(x)=SEBUAH000642(x)+xSEBUAH000642(x2)-xSEBUAH000631(x)

Versi sebelumnya menggunakan kembali blok C(menggabungkan dua polinomial) dari jawaban ini . Saya telah menemukan yang lebih pendek, tetapi saya tidak dapat memperbarui jawaban itu karena itu berasal dari pertanyaan rangkaian.

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

Berasal dari implementasi Java yang disarankan pada 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)

Cobalah online!


5

Alchemist (1547 bytes)

_->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

Demo online .

Catatan: ini sangat lambat. Jika menguji dengan juru bahasa yang mendukung penerapan aturan beberapa kali sekaligus (mis. Yang saya pakai - walaupun pastikan Anda memiliki versi terbaru yang memperbaiki bug di parser) maka Anda bisa mendapatkan percepatan signifikan dengan menambahkan dua aturan:

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

yang sebaris rute melalui aturan yang ada

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

Diseksi sebagian

Pada level tinggi, ini menggunakan pendekatan yang sama dengan jawaban CJam saya.

Model perhitungan Alchemist pada dasarnya adalah mesin register Minsky . Namun, Alchemist dengan sangat baik mengekspos kesetaraan kode dan data, dan dengan memungkinkan banyak token di sisi kiri aturan produksi secara efektif negara tidak dibatasi untuk diwakili oleh satu atom: kita dapat menggunakan tupel atom, dan ini memungkinkan (non-rekursif) subrutin. Ini sangat berguna untuk golf. Satu-satunya hal yang benar-benar kurang adalah macro dan debuggability.

Untuk array saya menggunakan fungsi pairing yang dapat diimplementasikan dengan sangat golf di RM. Array kosong diwakili oleh0, dan hasil dari prepending x ke array SEBUAH adalah (2SEBUAH+1)2x. Ada satu subrutin yang harus dipasangkan: subrutin ini disebut Pdan menambahkan nilai eke b. Ada dua subrutin untuk tidak nadil : tidak cocok buntuk edan b; dan tidak tberpasangan ddengan edan d. Ini memungkinkan saya untuk menyimpan sedikit pengocokan data antar variabel, yang penting: operasi "pemindahan" tunggal

a, b = b, 0

memperluas setidaknya 17 byte:

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

di mana Skeadaan saat ini dan Tadalah keadaan selanjutnya. "Salinan" non-destruktif bahkan lebih mahal, karena harus dilakukan sebagai "perpindahan" dari dan ake bpembantu tmp, diikuti dengan "perpindahan" dari tmpbelakang ke a.

Kebingungan

Saya alias berbagai variabel satu sama lain dan menghilangkan sekitar 60 negara dalam proses golf program, dan banyak dari mereka tidak memiliki nama yang sangat berarti, tetapi untuk sepenuhnya golf saya menulis sebuah minimiser sehingga nama-nama sekarang benar-benar tidak dapat diuraikan. Semoga berhasil, balikkan tekniknya! Berikut adalah minimiser (dalam CJam), yang membuat beberapa asumsi tentang kode tetapi dapat diadaptasi untuk meminimalkan program Alchemist lainnya:

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

Tunggu ... apakah penerjemah itu berfungsi? AFAICT ... Anda memilih aturan acak, lalu mencari tahu berapa kali itu bisa diterapkan. Apakah itu bekerja dengan benar?
ASCII

Hmm. Bagaimana Anda meningkatkan kemampuan debobilitas
ASCII

@ Hanya ASCII, itu akan berhasil tetapi sebenarnya tidak berfungsi. Pertama memilih aturan yang berlaku dan kemudian menentukan berapa kali itu bisa diterapkan. Debuggability itu rumit. Salah satu ide saya untuk proyek disertasi pada hari itu adalah editor RM GUI dengan debugger mundur.
Peter Taylor

tapi ... aturan pelaksanaan perintah mempengaruhi urutan program tidak
ASCII-only

@ Khusus ASCII, ya. Itu sebabnya ada begitu banyak variabel. Hanya sekitar 16 di antaranya adalah data: sisanya adalah negara. Saya menggunakan non-determinisme untuk bermain golf dengan secara efektif memparalelkan operasi "bergerak" independen.
Peter Taylor

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.