Una cadena * alcalina de cadena lineal se define como una secuencia de átomos de carbono conectados por enlaces simples (alcano), dobles (alqueno) o triples (alquino) (se usan hidrógenos implícitos). Los átomos de carbono solo pueden formar 4 enlaces, por lo que Ningún átomo de carbono puede verse obligado a tener más de cuatro enlaces. Una cadena lineal * * neta puede representarse como una lista de sus enlaces carbono-carbono.
Estos son algunos ejemplos de alc * nes válidos de cadena lineal:
[] 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
...
Si bien estos no lo son, ya que al menos un átomo de carbono tendría más de 4 enlaces:
[2,3]
[3,2]
[3,3]
...
Su tarea es crear un programa / función que, dado un número entero positivo n
, produzca / devuelva el número de alcanos * de cadena lineal válidos de n
longitud exacta de átomos de carbono. Este es OEIS A077998 .
Especificaciones / Aclaraciones
- Debe manejar
1
correctamente volviendo1
. - Alk * nes gusta
[1,2]
y[2,1]
se consideran distintos. - La salida es la longitud de una lista de todos los posibles * alnos de una longitud dada.
- Usted no tiene que manejar 0 correctamente.
Casos de prueba:
1 => 1
2 => 3
3 => 6
4 => 14
Este es el código de golf, por lo que gana el conteo de bytes más bajo .
fuente
<=4
, ¿verdad?Respuestas:
Oasis ,
97 bytesPruébalo en línea!
Explicación
Esto usa la relación de recurrencia en OEIS :
fuente
xkcd
en ella.xkcd-+311
funciona , porquek
actualmente es un no-op ...MATL , 10 bytes
Pruébalo en línea!
Explicación
Esto usa la caracterización encontrada en OEIS
fuente
Oasis ,
98 bytesSalvó un byte gracias a Adnan
Pruébalo en línea!
Explicación
fuente
x
es la abreviatura de2*
:).0
aquí)Jalea, 10 bytes
Pruébalo en línea!
Utiliza el algoritmo de Luis Mendo .
Explicación
Jalea, 15 bytes
Pruébalo en línea!
Utiliza fuerza bruta.
Explicación
fuente
MATL , 14 bytes
Pruébalo en línea!
Explicación
Esto genera el poder cartesiano de
[1 2 3]
"elevado" al número de átomos menos 1, y luego utiliza la convolución para verificar que no haya dos números contiguos en cada tupla cartesiana suma más que4
.fuente
Mathematica, 48 bytes
Como señaló Luis Mendo , este es A006356 en el OEIS. Aquí están mis intentos originales:
Para una entrada
n
,Tuples[{1,2,3},n-1]
es la lista de todas las(n-1)
tuplas de elementos que{1,2,3}
representan todas las secuencias posibles de enlaces simples, dobles o triples paran
átomos de carbono.+##<5&
es una función pura que devuelve si la suma de sus argumentos es menor que5
, por lo queSplit[#,+##<5&]&
divide una lista en sublistas que consisten en elementos consecutivos cuyas sumas por pares son menores que5
. Describir una alca * ne válida es equivalente a que esta lista tenga longitud0
(en el caso donden=1
) o1
, así que soloCount
el número de(n-1)
tuplas donde la longitud de esa lista coincide0|1
.If[+##>4,4,#2]&
devuelve4
si la suma de sus argumentos es mayor que4
y devuelve el segundo argumento de lo contrario.Fold[If[+##>4,4,#2]&]
hace una izquierdaFold
de su entrada con esta función. Así que aquí tengoCount
el número de(n-1)
tuplas a las que no se aplica este operador4
. El caso donden=1
está cubierto ya queFold
permanece sin evaluar cuando su segundo argumento es la lista vacía{}
.fuente
LinearRecurrence[{2,1,-1},{1,3,6},#][[#]]&
?this site
, ¿te refieres a OEIS o PPCG?Python, 51 bytes
Esta es una implementación directa de la relación de recurrencia. Gracias a Tim Pederick por 3 bytes. El resultado es un flotante en Python 3 y un número entero en Python 2.
Pruébalo en línea!
fuente
(n*n+n)/2
es más corto que[1,3,6][n-1]
. Y si está utilizando Python 3 y no le gusta terminar con una salida de punto flotante,(n*n+n)//2
aún es más corto.Pyth - 16 bytes
Utiliza fuerza bruta.
Test Suite .
fuente
Ruby, 62 bytes
Enfoque de fuerza bruta base 10 horriblemente ineficiente. Podría mejorarse a la base 5 para bytes adicionales.
Los números se generan donde cada dígito representa un enlace (n-1 dígitos)
0
representa un orden de enlace de 1,2
representa un orden de enlace de 3. Los dígitos sobre 2 no son válidos.Multiplicamos esto por 11 para sumar un par de dígitos adyacentes. De nuevo, los dígitos sobre 3 no son válidos.
Combinamos los dos números en una cadena y realizamos una expresión regular para buscar dígitos no válidos. Si no se encuentra ninguno, incrementamos el contador.
en programa de prueba
fuente
Ruby, 51 bytes
Basado en la relación de recurrencia según OEIS A006356.
Comienza con una matriz para los elementos 0,1 y 2 de la secuencia que son 1 (según lo calculado por mí, para que funcione), 1 y 3 respectivamente.
Iterativamente agrega
n
más elementos a la secuencia, luego devuelve el elementon
. Siempre calcula 2 elementos más de lo que realmente necesita, pero sigue siendo el tiempo lineal, que es mucho más eficiente que mi respuesta anterior.en programa de prueba
fuente
Mathematica,
4240 bytesEl recuento de bytes supone una codificación compatible de un solo byte como CP-1252 (el valor predeterminado en las instalaciones de Windows).
Esto simplemente implementa la recurrencia dada en OEIS como operador unario.
fuente
CJam (19 bytes)
Conjunto de pruebas en línea . Este es un bloque anónimo (función) que toma un elemento en la pila y deja uno en la pila. Tenga en cuenta que el conjunto de pruebas incluye
a(0) = 1
.La recurrencia utilizada se basa en la observación de la secuencia OEIS relacionada A006356 :
pero con el desplazamiento apropiado, lo que elimina la necesidad de la final
+ 1
como ahora está cubierto pora(0)
.Disección
fuente
Brain-Flak, 56 bytes
Utiliza el algoritmo detallado en el primer comentario en la página OEIS.
Pruébalo en línea!
Explicación
La secuencia se puede definir como tal:
El programa comienza en
1
y aplica repetidamente esta recurrencia para calcularu(k)
Código anotado (anotación real por venir)
Visualización de las pilas.
En una iteración del bucle principal, esto es lo que sucede (tenga en cuenta que los ceros pueden o no estar presentes, pero no importa de ninguna manera):
El estado de las pilas es ahora el mismo que era al comienzo del bucle excepto que la pila actual ahora cuenta con los siguientes valores para
u
,v
yw
en él.fuente
Perl 6, 48
Originalmente
pero olvidé que necesitaba el
sub f
para que triunfe la solución iterativa.fuente
Dyalog APL, 30 bytes
Utiliza fuerza bruta. Explicación (mi mejor intento en uno, al menos):
fuente
Dyalog APL, 29 bytes
Funciona utilizando la definición recursiva de la secuencia de enteros OEIS A006356.
fuente
Python con Numpy, 62 bytes
Tuve que probarlo, pero parece Python puro y la recursión es más corta que numpy y el cálculo explícito basado en la matriz en la página OEIS.
fuente
R,
6158555150 bytesToma datos de stdin, usa exponenciación de matrices para determinar el resultado exacto.
Si prefiere una solución recursiva, aquí hay una implementación sencilla de la relación de recurrencia enumerada en OEIS, para 55 bytes .
fuente
Excel, 123 bytes
Implementa la fórmula de OEIS:
Como siempre, ingrese la
A1
fórmula en cualquier otra celda.Desenterró viejas identidades de Trig para ver si podría ser útil. Ahora me duele la cabeza.
fuente
Lithp , 79 bytes
Implementa la secuencia recursiva de enteros enumerada en OEIS.
Implementación legible y conjunto de pruebas.
fuente