Dado um número positivo , encontre o número de alcanos com átomos de carbono, ignorando os estereoisômeros ; ou equivalente, o número de árvores não rotuladas com nós, de modo que cada nó tenha grau .
Esta é a sequência OEIS A000602 .
Veja também: Parafinas - Código Rosetta
Exemplo
Para , a resposta é , porque o heptano possui nove isômeros :
- Heptano :
- 2-metil-hexano :
- 3-metil-hexano :
- 2,2-dimetilpentano :
- 2,3-dimetilpentano :
- 2,4-dimetilpentano :
Observe que o 3-metilhexano e o 2,3-dimetilpentano são quirais , mas aqui ignoramos os estereoisômeros.
Casos de teste
intput output
=============
0 1
1 1
2 1
3 1
4 2
5 3
6 5
7 9
8 18
9 35
10 75
11 159
12 355
13 802
14 1858
15 4347
16 10359
17 24894
18 60523
19 148284
20 366319
code-golf
sequence
combinatorics
chemistry
alefalpha
fonte
fonte
Respostas:
CJam (
100 98 91 8983 bytes)Pega a entrada de stdin, produz para stdout. Observe que isso explora a licença para não manipular a entrada
0
e salvar dois bytes, incorporando as definições deC
eD
.Demonstração onlineNota: isso é muito lento e ineficiente na memória. Ao aparar matrizes, é obtida uma versão muito mais rápida (mais 3 bytes). Demonstração online .
Dissecação
Eu manipulei isso em uma decomposição um pouco mais golfista e, em seguida, procurei as seqüências intermediárias e descobri que elas também estão no OEIS:
As versões anteriores reutilizaram o bloco
C
(envolvem dois polinômios) desta resposta . Encontrei uma muito mais curta, mas não consigo atualizar essa resposta porque é de uma pergunta em cadeia.fonte
Node.js 11.6.0 ,
229 223 221218 bytesDerivado da implementação Java sugerida no Código Rosetta .
Experimente online!
fonte
Alquimista (1547 bytes)
Demonstração online .
Nota: isso é bastante lento. Se estiver testando com um intérprete que suporte a aplicação de uma regra várias vezes ao mesmo tempo (por exemplo, a minha - embora você tenha a versão mais recente que corrige um bug no analisador), é possível obter uma aceleração significativa adicionando duas regras:
que alinham uma rota através das regras existentes
Dissecção parcial
Em um nível alto, isso usa a mesma abordagem da minha resposta CJam.
O modelo de computação do Alchemist é essencialmente a máquina de registro de Minsky . No entanto, o Alchemist expõe muito bem a equivalência de código e dados e, ao permitir que muitos tokens no lado esquerdo de uma regra de produção efetivamente, o estado não é obrigado a ser representado por um átomo: podemos usar uma tupla de átomos, e isso permite sub-rotinas (não recursivas). Isso é muito útil para o golfe. As únicas coisas que realmente faltam são macros e depuração.
Para matrizes, estou usando uma função de emparelhamento que pode ser implementada com bastante facilidade nos RMs. A matriz vazia é representada por0 0 e o resultado de anexar x ordenar UMA é ( 2 A + 1 ) 2x . Há uma sub-rotina para emparelhar: a sub-rotina é chamada
P
e precede o valor dee
parab
. Existem dois sub-rotinas para desemparelhar:n
unpairsb
dee
eb
; et
desemparelhad
parae
ed
. Isso me permitiu salvar um pouco de dados aleatórios entre variáveis, o que é importante: uma única operação de "movimentação"expande para pelo menos 17 bytes:
onde
S
é o estado atual eT
é o próximo estado. Uma "cópia" não destrutiva é ainda mais cara, porque deve ser feita como um "movimento" dea
parab
e um auxiliartmp
, seguida de um "movimento" detmp
volta paraa
.Ofuscação
Criei um alias para várias variáveis e eliminei cerca de 60 estados no processo de jogar golfe no programa, e muitos deles não tinham nomes particularmente significativos, mas para jogá-lo completamente, escrevi um minimizador para que os nomes agora sejam completamente indecifráveis. Boa sorte engenharia reversa isso! Aqui está o minimizador (no CJam), que faz algumas suposições sobre o código, mas pode ser adaptado para minimizar outros programas Alquimistas:
fonte
Pari / GP , 118 bytes
A tradução direta do Peter Taylor 's resposta CJam .
Experimente online!
fonte