Verilen uzunlukta Düz-Zincir Alk * nes sayısı


28

Bir düz zincirli alk * n, tek (alkan), çift (alken) veya üçlü bağlarla (alkin) bağlanmış bir karbon atomları dizisi olarak tanımlanır, (örtük hidrojenler kullanılır.) Karbon atomları sadece 4 bağ oluşturabilir, bu nedenle hiçbir karbon atomu dörtten fazla bağa sahip olmaya zorlanamaz. Bir düz zincirli alk * ne karbon-karbon bağlarının bir listesi olarak temsil edilebilir.

Bunlar geçerli düz zincirli alk * neslerinin bazı örnekleri:

[]       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
...

Bunlar olmasa da, en az bir karbon atomunun 4 bağdan fazlasına sahip olacağı gibi:

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

Görev pozitif bir tam sayı verilir, bir program / işlev oluşturmaktır n, çıkış / geri sayısı tam olarak geçerli düz zincirli alk * nes arasında nuzunluğunda karbon atomu. Bu OEIS A077998 .

Özellikler / Açıklamalar

  • Dönerek 1doğru şekilde işlemelisiniz 1.
  • Alk * nesleri gibi [1,2]ve [2,1]farklı olarak kabul edilir.
  • Çıktı, verilen bir uzunluktaki tüm olası alk * neslerinin bir listesinin uzunluğudur.
  • Sen do not doğru 0 işlemek zorunda.

Test Durumları:

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

Bu kod golf, yani en düşük bayt sayısı kazanır!


Sadece netleştirmek için, tüm ardışık çiftler toplanırsa bir zincir geçerlidir <=4, değil mi?
Maltysen,

Sabit. @Maltysen: evet.
Zacharı,

4
Neden her şey için bir OEIS dizisi var? : P
HyperNeutrino 14:16

2
ZacharyT, kesinlikle sıfır karbon atomu olan bir hidrokarbon var ve aynı zamanda sıfır hidrojen atomuna sahip olanı. Pascal'ın üçgeni, 0 yerine üstte 1 değerine sahip olması veya tam anlamıyla yüzlerce başka birleşim dizileri için olduğu gibi aynı argümandır.
Peter Taylor

1
@Emigna, çünkü yanlış sekans birbirine bağlıydı. Düzelteceğim.
Peter Taylor

Yanıtlar:


7

Oasis , 9 7 bayt

xcd-+3V

Çevrimiçi deneyin!

açıklama

Bu, OEIS'deki yineleme ilişkisini kullanır :

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
İlk değerlerin güzel kullanımı! Bu sefer sen kazanırsın;)
Emigna

Evet, muhtemelen bunu yenmenin bir yolu yok.
Zacharı

4
@ZacharyT Yalnızca biri programın xkcdiçinde olmasını sağlamak için bir yol bulabilirse .
hBy2Py

4
@ hBy2Py Peki, xkcd-+311işe yarıyor , çünkü kşu anda bir operasyon dışı ...
Luis Mendo

10

MATL , 10 bayt

7K5vBiY^1)

Çevrimiçi deneyin!

açıklama

Bu, OEIS'te bulunan karakterizasyonu kullanır.

a (n), 3X3 matrisinin [1, 1, 1'in n'inci gücünün sol üst girişidir; 100; 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

Oasis , 9 8 bayt

Adnan sayesinde bir bayt kaydedildi

xc+d-63T

Çevrimiçi deneyin!

açıklama

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
Güzel! Ayrıca, :) xiçin kısa 2*.
Adnan,

1
Yendi ya :-P (Ben zaten bir OASIS cevabı olduğunu görmemiştim)
Luis Mendo

@Adnan Oasis'e çıkış sırası dizinini 1'e kaydırmak istediğinizi söylemenin bir yolu var mı? Yani, giriş argümanına 1 çıkartın ( 0burada bir başlangıç ​​kullanmak yerine )
Luis Mendo 12

1
@LuisMendo Ah, bu henüz uygulanmadı. Ama bir sonraki sürüm için iyi bir fikir :).
Adnan,

