与えられた長さの直鎖アルキネの数


28

直鎖alk * neは、単結合(アルカン)、二重結合(アルケン)、三重結合(アルキン)で接続された一連の炭素原子として定義されます(暗黙の水素が使用されます)。炭素原子は4つの結合しか形成できません。炭素原子に4つを超える結合を強制することはできません。直鎖alk * neは、その炭素-炭素結合のリストとして表すことができます。

これらは、有効な直鎖アルケンのいくつかの例です:

[]       CH4              Methane
[1]      CH3-CH3          Ethane
[2]      CH2=CH2          Ethene
[3]      CH≡CH            Ethyne
[1,1]    CH3-CH2-CH3      Propane
[1,2]    CH3-CH=CH2       Propene
[1,3]    CH3-C≡CH         Propyne
[2,1]    CH2=CH-CH3       Propene
[2,2]    CH2=C=CH2        Allene (Propadiene)
[3,1]    CH≡C-CH3         Propyne 
[1,1,1]  CH3-CH2-CH2-CH3  Butane
...

これらはそうではありませんが、少なくとも1つの炭素原子には4つ以上の結合があるためです。

[2,3]
[3,2]
[3,3]
...

あなたの仕事は、正の整数が与えられると、正確に炭素原子の長さの有効な直鎖アルケンのn出力/返すプログラム/関数を作成することです。これはOEIS A077998です。n

仕様/明確化

  • 1返すことで正しく処理する必要があり1ます。
  • Alk * nesは「のような」で[1,2]あり[2,1]、別個と見なされます。
  • 出力は、指定され長さのすべての可能なalk * nesのリストの長さです。
  • 0を正しく処理する必要はありません。

テストケース:

1 => 1
2 => 3
3 => 6
4 => 14

これはコードゴルフであるため、バイト数が最も少なくなります


明確にするために、連続するすべてのペアが合計される場合、チェーンは有効です<=4
マルティセン16

一定。@Maltysen:はい。
ザカリー16

4
すべてのOEISシーケンスがあるのはなぜですか?:P
HyperNeutrino 16

2
@ZacharyT、炭素原子がゼロの炭化水素が正確に1つあり、水素原子もゼロの炭化水素です。これは、0ではなく1が先頭にあるPascalの三角形、または文字通り何百もの他の組み合わせシーケンスの場合とまったく同じ引数です。
ピーターテイラー

1
@Emigna、それは間違ったシーケンスがリンクされたためです。訂正します。
ピーターテイラー

回答:


7

オアシス9 7バイト

xcd-+3V

オンラインでお試しください!

説明

これは、OEISの再帰関係を使用します。

a(n)= 2 * a(n-1)+ a(n-2)-a(n-3)

x    Multiply a(n-1) by 2: gives 2*a(n-1)
c    Push a(n-2)
d    Push a(n-3)
-    Subtract: gives a(n-2) - a(n-3)
+    Add: gives 2*a(n-1) + a(n-2) - a(n-3)
3    Push 3: initial value for a(n-1)
V    Push 1, 1: initial values for a(n-2), a(n-3)

1
初期値の素晴らしい使用!今回はあなたが勝ちます;)
エミグナ

ええ、おそらくこれを打つ方法はありません。
ザカリー16

4
@ZacharyTプログラムを作成する方法を誰かが理解できる場合のみxkcd
hBy2Py 16

4
hBy2Pyまあ、@ xkcd-+311作品、ので、k現在は何もしません...
ルイスMendo

10

MATL、10バイト

7K5vBiY^1)

オンラインでお試しください!

説明

これは、OEISにある特性評価を使用します

a(n)は、3 x 3行列[1、1、1;のn乗の左上エントリです。1、0、0; 1、0、1]

7    % Push 7
K    % Push 4
5    % Push 5
v    % Concatenate all numbers into a column vector: [7; 4; 5]
B    % Convert to binary: gives 3×3 matrix [1, 1, 1; 1, 0, 0; 1, 0, 1]
i    % Input n
Y^   % Matrix power
1)   % Take the first element of the resulting matrix, i.e. its upper-left corner.
     % Implicitly display

6

オアシス9 8バイト

Adnanのおかげで1バイト節約

xc+d-63T

オンラインでお試しください!

説明

a(0) = 0
a(1) = 1
a(2) = 3
a(3) = 6

a(n) = xc+d-

