Um alcalino de cadeia linear é definido como uma sequência de átomos de carbono conectados por ligações simples (alcano), duplas (alceno) ou triplas (alcino), (são usados hidrogênios implícitos.) Os átomos de carbono podem formar apenas 4 ligações, portanto nenhum átomo de carbono pode ser forçado a ter mais de quatro ligações. Um alcalino de cadeia linear pode ser representado como uma lista de suas ligações carbono-carbono.
Estes são alguns exemplos de alcoóis de cadeia linear válidos:
[] 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
...
Enquanto estes não são, como pelo menos um átomo de carbono teria mais de 4 ligações:
[2,3]
[3,2]
[3,3]
...
Sua tarefa é criar um programa / função que, dado um número inteiro positivo n
, produz / retorne o número de alcos de cadeia linear válidos com exatamente n
átomos de carbono de comprimento. Este é o OEIS A077998 .
Especificações / Esclarecimentos
- Você deve manipular
1
corretamente retornando1
. - Alk * nes gostam
[1,2]
e[2,1]
são considerados distintos. - Saída é o comprimento de uma lista de todos os alcinos possíveis de um determinado comprimento.
- Você não precisa manipular 0 corretamente.
Casos de teste:
1 => 1
2 => 3
3 => 6
4 => 14
Isso é código de golfe, então a contagem de bytes mais baixa ganha!
fonte
<=4
, certo?Respostas:
Oasis ,
97 bytesExperimente online!
Explicação
Isso usa o relacionamento de recorrência no OEIS :
fonte
xkcd
nele.xkcd-+311
funciona , porquek
atualmente é um não ...MATL , 10 bytes
Experimente online!
Explicação
Isso usa a caracterização encontrada em OEIS
fonte
Oásis ,
98 bytesGuardou um byte graças a Adnan
Experimente online!
Explicação
fonte
x
é a abreviação de2*
:).0
aqui)Gelatina, 10 bytes
Experimente online!
Usa o algoritmo de Luis Mendo .
Explicação
Gelatina, 15 bytes
Experimente online!
Usa força bruta.
Explicação
fonte
MATL , 14 bytes
Experimente online!
Explicação
Isso gera o poder cartesiano de
[1 2 3]
"elevado" ao número de átomos menos 1 e, em seguida, usa a convolução para verificar se não há dois números contíguos em cada tupla cartesiana somando mais de4
.fonte
Mathematica, 48 bytes
Como Luis Mendo apontou , este é o A006356 no OEIS. Aqui estão as minhas tentativas originais:
Para uma entrada
n
,Tuples[{1,2,3},n-1]
é a lista de todos os(n-1)
pares de elementos que{1,2,3}
representam todas as sequências possíveis de ligações simples, duplas ou triplas paran
átomos de carbono.+##<5&
é uma função pura que retorna se a soma de seus argumentos é menor que5
, portanto,Split[#,+##<5&]&
divide uma lista em sublistas que consistem em elementos consecutivos cujas somas em pares são menores que5
. Descrever um alc * ne válido é equivalente a que esta lista tenha comprimento0
(no caso em quen=1
) ou1
, portanto, apenasCount
o número de(n-1)
-tuplas em que o comprimento dessa lista corresponde0|1
.If[+##>4,4,#2]&
retorna4
se a soma de seus argumentos for maior que4
e retorna o segundo argumento caso contrário.Fold[If[+##>4,4,#2]&]
faz uma esquerdaFold
de sua entrada com esta função. Então aqui estouCount
o número de(n-1)
-tuples aos quais a aplicação desse operador não fornece4
. O caso em quen=1
é abordadoFold
permanece sem avaliação quando seu segundo argumento é a lista vazia{}
.fonte
LinearRecurrence[{2,1,-1},{1,3,6},#][[#]]&
?this site
, você quer dizer OEIS ou PPCG?Python, 51 bytes
Essa é uma implementação direta da relação de recorrência. Obrigado a Tim Pederick por 3 bytes. A saída é um float no Python 3 e um número inteiro no Python 2.
Experimente online!
fonte
(n*n+n)/2
é mais curto que[1,3,6][n-1]
. E se você estiver usando Python 3 e não gostar de terminar com saída de ponto flutuante,(n*n+n)//2
é ainda mais curto.Pitão - 16 bytes
Usa força bruta.
Conjunto de Teste .
fonte
Ruby, 62 bytes
Abordagem de força bruta de base 10 horrivelmente ineficiente. Pode ser aprimorado para a base 5 para bytes adicionais.
Os números são gerados onde cada dígito representa uma ligação (n-1 dígitos.)
0
Representa uma ordem de ligação de 1,2
representa uma ordem de ligação de 3. Os dígitos acima de 2 são inválidos.Nós multiplicamos por 11 para somar o par de dígitos adjacente. Novamente, dígitos acima de 3 são inválidos.
Combinamos os dois números em uma sequência e executamos uma regex para procurar dígitos inválidos. Se nenhum for encontrado, incrementamos o contador.
no programa de teste
fonte
Ruby, 51 bytes
Com base na relação de recorrência de acordo com OEIS A006356.
Começa com uma matriz para os elementos 0,1 e 2 da sequência que são 1 (conforme calculado por mim, para fazê-lo funcionar), 1 e 3, respectivamente.
Adiciona iterativamente
n
mais elementos à sequência e retorna o elementon
. Ele sempre calcula 2 elementos a mais do que realmente precisa, mas ainda é tempo linear, o que é muito mais eficiente que a minha resposta anterior.no programa de teste
fonte
Mathematica,
4240 bytesA contagem de bytes assume uma codificação compatível de um byte, como o CP-1252 (o padrão nas instalações do Windows).
Isso simplesmente implementa a recorrência dada no OEIS como um operador unário.
fonte
CJam (19 bytes)
Conjunto de testes online . Este é um bloco anônimo (função) que pega um item na pilha e deixa um na pilha. Observe que o conjunto de testes inclui
a(0) = 1
.A recorrência usada é baseada na observação para a sequência OEIS relacionada A006356 :
mas com o deslocamento apropriado, o que elimina a necessidade da final,
+ 1
como agora cobertaa(0)
.Dissecação
fonte
Brain-Flak, 56 bytes
Usa o algoritmo detalhado no primeiro comentário na página OEIS.
Experimente online!
Explicação
A sequência pode ser definida como tal:
O programa inicia
1
e aplica repetidamente essa recorrência para calcularu(k)
Código anotado (anotação real por vir)
Visualização das pilhas
Em uma iteração do loop principal, é o que acontece (observe que os zeros podem ou não estar presentes, mas isso não importa de qualquer maneira):
O estado das pilhas é agora o mesmo que era no início do ciclo, excepto que a pilha corrente agora tem os seguintes valores para
u
,v
ew
sobre ele.fonte
Perl 6, 48
Originalmente
mas esqueci que precisava da
sub f
solução iterativa para vencer.fonte
Dyalog APL, 30 bytes
Usa força bruta. Explicação (minha melhor tentativa, pelo menos):
fonte
Dyalog APL, 29 bytes
Funciona usando a definição recursiva da sequência inteira OEIS A006356.
fonte
Python com Numpy, 62 bytes
Eu tive que tentar, mas parece puro Python e a recursão é mais curta que numpy e o cálculo explícito baseado em matriz na página OEIS.
fonte
R,
6158555150 bytesRecebe informações de stdin, usa exponenciação de matriz para determinar o resultado exato.
Se você preferir uma solução recursiva, aqui está uma implementação direta da relação de recorrência listada no OEIS, por 55 bytes .
fonte
Excel, 123 bytes
Implementa a fórmula do OEIS:
Como sempre, insira a
A1
fórmula em qualquer outra célula.Desenterre identidades antigas do Trig para ver se isso pode ser útil. Agora minha cabeça dói.
fonte
Lithp , 79 bytes
Implementa a sequência inteira recursiva listada no OEIS.
Implementação legível e suíte de testes.
fonte