Gelecekteki referans için, bu şimdi uygulanır
Luis Mendo

4

Jöle, 10 bayt

745DBæ*µḢḢ

Çevrimiçi deneyin!

Luis Mido'nun algoritmasını kullanır .

açıklama

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

Jöle, 15 bayt

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

Çevrimiçi deneyin!

Kaba kuvvet kullanır.

açıklama

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 bayt

q3:Z^TTZ+!5<As

Çevrimiçi deneyin!

açıklama

Bu, [1 2 3]eksi 1 atom sayısına "yükseltilmiş" olan Kartezyen gücü üretir ve daha sonra her Kartezyen demetindeki iki bitişik sayının toplamdan daha fazla olmadığını kontrol etmek için evrişim kullanır 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 bayt

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

Luis Mendo'nun belirttiği gibi , bu OEIS’de A006356 . Orijinal girişimlerim:

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

Bir giriş için n, Tuples[{1,2,3},n-1]her listesi (n-1)elemanların -tuples {1,2,3}için, tek, çift ya da üçlü bağlar bütün olası dizilerinin temsil nkarbon atomu. +##<5&argümanlarının toplamının daha az olup olmadığını döndüren saf bir işlevdir 5, bu nedenle Split[#,+##<5&]&bir liste, ikili toplamları daha küçük olan ardışık öğelerden oluşan alt listelere böler 5. Geçerli bir alk * ne tanımlanması, uzunluğa sahip 0(bu durumda n=1) veya bu listeye eşdeğerdir, bu 1yüzden bu listenin uzunluğunun eşleştiği yalnızca -tuples Countsayısı .(n-1)0|1

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

