karbonlu alkan sayısı


16

Pozitif bir sayı verilen sayısını bulmak alkan ile karbon atomu, göz ardı stereoizomerler ; veya eşdeğer olan etiketlenmemiş ağaç sayısı düğümleri, her düğüm derecesi sahip olacak şekilde .nn n 4nn4

Bu OEIS dizisi A000602'dir .

Ayrıca bakınız: Parafinler - Rosetta Kodu

Misal

İçin , cevap için, heptan dokuz sahip izomerleri :n=79

  • Heptan :'H3C-C'H2-C'H2-C'H2-C'H2-C'H2-C'H3

heptan

  • 2-Metilheksan :'H3C-C'H(C'H3)-C'H2-C'H2-C'H2-C'H3

2-metilheksan

  • 3-Metilheksan :'H3C-C'H2-C'H(C'H3)-C'H2-C'H2-C'H3

3-metilheksan

  • 2,2-Dimetilpentan :'H3C-C(C'H3)2-C'H2-C'H2-C'H3

2,2-dimetilpentan

  • 2,3-Dimetilpentan : 'H3C-C'H(C'H3)-C'H(C'H3)-C'H2-C'H3

2,3-dimetilpentan

  • 2,4-Dimetilpentan : 'H3C-C'H(C'H3)-C'H2-C'H(C'H3)-C'H3

2,4-dimetilpentan

  • 3,3-Dimetilpentan : 'H3C-C'H2-C(C'H3)2-C'H2-C'H3

3,3-dimetilpentan

  • 3-Etilpentan : 'H3C-C'H2-C(C'H2C'H3)-C'H2-C'H3

3-Ethylpentane

  • 2,2,3-Trimetilbutan : 'H3C-C(C'H3)2-C'H(C'H3)-C'H3

2,2,3-Trimethylbutane

3-Metilheksan ve 2,3-dimetilpentanın kiral olduğuna dikkat edin , ancak burada stereoizomerleri göz ardı ediyoruz.

Test senaryoları

kasasını kullanmanıza gerek yoktur .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
Ben olurdum etkiledi birisi ile bir çözüm yazmaya başarırsa Simyacı !
1919

@PeterTaylor Well Her basamağı çıktı alabilir
l4m2


@ l4m2: Daha önce bir dizi zorluğu ve bazı sayı zorlukları için kullandım, ayrıca büyük olasılıkla daha kolay olan tekli çıktı da kullanabilirsiniz. Ve evet, büyük olasılıkla TC ( bignum kullanıyor ), bunu resmi olarak kanıtlamadım.
ბიმო

@BMO CM simüle edebilecek gibi görünüyor
l4m2

Yanıtlar:


11

CJam ( 100 98 91 89 83 bayt)

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

Stdin'den girdi alır, stdout'a çıktılar. Bunun 0, Cve tanımlarını satır içine alarak iki bayt kaydetmek için girdiyi işlememe lisansından yararlandığını unutmayın D. Çevrimiçi demo

Not: Bu çok yavaş ve bellek yetersiz. Dizileri kırparak çok daha hızlı bir sürüm elde edilir (3 bayt daha fazla). Çevrimiçi demo .

teşrih

bir000598(x)=1+xZ(S3;bir000598(x))bir000678(x)=xZ(S4;bir000598(x))bir000599(x)=Z(S2;bir000598(x)-1)bir000602(x)=bir000678(x)-bir000599(x)+bir000598(x2)
Z(Sn;f(x))Snf(x)

Bunu biraz daha golfçü bir ayrışmaya dönüştürdüm ve daha sonra ara dizilere baktım ve onların da OEIS'te olduğunu keşfettim:

bir000642(x)=Z(S2,bir000598(x))bir000631(x)=Z(S2,bir000642(x))bir000602(x)=bir000642(x)+xbir000642(x2)-xbir000631(x)

Önceki sürümler bu cevabıC kullanarak bloğu tekrar kullandı (iki polinomu döndürün) . Çok daha kısa bir tane buldum, ama bu cevabı güncelleyemiyorum çünkü bu zincirleme bir sorudan kaynaklanıyor.

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 bayt

Rosetta Kodunda önerilen Java uygulamasından türetilmiştir .

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)

Çevrimiçi deneyin!


5

Simyacı (1547 bayt)

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

Çevrimiçi demo .

Not: Bu oldukça yavaş. Bir kuralı aynı anda birden çok kez uygulamayı destekleyen bir tercümanla test yapıyorsanız benimki - ayrıştırıcıdaki bir hatayı düzelten en son sürüme sahip olduğunuzdan emin olun), o zaman iki kural ekleyerek önemli bir hız elde edebilirsiniz:

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

mevcut kurallar üzerinden bir rota çizer

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

Kısmi diseksiyon

Yüksek düzeyde, bu benim CJam cevabımla aynı yaklaşımı kullanır.

Simyacı'nın hesaplama modeli aslında Minsky kayıt makinesidir . Bununla birlikte, Simyacı kod ve verilerin denkliğini çok güzel bir şekilde ortaya koyar ve üretim kuralının sol tarafında birçok jetona etkili bir şekilde izin vererek, durumun bir atom tarafından temsil edilmesi kısıtlanmaz: bir grup atom kullanabiliriz ve bu (özyinelemesiz) altprogramlara izin verir. Bu golf için çok kullanışlıdır. Gerçekten eksik olan tek şey makrolar ve hata ayıklama.

0xbir(2bir+1)2xPebnbebtded

a, b = b, 0

en az 17 bayta genişler:

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

nerede Smevcut durumu ve Tgelecek durumudur. O bir "hareket" olarak yapılmalıdır çünkü tahribatsız "copy", daha pahalıdır aiçin bve bir yardımcı tmpbir "hareket", ardından tmparkasınaa .

Gizleme

Çeşitli değişkenleri birbirine taktım ve programın golf sürecinde yaklaşık 60 eyaleti ortadan kaldırdım ve birçoğunun zaten özellikle anlamlı isimleri yoktu, ancak tamamen golf yapmak için bir minimiser yazdım, böylece isimler şimdi tamamen anlaşılmaz. İyi şanslar tersine mühendislik! Kod hakkında birkaç varsayım yapan ancak diğer Simyacı programları en aza indirgemek için uyarlanabilen minimizer (CJam'da):

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

Bekle ... bu tercüman işe yarıyor mu? AFAICT ... rastgele bir kural seçersiniz, ardından bunun kaç kez uygulanabileceğini anlarsınız . Bu doğru çalışıyor mu?
Sadece ASCII

Hmm. Hata ayıklamayı nasıl geliştirirsiniz
yalnızca ASCII-sadece

@ Sadece ASCII, bu işe yarayacaktı ama aslında yaptığı gibi değil. Önce uygulanabilir bir kural seçer ve ardından kaç kez uygulanabileceğini belirler. Hata ayıklama zor. O günkü bir tez projesi için fikirlerimden biri geriye doğru hata ayıklayıcıya sahip bir GUI RM editörüydü.
Peter Taylor

ancak ... kural yürütme sırası program sırasını etkilemez
ASCII-sadece

@ Sadece ASCII, evet. Bu yüzden çok fazla değişken var. Bunlardan sadece 16 tanesi veri: gerisi devlet. Bağımsız "hareket" operasyonlarını etkin bir şekilde paralelleştirerek golf için determinizmi kullanmadım.
Peter Taylor

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.