x         # calculate 2*a(n-1)
 c        # calculate a(n-2)
  +       # add: 2*a(n-1) + a(n-2)
   d      # calculate a(n-3)
    -     # subtract: 2*a(n-1) + a(n-2) - a(n-3)

1
いいね!また、:)のx略です2*
アドナン

1
ビート屋 :-P(私はOASISの回答がすでにあるのを見ていませんでした)
ルイスメンドー

@Adnan出力シーケンスインデックスを1シフトすることをOasisに伝える方法はありますか?つまり、0ここでイニシャルを使用する代わりに、入力引数から1を引く
ルイスメンドー

1
@LuisMendo Ah、まだ実装されていません。しかし、次のリリースでは良いアイデアです:)。
アドナン

将来の参考のために、これは現在実装されています
ルイスメンドー

4

ゼリー、10バイト

745DBæ*µḢḢ

オンラインでお試しください!

ルイスメンドーのアルゴリズムを使用します

説明

745DBæ*µḢḢ    Main link. Argument: n
745D          Get the digits of 745
    B         Convert each to binary
     æ*       Matrix power
        ḢḢ    First element of first row

ゼリー、15バイト

3Rṗ’µ+2\<5PµÐfL

オンラインでお試しください!

総当たり攻撃を使用します。

説明

3Rṗ’µ+2\<5PµÐfL    Main link. Argument: n
3R                 Start with [1, 2, 3]
   ’               Take the (n-1)'th
  ṗ                Cartesian power
            Ðf     Filter on:
     +2\             Sums of overlapping pairs
        <5           1 for sums < 5, 0 otherwise
          P          Product: 1 if all pairs < 5
              L    Length

4

MATL、14バイト

q3:Z^TTZ+!5<As

オンラインでお試しください!

説明

これ[1 2 3]により、原子数から1を引いた「累乗」のデカルトの累乗が生成されます。次に、畳み込みを使用して、各デカルトタプルの合計が2を超えないことを確認し4ます。

q    % Take number of atoms n implicitly
3:   % Push [1 2 3]
Z^   % Cartesian power. Gives a matrix with each (n-1)-tuple on a row
TT   % Push [1 1]
Z+   % 2D convolution. For each tuple this gives the sum of contiguous numbers
5<   % For each entry, gives true if less than 5
!    % Transpose
A    % True if all elements of each column are true. Gives a row vector
s    % Sum of true results. Implicitly display

3

Mathematica、48バイト