If[+##>4,4,#2]&döner 4bağımsız değişkenler toplamından daha büyük ise, 4aksi takdirde ikinci bağımsız değişken döner. bu fonksiyonla girişinin Fold[If[+##>4,4,#2]&]solunu yapar Fold. İşte burada Count, (n-1)bu operatörün uygulanmadığı tüllerin sayısı 4. O n=1zamandan beri kapsanan dava Fold, ikinci argümanı boş liste olduğunda eşitsiz kalır {}.


1
Bu işe yarar mı? (OEIS’ten ayarlamalar yapıldığı takdirde nasıl sökülür) LinearRecurrence[{2,1,-1},{1,3,6},#][[#]]&?
Zacharı

Bu siteyi neden sevdiğimin bir kısmı Mathematica'nın sunduğu tüm özellikleri öğreniyor :)
ngenisis

By this site, sen OEIS veya PPCG demek?
Zacharı

PPCG. İnsanların önerisinden çok Mathematica aldım.
ngenis,

3

Python, 51 bayt

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

Bu tekrarlama ilişkisinin basit bir uygulamasıdır. 3 bayt için Tim Pederick'e teşekkürler. Çıktı, Python 3'te bir float ve Python 2'de bir tamsayıdır.

Çevrimiçi deneyin!


(n*n+n)/2daha kısa [1,3,6][n-1]. Python 3 kullanıyorsanız ve kayan nokta çıkışına son vermekten hoşlanmıyorsanız (n*n+n)//2, hala daha kısadır.
Tim Pederick


2

Ruby, 62 bayt

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

Korkunç derecede verimsiz taban 10 kaba kuvvet yaklaşımı. İlave baytlar için baz 5'e geliştirilebilir.

Her basamağın bir bağı temsil ettiği (n-1 rakamları.) 01'in 2bir bağ sırasını temsil ettiği , sayıların 3 bir bağ sırasını temsil ettiği yerlerde üretilir .

Bunu bitişik basamak çiftini toplamak için 11 ile çarpıyoruz. Yine 3'ün üzerindeki rakamlar geçersiz.

İki sayıyı bir dizede birleştirir ve geçersiz sayıları aramak için bir regex uygularız. Hiçbiri bulunamazsa, sayacı artırırız.

test programında

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 bayt

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

OEIS A006356 uyarınca yinelenme ilişkisine dayanarak.

Sırasıyla 1 ve 3 olan dizinin 0,1 ve 2 elementleri için bir dizi ile başlar (bana göre hesaplandığı gibi).

nSıralamaya sırayla daha fazla eleman ekler , sonra elemanı döndürür n. Her zaman gerçekte ihtiyaç duyduğundan daha fazla 2 öğe hesaplar, ancak yine de önceki cevabımdan çok daha verimli olan doğrusal bir zamandır.

test programında

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 bayt

Bayt sayısı, CP-1252 (Windows yüklemelerinde varsayılan) gibi uyumlu bir tek baytlı kodlama varsaymaktadır.

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

Bu, basit bir şekilde OEIS'te tek bir operatör olarak verilen nüksü gerçekleştirir.


2

CJam (19 bayt)

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

Çevrimiçi test paketi . Bu, yığın üzerinde bir öğe alan ve yığında bir tane bırakan isimsiz bir bloktur (fonksiyon). Test paketinin içerdiğini unutmayın a(0) = 1.

Kullanılan yineleme, ilgili OEIS dizisi A006356'nın gözlemine dayanmaktadır :

(N) = a (n-1) + 2 * a (n-2) + a (n-3) + değerine eşdeğer (1, 2, 1, 1, 1, ...) INVERT dönüşümüne eşittir a (n-4) + ... + 1. a (6) = 70 = (31 + 2 x 14 + 6 + 3 + 1 + 1). - Gary W. Adamson, 27 Nis 2009

ancak, + 1şu anda kapsandığı gibi final ihtiyacını ortadan kaldıran uygun ofset ile a(0).

teşrih

{         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 bayt

OEIS sayfasındaki ilk yorumda ayrıntılı olarak verilen algoritmayı kullanır.

Çevrimiçi deneyin!

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

açıklama

Dizi şöyle tanımlanabilir:

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

Program başlar 1ve tekrarlamak için tekrar tekrar bu yinelemeyi uygular.u(k)

Ek Açıklama Kodu (gelecek ek açıklama)

# 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).

Yığınların görselleştirilmesi

Ana döngünün bir yinelemesinde olan şey budur (sıfırların olabileceğine veya olamayabileceğine, ancak her iki şekilde de önemli olmadığına dikkat edin):

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
     ^

Mevcut yığın şimdi aşağıdaki değerlere sahip olması dışında döngü başlangıcında olduğu gibi yığınlar durumu artık aynıdır u, vve wbunun üzerine.


2

Perl 6, 48

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

Aslında

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

ama sub fyinelemeli çözümün kazanması için ihtiyacım olduğunu unuttum .


2

Dyalog APL, 30 bayt

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

Kaba kuvvet kullanır. Açıklama (en azından bir denemem, en azından):

⍵<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 bayt

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

OEIS A006356 tamsayı dizisinin özyinelemeli tanımını kullanarak çalışır.


1

Numpy ile Python, 62 bayt

Denemek zorunda kaldım, ama görünüşe göre Python saf ve özyineleme rakamlardan daha kısa ve OEIS sayfasındaki açık, matris temelli hesaplama.

from numpy import*
lambda n:(mat('1 1 1;1 0 0;1 0 1')**n)[0,0]

1

R, 61 58 55 51 50 bayt

Stdin'den girdi alır, kesin sonucu belirlemek için matris üstelleştirmesini kullanır.

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

Özyinelemeli bir çözümü tercih ederseniz, işte OEIS'te listelenen yineleme ilişkisinin 55 bayt için basit bir uygulaması .

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

1

Excel, 123 bayt

OEIS’teki formülü uygular:

=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

Her zamanki gibi, A1başka bir hücreye giriş yapın.

Yararlı olup olmadığını görmek için eski Trig kimliklerini kazın. Şimdi başım ağrıyor.


0

Lithp , 79 bayt

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

OEIS'de listelenen özyinelemeli tamsayı dizisini uygular.

Okunabilir uygulama ve test takımı.

% 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))))
)
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.