Un alk * ne à chaîne droite est défini comme une séquence d'atomes de carbone reliés par des liaisons simples (alcane), doubles (alcène) ou triples (alcyne) (des hydrogènes implicites sont utilisés.) Les atomes de carbone ne peuvent former que 4 liaisons, donc aucun atome de carbone ne peut être contraint d'avoir plus de quatre liaisons. Un alk * ne à chaîne droite peut être représenté comme une liste de ses liaisons carbone-carbone.
Voici quelques exemples d'alc * nes à chaîne droite valides:
[] 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
...
Bien que ce ne soit pas le cas, car au moins un atome de carbone aurait plus de 4 liaisons:
[2,3]
[3,2]
[3,3]
...
Votre tâche consiste à créer un programme / une fonction qui, étant donné un entier positif n
, génère / renvoie le nombre d'alc * nes à chaîne droite valides d'une n
longueur exacte d' atomes de carbone. Il s'agit d' OEIS A077998 .
Spécifications / clarifications
- Vous devez gérer
1
correctement en revenant1
. - Alk * nes aiment
[1,2]
et[2,1]
sont considérés comme distincts. - La sortie est la longueur d'une liste de tous les alc * nes possibles d'une longueur donnée.
- Vous n'avez pas à gérer correctement 0.
Cas de test:
1 => 1
2 => 3
3 => 6
4 => 14
C'est le golf de code, donc le nombre d' octets le plus bas gagne!
la source
<=4
, non?Réponses:
Oasis ,
97 octetsEssayez-le en ligne!
Explication
Cela utilise la relation de récurrence dans OEIS :
la source
xkcd
.xkcd-+311
marche , parce quek
c'est actuellement un no-op ...MATL , 10 octets
Essayez-le en ligne!
Explication
Cela utilise la caractérisation trouvée dans OEIS
la source
Oasis ,
98 octetsUn octet enregistré grâce à Adnan
Essayez-le en ligne!
Explication
la source
x
est l'abréviation de2*
:).0
ici)Gelée, 10 octets
Essayez-le en ligne!
Utilise l'algorithme de Luis Mendo .
Explication
Gelée, 15 octets
Essayez-le en ligne!
Utilise la force brute.
Explication
la source
MATL , 14 octets
Essayez-le en ligne!
Explication
Cela génère la puissance cartésienne de
[1 2 3]
"augmenté" au nombre d'atomes moins 1, puis utilise la convolution pour vérifier qu'il n'y a pas deux nombres contigus dans chaque tuple cartésien totalisant plus de4
.la source
Mathematica, 48 octets
Comme l'a souligné Luis Mendo , il s'agit de l' A006356 dans l'OEIS. Voici mes tentatives originales:
Pour une entrée
n
,Tuples[{1,2,3},n-1]
est la liste de tous les(n-1)
-tuples d'éléments{1,2,3}
représentant toutes les séquences possibles de liaisons simples, doubles ou triples pourn
les atomes de carbone.+##<5&
est une fonction pure qui retourne si la somme de ses arguments est inférieure à5
,Split[#,+##<5&]&
divise donc une liste en sous-listes constituées d'éléments consécutifs dont les sommes par paire sont inférieures à5
. Décrire un alk * ne valide est équivalent à cette liste ayant une longueur0
(dans le cas oùn=1
) ou1
, donc je viensCount
du nombre de(n-1)
-tuples où la longueur de cette liste correspond0|1
.If[+##>4,4,#2]&
renvoie4
si la somme de ses arguments est supérieure à4
et renvoie le deuxième argument dans le cas contraire.Fold[If[+##>4,4,#2]&]
fait une gaucheFold
de son entrée avec cette fonction. Voici doncCount
le nombre de(n-1)
-tuples auxquels l'application de cet opérateur ne donne pas4
. Le cas oùn=1
est couvert depuisFold
reste non évalué lorsque son deuxième argument est la liste vide{}
.la source
LinearRecurrence[{2,1,-1},{1,3,6},#][[#]]&
?this site
, voulez-vous dire OEIS ou PPCG?Python, 51 octets
Il s'agit d'une implémentation simple de la relation de récurrence. Merci à Tim Pederick pour 3 octets. La sortie est un flottant en Python 3 et un entier en Python 2.
Essayez-le en ligne!
la source
(n*n+n)/2
est plus court que[1,3,6][n-1]
. Et si vous utilisez Python 3 et que vous n'aimez pas vous retrouver avec une sortie en virgule flottante,(n*n+n)//2
c'est toujours plus court.Pyth - 16 octets
Utilise la force brute.
Suite de tests .
la source
Rubis, 62 octets
Approche horriblement inefficace de la force brute de la base 10. Pourrait être amélioré à la base 5 pour des octets supplémentaires.
Les nombres sont générés où chaque chiffre représente une liaison (n-1 chiffres.)
0
Représente un ordre de liaison de 1,2
représente un ordre de liaison de 3. Les chiffres supérieurs à 2 ne sont pas valides.Nous multiplions cela par 11 pour additionner la paire adjacente de chiffres. Encore une fois, les chiffres supérieurs à 3 ne sont pas valides.
Nous combinons les deux nombres dans une chaîne et effectuons une expression régulière pour rechercher des chiffres invalides. Si aucun n'est trouvé, nous incrémentons le compteur.
dans le programme de test
la source
Rubis, 51 octets
Basé sur la relation de récurrence selon OEIS A006356.
Commence par un tableau pour les éléments 0,1 et 2 de la séquence qui sont 1 (comme calculé par moi, pour le faire fonctionner), 1 et 3 respectivement.
Ajoute itérativement
n
plus d'éléments à la séquence, puis renvoie l'élémentn
. Il calcule toujours 2 éléments de plus que ce dont il a réellement besoin, mais c'est toujours du temps linéaire, ce qui est beaucoup plus efficace que ma réponse précédente.dans le programme de test
la source
Mathematica,
4240 octetsLe nombre d'octets suppose un codage à un octet compatible comme CP-1252 (la valeur par défaut sur les installations Windows).
Cela implémente simplement la récurrence donnée sur OEIS en tant qu'opérateur unaire.
la source
CJam (19 octets)
Suite de tests en ligne . Il s'agit d'un bloc (fonction) anonyme qui prend un élément sur la pile et en laisse un sur la pile. Notez que la suite de tests comprend
a(0) = 1
.La récurrence utilisée est basée sur l'observation de la séquence OEIS associée A006356 :
mais avec le décalage approprié, ce qui élimine le besoin de la finale
+ 1
comme maintenant couvert para(0)
.Dissection
la source
Brain-Flak, 56 octets
Utilise l'algorithme détaillé dans le premier commentaire sur la page OEIS.
Essayez-le en ligne!
Explication
La séquence peut être définie comme telle:
Le programme démarre à
1
et applique à plusieurs reprises cette récurrence pour calculeru(k)
Code annoté (annotation réelle à venir)
Visualisation des piles
Dans une itération de la boucle principale, c'est ce qui se passe (notez que les zéros peuvent être présents ou non mais cela n'a pas d'importance dans les deux cas):
L'état des piles est maintenant le même que celui au début de la boucle , sauf que la pile courante a maintenant les valeurs suivantes pour
u
,v
etw
sur elle.la source
Perl 6, 48
À l'origine
mais j'ai oublié que j'avais besoin de la
sub f
solution itérative.la source
Dyalog APL, 30 octets
Utilise la force brute. Explication (ma meilleure tentative, au moins):
la source
Dyalog APL, 29 octets
Fonctionne en utilisant la définition récursive de la séquence entière OEIS A006356.
la source
Python avec Numpy, 62 octets
J'ai dû l'essayer, mais il semble que Python pur et la récursivité soient plus courts que numpy et le calcul explicite basé sur une matrice sur la page OEIS.
la source
R,
6158555150 octetsPrend l'entrée de stdin, utilise l'exponentiation matricielle pour déterminer le résultat exact.
Si vous préférez une solution récursive, voici une implémentation simple de la relation de récurrence répertoriée dans OEIS, pour 55 octets .
la source
Excel, 123 octets
Implémente la formule d'OEIS:
Comme toujours, entrez la
A1
formule dans toute autre cellule.Corrigez les anciennes identités Trig pour voir si cela pourrait être utile. Maintenant, ma tête me fait mal.
la source
Lithp , 79 octets
Implémente une séquence entière récursive répertoriée dans OEIS.
Implémentation et suite de tests lisibles.
la source