จำนวนของอัลคาไลน์


16

ได้รับเป็นจำนวนบวกn , หาจำนวนของแอลเคนที่มีnอะตอมคาร์บอนละเว้นstereoisomers ; หรือเท่าจำนวนของต้นไม้ที่ไม่มีป้ายกำกับด้วยnโหนดดังที่ทุกโหนดมีปริญญา4 4

นี่คือ OEIS ลำดับA000602

ดูเพิ่มเติม: พาราฟิน - รหัสโรเซตต้า

ตัวอย่าง

สำหรับn=7คำตอบคือ9เนื่องจากheptaneมีisomersเก้าตัว:

  • Heptane : H3-H2-H2-H2-H2-H2-H3

heptane

  • 2-Methylhexane : H3-H(H3)-H2-H2-H2-H3

2 Methylhexane

  • 3-Methylhexane : H3-H2-H(H3)-H2-H2-H3

3 Methylhexane

  • 2,2-Dimethylpentane : H3-(H3)2-H2-H2-H3

2,2-Dimethylpentane

  • 2,3-Dimethylpentane : H3-H(H3)-H(H3)-H2-H3

2,3-Dimethylpentane

  • 2,4-Dimethylpentane : H3-H(H3)-H2-H(H3)-H3

2,4-Dimethylpentane

  • H3-H2-(H3)2-H2-H3

3,3-Dimethylpentane

  • H3-H2-(H2H3)-H2-H3

3 Ethylpentane

  • H3-(H3)2-H(H3)-H3

2,2,3-Trimethylbutane

โปรดทราบว่า 3-methylhexane และ 2,3-dimethylpentane เป็นchiralแต่เราไม่สนใจสเตอริโอไอโซเมอร์ที่นี่

กรณีทดสอบ

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
ฉันจะประทับใจถ้ามีคนจัดการเขียนวิธีแก้ปัญหาด้วยAlchemist !
ბიმო

@PeterTaylor Well มันสามารถแสดงผลได้ทุกครั้งที่เป็นตัวเลข
l4m2


@ l4m2: ฉันเคยใช้มันมาก่อนเพื่อความท้าทายตามลำดับและความท้าทายจำนวนหนึ่งคุณยังสามารถใช้เอาต์พุตแบบยูนารีซึ่งน่าจะง่ายกว่ามากที่สุด และใช่เป็นไปได้มากว่า TC ( ใช้ bignums ) ฉันยังไม่ได้พิสูจน์อย่างเป็นทางการ
ბიმო

@BMO ดูเหมือนว่าจะสามารถจำลอง CM
l4m2

คำตอบ:


11

CJam ( 100 98 91 89 83 ไบต์)

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

รับอินพุตจาก stdin, เอาต์พุตไปยัง stdout ทราบว่านี้ใช้ประโยชน์จากใบอนุญาตที่จะไม่ป้อนข้อมูลการจัดการ0เพื่อประหยัดไบต์ที่สองโดย inlining คำจำกัดความของและC การสาธิตออนไลน์D

NB นี้ช้ามากและไม่มีประสิทธิภาพหน่วยความจำ เมื่อตัดแต่งอาร์เรย์จะมีเวอร์ชั่นที่เร็วกว่า (มากกว่า 3 ไบต์) สาธิตออนไลน์

การผ่า

A000598(x)=1+xZ(S3;A000598(x))A000678(x)=xZ(S4;A000598(x))A000599(x)=Z(S2;A000598(x)-1)A000602(x)=A000678(x)-A000599(x)+A000598(x2)
Z(Sn;(x))Sn(x)

ฉันจัดการสิ่งนี้เป็นการสลายตัวของนักกอล์ฟเล็กน้อยและจากนั้นค้นหาลำดับกลางและพบว่าพวกมันอยู่ใน OEIS ด้วย:

A000642(x)=Z(S2,A000598(x))A000631(x)=Z(S2,A000642(x))A000602(x)=A000642(x)+xA000642(x2)-xA000631(x)

เวอร์ชันก่อนหน้านี้นำบล็อกที่ใช้ซ้ำอีกครั้งC(ทำให้เกิดชื่อพหุนามสองคำ) จากคำตอบนี้ ฉันพบคำตอบที่สั้นกว่ามาก แต่ฉันไม่สามารถอัปเดตคำตอบนั้นได้เพราะมาจากคำถามที่ผูกมัด

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

นักเล่นแร่แปรธาตุ (1547 ไบต์)

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

สาธิตออนไลน์

หมายเหตุ: ค่อนข้างช้า หากการทดสอบกับล่ามที่รองรับการใช้กฎหลายครั้งพร้อมกัน (เช่นของฉัน - แม้ว่าต้องแน่ใจว่าคุณมีเวอร์ชันล่าสุดที่แก้ไขข้อผิดพลาดใน parser) จากนั้นคุณสามารถเพิ่มความเร็วได้อย่างมีนัยสำคัญโดยเพิ่มกฎสองข้อ:

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

