Correntes de Gozinta
(Inspirado no Projeto Euler # 606 )
Uma cadeia gozinta para n é uma sequência em {1,a,b,...,n}
que cada elemento divide adequadamente o próximo. Por exemplo, existem oito cadeias gozinta distintas para 12:
{1,12}, {1,2,12}, {1,2,4,12}, {1,2,6,12}, {1,3,12}, {1,3,6,12}, {1,4,12} and {1,6,12}.
O desafio
Escreva um programa ou função que aceite um número inteiro positivo ( n > 1
) e produza ou retorne todas as cadeias gozinta distintas para o número fornecido.
- A ordem nas cadeias é importante (ascendente), a ordem das cadeias não.
- Na eventualidade de existir, você não pode usar um componente interno que resolva o desafio.
- Isso é código-golfe .
Editar: Removendo 1
como uma entrada potencial.
code-golf
sequence
arithmetic
Guarda-chuva
fonte
fonte
[[1]]
eu diria que se[1,1]
é uma gozinta de1
então[1,1,12]
é uma gozinta de12
como é[1,1,1,12]
e agora podemos não "retorne tudo ..."2|4
é lido "dois entra em quatro" aka "dois gozinta quatro".Respostas:
Python 3 ,
6865 bytesEdit: -3 bytes graças a @notjagan
Experimente online!
Explicação
Cada cadeia gozinta consiste no número
x
no final da cadeia, com pelo menos um divisor à esquerda dela. Para cada divisork
dasx
cadeias[1,...,k,x]
são distintos. Podemos, portanto, para cada divisork
encontrar todas as suas distintas correntes gozinta e acrescentarx
ao final deles, para obter todas as distintas cadeias gozinta comk
diretamente à esquerda dax
. Isso é feito recursivamente atéx = 1
onde[[1]]
é retornado, pois todas as cadeias gozinta começam com 1, o que significa que a recursão atingiu o fundo do poço.O código se torna tão curto devido à compreensão da lista do Python, permitindo a iteração dupla. Isso significa que os valores encontrados em
f(k)
podem ser adicionados à mesma lista para todos os diferentes divisoresk
.fonte
Casca , 13 bytes
Uma abordagem um pouco diferente da de H.PWiz , embora ainda por força bruta. Experimente online!
Explicação
A idéia básica é concatenar todas as subsequências
[1,...,n]
e dividir o resultado em sublistas, onde cada elemento divide o próximo. Destes, mantemos aqueles que começam com1
, terminamn
e não contêm duplicatas. Isso é feito com o "rangify" embutido…
. Resta então descartar as duplicatas.fonte
Geléia ,
98 bytesExperimente online!
Utiliza uma técnica semelhante à minha resposta em japonês e, portanto, é executada muito rapidamente em casos de teste maiores.
Como funciona
fonte
Mathematica, 77 bytes
Forma a
Graph
onde os vértices são osDivisors
da entrada#
e as arestas representam a divisibilidade adequada e, em seguida, localizaAll
caminhos do vértice1
para o vértice#
.fonte
Gelatina , 12 bytes
Um link monádico que aceita um número inteiro e retorna uma lista de listas de números inteiros.
Experimente online!
Quão?
Queremos todas as listas classificadas de números inteiros únicos entre um e N, de modo que o primeiro seja um, o último seja N e todos os pares se dividam. O código alcança esse filtro verificando se os critérios de divisão por pares são satisfeitos no conjunto de potência do intervalo em questão, mas apenas escolhendo aqueles com somas máximas de diferença incremental (os que começam com um e terminam com N terão soma das diferenças incrementais de N-1, outras terão menos).
fonte
<slice>2<divisible>\<each>
: PƝ
vez de `2 'por 11 bytes .Japonês , 17 bytes
Teste online!
Estranhamente, gerar a saída como uma string era muito mais fácil do que gerá-la como uma matriz de matrizes ...
Explicação
fonte
¬
truque! : p¬
é uma das razões pelas quais eu já implementados um monte de funções que são basicamente "fazer X dado sem argumentos, ou Y dado um argumento truthy": PMathematica, 60 bytes
Usa a forma multi-arg não documentada de
Divisible
ondeDivisible[n1,n2,...]
retornaTrue
sen2∣n1
,n3∣n2
e assim por diante, eFalse
de outra forma. Pegamos todaSubsets
a lista deDivisors
entradas e#
, em seguida, retornamosCases
a forma{1,___,#}
queDivisible
forneceTrue
aReverse
sequência d dos divisores.fonte
Divisible
é basicamente um builtin para verificar uma cadeia de gozinta?Haskell, 51 bytes
Encontre recursivamente cadeias gozinta de divisores adequados e acrescente
n
.Experimente online!
fonte
1
. Como concluímos a isenção coletivamente1
, você poderia economizar 10 bytes removendo esse caso?1
não é um caso especial para esse algoritmo, é necessário como caso base para a recursão. Por si só, a segunda equação que define apenas pode retornar a lista vazia.[[1]]
como base também.Haskell (Lambdabot),
9285 bytesPrecisa do Lambdabot Haskell, pois
guard
requerControl.Monad
que seja importado. A função principal é uma função anônima, que me disseram que é permitida e retira alguns bytes.Agradecemos a Laikoni por salvar sete bytes.
Explicação:
Mônadas são muito úteis.
Esta é a nossa função recursiva que faz todo o trabalho real.
x
é o número que estamos acumulando (o produto dos divisores que permanecem no valor) ey
é o próximo número que devemos tentar dividir nele.Se for
x
igualy
, terminamos de repetir. Basta usarx
como o final da corrente gozinta atual e devolvê-lo.Haskell golf-ism para "True". Ou seja, este é o caso padrão.
Estamos operando dentro da lista mônada agora. Na mônada da lista, temos a capacidade de fazer várias escolhas ao mesmo tempo. Isso é muito útil ao encontrar "tudo possível" de algo por exaustão. A
guard
declaração diz "considere apenas a seguinte opção se uma condição for verdadeira". Nesse caso, considere apenas a seguinte opção sey
dividirx
.Se
y
dividirx
, temos a opção de adicionary
à cadeia gozinta. Nesse caso, chame recursivamente(#)
, começandoy = 2
comx
igual ax / y
, pois queremos "fatorar" quey
acabamos de adicionar à cadeia. Então, qualquer que seja o resultado dessa chamada recursiva, multiplique seus valores peloy
que acabamos dey
fatorar e adicione oficialmente à cadeia gozinta.Considere a seguinte opção também. Isso simplesmente adiciona as duas listas, mas, monadicamente, podemos pensar nisso como dizendo "escolha entre fazer essa coisa OU essa outra coisa".
A outra opção é simplesmente continuar recorrendo e não usar o valor
y
. Sey
não se dividirx
, esta é a única opção. Sey
dividirx
, esta opção será usada, assim como a outra opção, e os resultados serão combinados.Esta é a principal função gozinta. Inicia a recursão chamando
(#)
com seu argumento. A1
é anexado a todas as cadeias gozinta, porque a(#)
função nunca as coloca nas cadeias.fonte
mod x y==0
pode ser reduzido paramod x y<1
. Como funções anônimas são permitidas, sua função principal pode ser escrita como pointfreemap(1:).(#2)
.Haskell,
10710095 bytesTalvez exista uma melhor condição de terminação (tentei algo como
mas é mais longo). A verificação
1
parece prudente, pois a repetição1
ou eliminação de repetições (ounub
nãoPrelude
) é mais bytes.Experimente online.
fonte
(>>=h)
for(concatMap h)
u
...JavaScript (Firefox 30-57), 73 bytes
Convenientemente
n%0<1
é falso.fonte
Geléia , 17 bytes
Experimente online!
fonte
1
é inesperado, no entanto. Não consegui encontrar um resultado definitivo para1
, mas presumi que fosse[[1]]
. Não posso dizer com certeza que isso[1,1]
esteja incorreto, exceto que todos os outros resultados são sequências crescentes. Pensamentos?;€
por;Q¥€
).Mathematica, 104 bytes
fonte
FreeQ[...]
pode se tornarAnd@@BlockMap[#∣#2&@@#&,#,2,1]
Developer
PartitionMap :: nlen: - Texto da mensagem não encontrado - >> `por que isso?BlockMap
usa aDeveloper`PartitionMap
função internamente, mas como é uma função de desenvolvedor, não possui mensagens de erro. O erro é causado pelas listas que possuem 1 ou 0 elementos, com os quais você não pode criar 2 partições.Mathematica, 72 bytes
Explicação
Encontre todos os divisores da entrada.
Gere todos os subconjuntos dessa lista.
Escolha todos os casos que correspondem ao padrão ...
Começando com 1 e terminando com
<input>
...e satisfaz a condição ...
O elemento esquerdo divide o elemento direito para todas as 2 partições da lista, deslocamento 1.
fonte
TI-BASIC, 76 bytes
Explicação
Eu poderia salvar outros 5 bytes se for permitido sair com um erro em vez de normalmente, removendo a verificação Ans> 1 e a condição do loop. Mas não estou confiante de que isso seja permitido.
fonte
Mathematica
8677 BytesForça bruta pela definição.
Desejando que houvesse uma maneira mais curta de comparar elementos sequenciais em pares de uma lista.
Obrigado a @Jenny_mathy e @JungHwanMin pelas sugestões de salvar 9 bytes
fonte
FreeQ[#∣#2&@@@Partition[#,2,1],1>2]&]
(como o segundo argumento) para ir para 82 bytesAnd@@BlockMap[#∣#2&@@#&,#,2,1]
Casca ,
1716 bytes-1 byte, graças ao Zgarb
Experimente online!
fonte
50
a entrada e o tempo esgotou. Qual é a essência da sua abordagem?o`:⁰:1
pode ser`Je1⁰
PHP
147141Editado para remover um teste redundante
Explicado:
15 caracteres de clichê :(
Inicie o conjunto de resultados
[[1]]
como cada cadeia começa com 1. Isso também leva ao suporte a 1 como uma entrada.Para cada número de 2 a
$i
, vamos estender cada cadeia em nosso conjunto pelo número atual se ele gozinta , em seguida, adicione a cadeia estendida ao nosso conjunto de resultados.Filtre nossas cadeias intermediárias que não conseguiram
$i
10 caracteres de clichê :(
fonte
Mathematica
A resposta é armazenada em cache para chamadas adicionais.
fonte