수


16

양수 주어 의 수 찾을 알칸 과 탄소 원자를 무시 입체 ; 또는 동등하게 노드 가있는 레이블이없는 트리의 수는 모든 노드가 정도를 갖도록합니다 .엔n n ≤ 4엔엔≤4

이것은 OEIS 시퀀스 A000602 입니다.

참조 : 파라핀-로제타 코드

예

를 들어 엔=7 , 대답은 9 때문에 헵탄 아홉 개 갖는 이성체 :

  • 헵탄 : H삼씨−씨H2−씨H2−씨H2−씨H2−씨H2−씨H삼

헵탄

  • 2- 메틸 헥산 : H삼씨−씨H(씨H삼)−씨H2−씨H2−씨H2−씨H삼

2- 메틸 헥산

  • 3- 메틸 헥산 : H삼씨−씨H2−씨H(씨H삼)−씨H2−씨H2−씨H삼

3- 메틸 헥산

  • 2,2- 디메틸 펜탄 : H3C−C(CH3)2−CH2−CH2−CH3

2,2- 디메틸 펜탄

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

2,3- 디메틸 펜탄

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

2,4- 디메틸 펜탄

  • H3C−CH2−C(CH3)2−CH2−CH삼

3,3- 디메틸 펜탄

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

3- 에틸 펜탄

  • H삼씨−씨(씨H삼)2−씨H(씨H삼)−씨H삼

2,2,3- 트리메틸 부탄

3- 메틸 헥산 및 2,3- 디메틸 펜탄은 키랄 이지만, 여기서는 이성질체를 무시한다.

테스트 사례

엔=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
나는 거라고 감동 누군가와 솔루션을 작성하는 관리하는 경우 연금술사를 !
— ბიმო

@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의 정의를 인라인하여 2 바이트를 절약하기 위해 입력 을 처리하지 않는 라이센스를 이용합니다 . 온라인 데모CD

NB는 매우 느리고 메모리 비효율적입니다. 배열을 트리밍함으로써 훨씬 빠른 버전을 얻을 수 있습니다 (3 바이트 이상). 온라인 데모 .

해부

ㅏ000598(엑스)=1+엑스지(에스삼;ㅏ000598(엑스))ㅏ000678(엑스)=엑스지(에스4;ㅏ000598(엑스))ㅏ000599(엑스)=지(에스2;ㅏ000598(엑스)−1)ㅏ000602(엑스)=ㅏ000678(엑스)−ㅏ000599(엑스)+ㅏ000598(엑스2)
어디 지(에스엔;에프(엑스)) 대칭 그룹의 사이클 인덱스를 나타냅니다. 에스엔 기능에 적용 에프(엑스).

나는 이것을 약간의 골퍼 분해로 조작 한 다음 중간 시퀀스를 찾아서 OEIS에도 있음을 발견했다.

ㅏ000642(엑스)=지(에스2,ㅏ000598(엑스))ㅏ000631(엑스)=지(에스2,ㅏ000642(엑스))ㅏ000602(엑스)=ㅏ000642(엑스)+엑스ㅏ000642(엑스2)−엑스ㅏ000631(엑스)

이전 버전 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

온라인 데모 .

참고 : 이것은 매우 느립니다. 통역사로 테스트하면 어떤 한 번에 여러 번 규칙을 적용 지원 (예를 들어 내 한 - 메이크업은 당신이 파서의 버그를 해결 최신 버전이 있지만) 다음 두 가지 규칙을 추가하여 상당한 속도 향상을 얻을 수 있습니다 :

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

기존 규칙을 통해 경로를 인라인

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

부분 해부

높은 수준에서 이것은 CJam 답변과 동일한 접근 방식을 사용합니다.

연금술사의 계산 모델은 본질적으로 Minsky 레지스터 머신입니다 . 그러나 연금술사는 코드와 데이터의 동등성을 매우 잘 노출 시키며, 생산 규칙의 왼쪽에 많은 토큰을 효과적으로 허용함으로써 상태가 하나의 원자로 표시되는 데 제약을받지 않습니다. 원자의 튜플을 사용할 수 있습니다. (재귀 적이 지 않은) 서브 루틴을 허용합니다. 이것은 골프에 매우 유용합니다. 실제로 부족한 것은 매크로와 디버깅 가능성입니다.

배열의 경우 RM에서 상당히 골프 적으로 구현 할 수있는 페어링 기능을 사용하고 있습니다. 빈 배열은0, 그리고 선행 결과 엑스 배열 ㅏ 이다 (2ㅏ+1)2엑스. 쌍을 이루는 하나의 서브 루틴이 있습니다. 서브 루틴이 호출 P되고 값 앞에 eto가 붙습니다 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에서 "이동"이어 tmp가기 a.

난처

나는 프로그램에 골프를 치는 과정에서 다양한 변수를 서로 구별하고 약 60 개의 상태를 제거했으며, 그중 많은 사람들은 특히 의미있는 이름을 갖지 못했지만 완전히 골프를 치기 위해 미니어처를 썼으므로 이제는 이름을 완전히 해독 할 수 없습니다. 행운을 거꾸로 엔지니어링! 다음은 코드에 대해 몇 가지 가정을하지만 다른 연금술사 프로그램을 최소화하도록 적용될 수있는 최소값 (CJam)입니다.

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

흠. 디버깅 가능성을 향상시키는 방법
— ASCII 전용

@ASCII 전용으로 작동하지만 실제로는 작동하지 않습니다. 먼저 적용 가능한 규칙을 선택한 다음 적용 할 수있는 횟수를 계산합니다. 디버깅 가능성은 까다 롭습니다. 당시의 논문 프로젝트에 대한 나의 아이디어 중 하나는 이전 버전의 디버거가있는 GUI RM 편집기였습니다.
— 피터 테일러

하지만 ... 규칙 실행 순서는 프로그램 순서에 영향을 미치지 않습니다
— ASCII 전용

@ASCII 전용입니다. 그래서 변수가 너무 많은 이유입니다. 그중 약 16 명만이 데이터이며 나머지는 상태입니다. 독립적 인 "이동"작업을 효과적으로 병렬화하여 비결정론을 골프에 사용했습니다.
— 피터 테일러

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.