ซึ่งอินไลน์เส้นทางผ่านกฎที่มีอยู่

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

การผ่าบางส่วน

ในระดับสูงวิธีนี้ใช้วิธีเดียวกับคำตอบ CJam ของฉัน

รูปแบบการคำนวณของนักเล่นแร่แปรธาตุเป็นหลักเครื่องทะเบียนมินสกี อย่างไรก็ตามนักเล่นแร่แปรธาตุเผยให้เห็นความเท่าเทียมกันของรหัสและข้อมูลอย่างมากและด้วยการอนุญาตให้โทเค็นจำนวนมากอยู่ทางด้านซ้ายมือของกฎการผลิตอย่างมีประสิทธิภาพรัฐไม่ได้ถูก จำกัด ให้เป็นตัวแทนของอะตอม: เราสามารถใช้อะตอมของอะตอม อนุญาตรูทีนย่อย (ไม่ใช่แบบเรียกซ้ำ) มันมีประโยชน์มากสำหรับการเล่นกอล์ฟ สิ่งเดียวที่ขาดจริงๆคือมาโครและการดีบัก

สำหรับอาร์เรย์ฉันใช้ฟังก์ชั่นการจับคู่ซึ่งสามารถนำไปใช้งานได้ค่อนข้างกอล์ฟใน RM อาร์เรย์ที่ว่างเปล่าจะถูกแทนด้วย0และผลลัพธ์ของการเตรียมตัว x ไปยังอาร์เรย์ A คือ (2A+1)2x. มีอยู่คนหนึ่ง subroutine คู่คือ: ย่อยที่เรียกว่าPและมัน prepends ค่าของการe bมีสองซับรูทีนที่จะเลิกจับคู่คือ: nunpairs bไปeและb; และtunpairs dไปและe dสิ่งนี้ทำให้ฉันสามารถบันทึกข้อมูลการสับระหว่างตัวแปรซึ่งมีความสำคัญ: การดำเนินการ "ย้าย" เพียงครั้งเดียว

a, b = b, 0

ขยายเป็นอย่างน้อย 17 ไบต์:

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

โดยที่Sเป็นสถานะปัจจุบันและTเป็นสถานะถัดไป แบบไม่ทำลาย "คัดลอก" แม้จะมีราคาแพงกว่าเพราะมันมีการกระทำเป็น "ย้าย" จากaไปbและผู้ช่วยtmpตามด้วย "ย้าย" จากกลับไปtmpa

obfuscation

ฉันใช้นามแฝงตัวแปรต่าง ๆ ให้กันและกำจัดประมาณ 60 รัฐในกระบวนการของการเล่นกอล์ฟและหลาย ๆ คนไม่มีชื่อที่มีความหมายเป็นพิเศษอยู่ดี ขอให้โชคดีกลับวิศวกรรมมัน! นี่คือตัวย่อขนาดเล็ก (ใน CJam) ซึ่งสร้างสมมติฐานบางอย่างเกี่ยวกับรหัส แต่สามารถปรับให้ลดโปรแกรม Alchemist อื่น ๆ ได้:

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

รอสักครู่ ... ล่ามนั่นทำงานได้ไหม AFAICT ... คุณเลือกกฎสุ่มจากนั้นหาจำนวนครั้งที่สามารถใช้ได้ มันทำงานได้อย่างถูกต้องหรือไม่?
ASCII เท่านั้นเท่านั้น

อืมมม คุณปรับปรุงการแก้จุดบกพร่องได้อย่างไร
ASCII เท่านั้น

@ ASCII เท่านั้นที่ใช้งานได้ แต่ไม่ใช่สิ่งที่ทำ มันเลือกกฎที่ใช้งานได้ก่อนแล้วจึงคำนวณว่าสามารถใช้ได้กี่ครั้ง การแก้จุดบกพร่องนั้นยุ่งยาก หนึ่งในความคิดของฉันสำหรับโครงการปริญญานิพนธ์ย้อนกลับไปในวันนี้คือตัวแก้ไข GUI RM พร้อมตัวดีบักแบบย้อนหลัง
Peter Taylor

แต่ ... ลำดับการดำเนินการตามกฎมีผลกับคำสั่งของโปรแกรมไม่ใช่
ASCII-only

@ ASCII เท่านั้นใช่ นั่นเป็นเหตุผลที่มีตัวแปรมากมาย มีเพียงประมาณ 16 คนเท่านั้นที่เป็นข้อมูล: ส่วนที่เหลือเป็นสถานะ ฉันใช้การไม่มุ่งมั่นกับการเล่นกอล์ฟโดยการทำงานแบบ "อิสระ" แบบขนานอย่างมีประสิทธิภาพ
ปีเตอร์เทย์เลอร์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.