MatrixPower[{{1,1,1},{1,0,0},{1,0,1}},#][[1,1]]&

ルイスMendoが指摘し、これはあるA006356 OEISインチ 私の最初の試みは次のとおりです。

Count[Length@Split[#,+##<5&]&/@Tuples[{1,2,3},#-1],0|1]&

入力のn場合、Tuples[{1,2,3},n-1]は、炭素原子の単結合、二重結合、または三重結合のすべての可能なシーケンスを表す(n-1)要素のすべてのタプルのリストです。は、引数の合計がより小さいかどうかを返す純粋な関数であるため、リストを、ペアごとの合計がより小さい連続した要素で構成されるサブリストに分割します。有効ALK * NEを説明する長さを有するこのリストと等価である(場合に)、または、私はちょうど数タプルここでそのリストの一致の長さ。{1,2,3}n+##<5&5Split[#,+##<5&]&50n=11Count(n-1)0|1

Count[Fold[If[+##>4,4,#2]&]/@Tuples[{1,2,3},#-1],Except@4]&

If[+##>4,4,#2]&戻り4引数の合計がより大きければ4、そうでなければ二番目の引数を返します。この関数で入力のFold[If[+##>4,4,#2]&]Foldを行います。したがってCount(n-1)この演算子を適用しても与えられない-タプルの数をここに示し4ます。2番目の引数が空のリストでn=1ある場合、カバーされてFoldいるケースは未評価のまま{}です。


1
これは機能しますか?(調整でOEISから取り込んだ種類)LinearRecurrence[{2,1,-1},{1,3,6},#][[#]]&
ザカリー16

このサイトが好きな理由の一部は、Mathematicaが提供するすべての機能を学ぶことです:)
ngenisis

することでthis site、あなたはOEISやPPCGを意味していますか?
ザカリー16

PPCG。私はたくさんのMathematicaを人々の提案から選んだ。
ゲニシス

3

Python、51バイト

f=lambda n:n<4and(n*n+n)/2or 2*f(n-1)+f(n-2)-f(n-3)

これは、再帰関係の簡単な実装です。3バイトのTim Pederickに感謝します。出力は、Python 3ではfloat、Python 2では整数です。

オンラインでお試しください!


(n*n+n)/2はより短い[1,3,6][n-1]。また、Python 3 使用していて、最終的に浮動小数点出力が気に入らない場合(n*n+n)//2は、さらに短くなります。
ティムペデリック16


2

ルビー、62バイト

->n{c=0
(10**n/10).times{|i|"#{i}#{i*11}"=~/[3-9]/||c+=1}
c}

恐ろしく非効率的なベース10のブルートフォースアプローチ。追加のバイトについては、基数5に改善できます。

各桁が結合を表す番号が生成されます(n-1桁)。0結合順序1、2結合順序3を表します。2桁以上は無効です。

これに11を掛けて、隣接する数字のペアを合計します。繰り返しますが、3を超える数字は無効です。

2つの数値を文字列に結合し、正規表現を実行して無効な数字を検索します。何も見つからない場合、カウンターをインクリメントします。

テストプログラムで

f=->n{c=0
(10**n/10).times{|i|"#{i}#{i*11}"=~/[3-9]/||c+=1}
c}

p f[gets.to_i]

2

Ruby、51バイト

->n{a=[1,1,3]
n.times{a<<2*a[-1]+a[-2]-a[-3]}
a[n]}

OEIS A006356に基づく再発関係に基づきます。

シーケンスの要素0、1、および2の配列で始まります。これらの要素はそれぞれ1(私が計算したとおりに動作するように)、1、3です。

nシーケンスに要素を繰り返し追加し、elementを返しますn。常に実際に必要な要素よりも2要素多く計算しますが、それでも線形時間であり、以前の回答よりもはるかに効率的です。

テストプログラムで

f=->n{a=[1,1,3]
n.times{a<<2*a[-1]+a[-2]-a[-3]}
a[n]}

p f[gets.to_i]

2

Mathematica 42 40バイト

バイトカウントは、CP-1252(Windowsインストールのデフォルト)のような互換性のあるシングルバイトエンコーディングを想定しています。

±0=±1=1;±2=3;±n_:=±(n-1)2+±(n-2)-±(n-3);

これは、単項演算子としてOEISで指定された繰り返しを単に実装します。


2

CJam(19バイト)

{2,{__-2=+1b+}@*W=}

オンラインテストスイート。これは、スタック上の1つのアイテムを取得し、スタック上の1つのアイテムを残す匿名ブロック(関数)です。テストスイートには、a(0) = 1

使用される再発は、関連するOEISシーケンスA006356の観察に基づいています

a(n)= a(n-1)+ 2 * a(n-2)+ a(n-3)+と同等の(1、2、1、1、1、1、...)のINVERT変換に等しいa(n-4)+ ... + 1. a(6)= 70 =(31 + 2 * 14 + 6 + 3 + 1 + 1)。-ゲイリーW.アダムソン、2009年4月27日

しかし、適切なオフセットを使用すると、で+ 1カバーされるようにファイナルの必要がなくなりa(0)ます

解剖

{         e# Define a block
  2,      e#   Take starting sequence [0 1] (beginning at index -1 for golfiness)
  {       e#   Loop...
    _     e#     Copy sequence so far
    _-2=+ e#     Append an extra copy of a(n-2)
    1b    e#     Sum
    +     e#     Append
  }@*     e#   ...n times
  W=      e#   Take the final value from the sequence
}

2

Brain-Flak、56バイト

OEISページの最初のコメントで詳述されているアルゴリズムを使用します。

オンラインでお試しください!

({}[()]<(((())))>){({}[()]<{({}<>({}))<>}<>>)}{}({}<>{})

説明

シーケンスは次のように定義できます。

For u(k), v(k), and w(k) such that
u(1) = v(1) = w(1) = 1
u(k+1) = u(k) + v(k) + w(k)
v(k+1) = u(k) + v(k)
w(k+1) = u(k)
u(k) is the number of straight-chain alk*nes with length k

プログラム1はこの繰り返しを開始して繰り返し計算しますu(k)

注釈付きコード(実際の注釈)

# Setup: decrement the input by one and push three 1's to the stack under it
({}[()]<(((())))>)

# Calculation:
{                          }           # While the input is not zero (main loop)
 ({}[()]                  )            # Pop the counter decrement it by one and push it
        <                >             # Before the counter gets pushed back to the stack...
         {            }                # Loop while the top of the stack is not zero (subloop)
          (        )                   # Push...
           {}                          # The top of the stack (popped)...
             <>                        # to the other stack...
               ({})                    # plus the top of the other stack (peeked)
                    <>                 # Switch back to the first stack.
                       <>              # Switch to the other stack
                            {}         # Pop the input (now zero)
                              (      ) # Push...
                               {}      # The top of the stack (u(k))...
                                 <>    # to the other stack...
                                   {}  # plus the top of the other stack (zero).

スタックの視覚化

メインループの1回の繰り返しでこれが発生します(ゼロは存在する場合と存在しない場合がありますが、どちらの方法でも関係ないことに注意してください)。

Start of main loop iteration/subloop first iteration:
A    B

u
v
w
0    0
^

After first subloop iteration:
A    B

v
w    u
0    0
^

After second subloop iteration:
A    B

    u+v
w    u
0    0
^

After third subloop iteration (top of stack is zero so subloop terminates):

A    B

   u+v+w
    u+v
     u
0    0
^

End of main loop iteration:
A    B

   u+v+w
    u+v
     u
0    0
     ^

スタックの状態は、今では、現在のスタックは、今のところ、次の値を持っていることを除いて、ループの開始時にあったものと同じであるuvwその上に。


2

Perl 6、48

{my @a=1,0,0;@a=reverse [\+] @a for 1..$_;@a[0]}

元々

sub f {$_>2??2*f($_-1)+f($_-2)-f($_-3)!!(1,1,3)[$_]}

しかし、私はそれを必要とするsub fことを忘れていたので、反復的なソリューションが勝ちます。


2

Dyalog APL、30バイト

{⍵<3:⍵⌷1 3⋄+/∧/¨4≥2+/¨,⍳1↓⍵/3}

総当たり攻撃を使用します。説明(少なくとも1つでの私の最善の試み):

⍵<3:⍵⌷1 3 - if ⍵ (function arg) is 1 (case 1) or 2 (case 2), return 1 (case 1) or 3 (case 2)
⋄ - separate statements
⍵/3 - otherwise, 3 repeated ⍵ times
1↓ - without the first element
⍳ - the matrix of possible indices of a matrix of that size
,  - ravel, return a list of all the elements of the matrix
2+/¨ - sum of each contiguous pair on each element
4≥ - tests whether each element is less than or equal to 4
∧/¨ - all elements are true, applied to each item.
+/ - Sum.

1

Dyalog APL、29バイト

{⍵<4:⍵⌷1 3 6⋄+/2 1 ¯1×∇¨⍵-⍳3}

整数シーケンスOEIS A006356の再帰的定義を使用して機能します。



1

R、61 58 55 51 50バイト

stdinから入力を受け取り、行列のべき乗を使用して正確な結果を決定します。

el(expm::`%^%`(matrix(!-3:5%in%2^(0:2),3),scan()))

再帰的なソリューションを希望する場合は、55バイトの OEISにリストされている再帰関係の簡単な実装を次に示します

f=function(n)`if`(n<4,(n*n+n)/2,2*f(n-1)+f(n-2)-f(n-3))

1

Excel、123バイト

OEISから式を実装します。

=4*(SIN(4*PI()/7)^2*(1+2*COS(2*PI()/7))^A1+SIN(8*PI()/7)^2*(1+2*COS(4*PI()/7))^A1+SIN(2*PI()/7)^2*(1+2*COS(8*PI()/7))^A1)/7

いつものように、に入力しA1、他のセルに数式を入力します。

古いTrig IDを掘り下げて、役立つかどうかを確認します。今、私の頭が痛い。


0

Lithp、79バイト

#N:(((if(< N 4)((/(+ N(* N N))2))((-(+(* 2(f(- N 1)))(f(- N 2)))(f(- N 3)))))))

OEISにリストされている再帰的な整数シーケンスを実装します。

読み取り可能な実装およびテストスイート。

% alkaline.lithp
% run with: ./run.js alkaline.lithp
(
    (def f #N : ((
        (if (< N 4) (
            (/ (+ N (* N N)) 2)
        ) (else (
            (- (+ (* 2 (f (- N 1))) (f (- N 2))) (f (- N 3)))
        )))
    )))

    % Test cases 1 to 4
    (import lists)
    (each (seq 1 4) #I :: ((print (f I))))
)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.