A álgebra de Steenrod é uma álgebra importante que surge na topologia algébrica. A álgebra de Steenrod é gerada por operadores chamados "quadrados de Steenrod", existe um para cada número inteiro positivo i. Existe uma base para a álgebra de Steenrod que consiste em "monômios admissíveis" nas operações quadráticas. Nosso objetivo é gerar essa base.
Uma sequência de números inteiros positivos é chamada admissível se cada número inteiro for pelo menos duas vezes o próximo. Assim, por exemplo, [7,2,1]
é admissível porque e . Por outro lado, [3,2]
não é admissível porque . (Em topologia, escreveríamos para a sequência [7,2,1]
).
O grau de uma sequência é o total de entradas. Assim, por exemplo, o grau de [7,2,1]
é . O excesso de uma sequência admissível é o primeiro elemento menos o total dos elementos restantes, portanto, [7,2,1]
tem excesso .
Tarefa
Escreva um programa que pegue um par de números inteiros positivos (d,e)
e produza o conjunto de todas as seqüências admissíveis de grau d
e excesso menores ou iguais a e
. A saída é um conjunto para que a ordem das seqüências admissíveis não importe.
Exemplos:
Input: 3,1
Output: [[2,1]]
Aqui estamos procurando sequências admissíveis com o total 3. Existem duas opções, [3]
e [2,1]
. ( [1,1,1]
e [1,2]
possui a soma 3, mas não é admissível). O excesso de [3]
é 3 e o excesso de [2,1]
é . Assim, a única sequência com excesso é [2,1]
.
Input: 6, 6
Output: [[6], [5, 1], [4, 2]] (or any reordering, e.g., [[5,1],[4,2],[6]])
Como o excesso é sempre menor ou igual ao grau, não temos condição de excesso. Assim, nós estamos apenas tentando encontrar todas as sequências admissíveis de grau 6. As opções são [6]
, [5, 1]
e [4, 2]
. (Eles têm excesso de , e )
Input: 10, 5
Output: [[7,3], [7,2,1], [6,3,1]]
As seqüências admissíveis do grau 10 são:
[[10], [9,1], [8,2], [7,3], [7,2,1], [6,3,1]]
Eles têm excesso de , , , , e respectivamente, portanto os três últimos funcionam.
Pontuação
Este é o código golf: A solução mais curta em bytes vence.
Casos de teste:
Qualquer reordenação da saída é igualmente boa, portanto, para entradas (3, 3)
, saídas [[3],[2,1]]
ou [[2,1],[3]]
são igualmente aceitáveis (no entanto, [[1,2],[3]]
não).
Input: 1, 1
Output: [[1]]
Input: 3, 3
Output: [[2,1], [3]]
Input: 3, 1
Output: [[2,1]]
Input: 6, 6
Output: [[6], [5, 1], [4, 2]]
Input: 6, 4
Output: [[5,1], [4,2]]
Input: 6, 1
Output: []
Input: 7, 7
Output: [[7], [6,1], [4,2,1], [5,2]]
Input: 7,1
Output: [[4,2,1]]
Input: 10, 10
Output: [[10], [9,1], [7,2,1], [6,3,1], [8,2], [7,3]]
Input: 10, 5
Output: [[7,3], [7,2,1], [6,3,1]]
Input: 26, 4
Output: [15, 7, 3, 1]
Input: 26, 6
Output: [[16, 7, 2, 1], [16, 6, 3, 1], [15, 7, 3, 1], [16, 8, 2], [16, 7, 3]]
fonte
Respostas:
05AB1E ,
1612 bytesEconomizou 4 bytes graças ao Grimy
Experimente online!
Explicação
fonte
ćsO-
é o embutidoÆ
.À@¨
pode ser¦@
.Wolfram Language (Mathematica) ,
6762 bytesExperimente online!
-4 bytes por @attinat
IntegerPartitions@d
: Obtenha todas as listas de números inteiros que somamd
Cases[,...]
: Filtre pela seguinte condição:2#& @@# - d <= e &&
: Duas vezes o primeiro elemento menos a soma é menor quee
e ...Max@Ratios@#<=.5
: As proporções de elementos sucessivos da lista são menores que 1/2.Como
e
é menor que 0,5, podemos transformar isso em uma desigualdade encadeada.Para alguns bytes extras, isso é significativamente mais rápido: Experimente online!
fonte
Geléia ,
1615 bytes-1 graças a Erik the Outgolfer (um ajuste inteligente na verificação que permite um único filtro)
Um link diádico que aceita um número inteiro positivo,
d
à esquerda e um número inteiro positivoe
, à direita, que produz uma lista de listas de números inteiros positivos.Experimente online! (o rodapé formata os resultados para evitar a lista, a formatação implícita da lista que o Jelly faz como um programa completo)
Quão?
fonte
Haskell ,
595854 bytes1 byte salvo graças a nimi
4 bytes salvos graças ao xnor
Experimente online!
fonte
#
diretamente: Experimente online!JavaScript (V8) ,
88 8781 bytesToma entrada como
(e)(d)
. Imprime as seqüências para STDOUT.Experimente online!
Comentado
fonte
Pitão , 23 bytes
Experimente online!
fonte
Python 3 ,
213 bytesLista gigante de compreensão. Provavelmente não é a melhor maneira de fazer isso, mas não consigo descobrir como pular as instruções if
Python 3 , 172 bytes
Experimente online!
Conforme editado por @Jonas Ausevicius
fonte
all
podem levar um gerador para que você possa fazer emall(...)
vez deall([...])
. Por fim, como o envio é uma função completamente anônima, você não é penalizado pela atribuição (f=
) e, portanto, pode deduzi-la da sua pontuação (-2 bytes).[*(...)]
vez delist(...)
que normalmente salva um byte, mas no seu caso salva 2, pois também permite remover um espaço.[*filter(...)]
. Dê as boas-vindas :)Carvão , 42 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Primeiro, crie uma lista de listas
[1]..[d]
.Para cada lista, crie novas listas prefixando todos os números do primeiro número dobrado até
d
e anexe essas listas à lista de listas a serem processadas. Isso garante que todas as seqüências admissíveis que contenham números não maiores que od
sejam criadas.Saída apenas as listas cujo grau é
d
e excesso não é maior quee
. (A soma do grau e do excesso é igual ao dobro do primeiro número da lista.)fonte
Python 3 , 156 bytes
leva
d,e
como entrada; produz lista de tuplasSemelhante à resposta do @OrangeCherries e ajuda dos comentários; mas mais bytes salvos
Experimente online!
fonte
Geléia , 18 bytes
Experimente online!
fonte
Ruby , 78 bytes
Experimente online!
fonte