Chaînes de Gozinta
(Inspiré du projet Euler n ° 606 )
Une chaîne de gozinta pour n est une séquence {1,a,b,...,n}
où chaque élément divise correctement le suivant. Par exemple, il y a huit chaînes gozinta distinctes pour 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}.
Le défi
Ecrivez un programme ou une fonction qui accepte un entier positif ( n > 1
) et affiche ou renvoie toutes les chaînes gozinta distinctes pour le nombre donné.
- L'ordre dans les chaînes est important (croissant), l'ordre des chaînes ne l'est pas.
- Au hasard, il existe, vous ne pouvez pas utiliser une fonction intégrée qui résout le problème.
- C'est du code-golf .
Edit: Supprimer 1
comme entrée potentielle.
code-golf
sequence
arithmetic
Parapluie
la source
la source
[[1]]
je dirais que si[1,1]
c'est un gozinta d'1
alors,[1,1,12]
c'est un gozinta de12
tel quel[1,1,1,12]
et maintenant nous pouvons le faire. ne plus "rendre tous ..."2|4
est lu "deux va en quatre" aka "deux gozinta quatre".Réponses:
Python 3 ,
6865 octetsEdit: -3 octets grâce à @notjagan
Essayez-le en ligne!
Explication
Chaque chaîne de gozinta se compose du nombre
x
à la fin de la chaîne, avec au moins un diviseur à la gauche de celle-ci. Pour chaque diviseurk
desx
chaînes[1,...,k,x]
sont distinctes. On peut donc pour chaque diviseurk
trouver l' ensemble de ses différentes chaînes gozinta et appendx
à la fin d'entre eux, pour obtenir toutes les différentes chaînes gozinta aveck
directement à la gauche dex
. Ceci est fait de manière récursive jusqu'à cex = 1
que[[1]]
soit retourné où , toutes les chaînes de gozinta commençant par 1, ce qui signifie que la récursivité est au plus bas .Le code devient tellement court en raison de la compréhension de la liste Python permettant une double itération. Cela signifie que les valeurs trouvées dans
f(k)
peuvent être ajoutées à la même liste pour tous les diviseurs différentsk
.la source
Coque , 13 octets
Une approche quelque peu différente de celle de H.PWiz , mais toujours par force brute. Essayez-le en ligne!
Explication
L'idée de base est de concaténer toutes les sous-séquences de
[1,...,n]
et de scinder le résultat en sous-listes, chaque élément se divisant le suivant. Parmi ceux-ci, nous conservons ceux qui commencent par1
, se terminentn
et ne contiennent aucun doublon. Ceci est fait avec le "rangify" intégré…
. Ensuite, il reste à éliminer les doublons.la source
Gelée ,
9 à8 octetsEssayez-le en ligne!
Utilise une technique similaire à ma réponse Japt et s'exécute donc très rapidement sur les cas de test plus volumineux.
Comment ça marche
la source
Mathematica, 77 octets
Les formes a
Graph
où les sommets sont lesDivisors
entrées#
et où les arêtes représentent la divisibilité appropriée, puis recherche desAll
chemins allant du sommet1
au sommet#
.la source
Gelée , 12 octets
Un lien monadique acceptant un entier et renvoyant une liste de listes d'entiers.
Essayez-le en ligne!
Comment?
Nous voulons toutes les listes triées d'entiers uniques compris entre un et N tels que la première soit un, la dernière est N et que toutes les paires se divisent. Le code réalise ce filtre en vérifiant que le critère de division par paires est satisfait sur la puissance de la plage en question, mais en sélectionnant uniquement celles avec les sommes maximales de différence incrémentielle (celles qui commencent par un et se terminent par N auront une somme de différences incrémentielles de N-1, les autres auront moins).
la source
<slice>2<divisible>\<each>
: PƝ
au lieu de «2» pour 11 octets .Japt , 17 octets
Testez-le en ligne!
Bizarrement, générer la sortie sous forme de chaîne était beaucoup plus simple que de le générer sous forme de tableau de tableaux ...
Explication
la source
¬
tour! : p¬
est l'une des raisons pour lesquelles j'ai implémenté un ensemble de fonctions qui sont fondamentalement "ne donne X aucun argument, ou Y donne un argument de vérité": PMathematica, 60 octets
Utilise le formulaire multi-arg non documentée de
Divisible
, où lesDivisible[n1,n2,...]
rendementsTrue
sin2∣n1
,n3∣n2
et ainsi de suite, etFalse
autrement. Nous prenons touteSubsets
la liste desDivisors
entrées#
, puis nous retournonsCases
la forme{1,___,#}
telle qu'elleDivisible
donneTrue
laReverse
séquence d de diviseurs.la source
Divisible
est-ce qu’il s’agit essentiellement de vérifier une chaîne de gozinta?Haskell, 51 octets
Trouvez récursivement les chaînes de gozinta de diviseurs appropriés et ajoutez-les
n
.Essayez-le en ligne!
la source
1
. Puisque nous avons collectivement conclu à l'exemption1
, pourriez-vous économiser 10 octets en supprimant ce cas?1
n'est pas un cas particulier pour cet algorithme, il est nécessaire comme cas de base pour la récursivité. À elle seule, la deuxième équation qui définit ne peut que renvoyer la liste vide.[[1]]
comme base.Haskell (Lambdabot),
9285 octetsA besoin de Lambdabot Haskell car
guard
nécessiteControl.Monad
d'être importé. La fonction principale est une fonction anonyme, qui, me dit-on, est autorisée et supprime quelques octets.Merci à Laikoni pour avoir économisé sept octets.
Explication:
Les monades sont très utiles.
C'est notre fonction récursive qui fait tout le travail réel.
x
est le nombre sur lequel nous accumulons (le produit des diviseurs qui restent dans la valeur), ety
est le prochain nombre que nous devrions essayer de diviser en ce nombre.Si
x
égaux,y
alors nous avons terminé récursif. Utilisez simplementx
la fin de la chaîne gozinta actuelle et renvoyez-la.Haskell golf-ism pour "True". C'est le cas par défaut.
Nous opérons maintenant dans la liste de la monade. Dans la monade de liste, nous avons la possibilité de faire plusieurs choix en même temps. Ceci est très utile pour trouver "tout ce qui est possible" de quelque chose par épuisement. L’
guard
énoncé dit "n’envisagez le choix suivant que si une condition est vraie". Dans ce cas, ne considérez le choix suivant que siy
divisex
.Si
y
divisex
, nous avons le choix d'ajoutery
à la chaîne de gozinta. Dans ce cas, appelez récursivement(#)
, en partanty = 2
dex
zérox / y
, puisque nous voulons "factoriser" ce quey
nous venons d'ajouter à la chaîne. Ensuite, quel que soit le résultat de cet appel récursif, multipliez ses valeurs par celles quey
nous venons de factoriser et ajoutonsy
officiellement à la chaîne de gozinta.Considérez également le choix suivant. Cela ajoute simplement les deux listes ensemble, mais monadiquement, nous pouvons penser que "choisir entre faire cette chose OU cette autre chose".
L'autre option consiste simplement à continuer à récursir et à ne pas utiliser la valeur
y
. Siy
ne divise pasx
alors c'est la seule option. Siy
divisex
alors cette option sera prise ainsi que l'autre option, et les résultats seront combinés.C'est la fonction principale de gozinta. Il commence la récursion en appelant
(#)
avec son argument. A1
est ajouté à chaque chaîne gozinta, car la(#)
fonction ne les met jamais dans les chaînes.la source
mod x y==0
peut être raccourci àmod x y<1
. Comme les fonctions anonymes sont autorisées, votre fonction principale peut être écrite en tant que pointfreemap(1:).(#2)
.Haskell,
10710095 octetsPeut-être y at-il une meilleure condition de résiliation (essayé quelque chose comme
mais c'est plus long). La vérification
1
semble prudente, car le nettoyage des répétitions1
ou des doublons (nub
pas dansPrelude
) correspond à plus d'octets.Essayez-le en ligne.
la source
(>>=h)
pour(concatMap h)
u
...JavaScript (Firefox 30-57), 73 octets
Idéalement,
n%0<1
c'est faux.la source
Gelée , 17 octets
Essayez-le en ligne!
la source
1
est inattendu, cependant. Je n'ai pas réussi à trouver un résultat définitif pour1
, mais j'ai supposé que c'était le cas[[1]]
. Je ne peux pas dire avec certitude que[1,1]
c'est inexact, sauf que tous les autres résultats sont des séquences croissantes. Pensées?;€
par;Q¥€
).Mathematica, 104 octets
la source
FreeQ[...]
peut devenirAnd@@BlockMap[#∣#2&@@#&,#,2,1]
Developer
PartitionMap :: nlen: - Texte du message non trouvé - >> `pourquoi est-ce?BlockMap
utilise laDeveloper`PartitionMap
fonction en interne, mais comme il s’agit d’une fonction de développement, elle ne contient aucun message d’erreur. L'erreur est provoquée par les listes qui ont 1 ou 0 éléments, avec lesquels vous ne pouvez pas créer 2 partitions.Mathematica, 72 octets
Explication
Trouver tous les diviseurs de l'entrée.
Générez tous les sous-ensembles de cette liste.
Choisissez tous les cas qui correspondent au motif ...
Commençant par 1 et se terminant par
<input>
...et satisfait à la condition ...
L'élément de gauche divise l'élément de droite pour toutes les 2 partitions de la liste, décalage 1.
la source
TI-BASIC, 76 octets
Explication
Je pourrais économiser 5 octets supplémentaires s'il est autorisé à quitter avec une erreur plutôt qu'en douceur, en supprimant le contrôle Ans> 1 et la condition de boucle. Mais je ne suis pas convaincu que c'est permis.
la source
Mathematica
8677 octetsForce brute selon la définition.
Souhaitant qu'il y ait un moyen plus court de faire la comparaison séquentielle par éléments d'une liste.
Merci à @Jenny_mathy et à @JungHwanMin pour leurs suggestions permettant d’économiser 9 octets.
la source
FreeQ[#∣#2&@@@Partition[#,2,1],1>2]&]
(comme second argument) pour accéder à 82 octetsAnd@@BlockMap[#∣#2&@@#&,#,2,1]
Husk ,
17 à16 octets-1 octet, merci à Zgarb
Essayez-le en ligne!
la source
50
l'entrée et le délai a expiré. Quel est le sens de votre approche?o`:⁰:1
peut être`Je1⁰
PHP
147141Édité pour supprimer un test redondant
A expliqué:
15 caractères du passe-partout :(
Initialisez le jeu de résultats à
[[1]]
chaque chaîne commençant par 1. Ceci conduit également à prendre en charge 1 comme entrée.Pour chaque nombre de 2 à
$i
, nous allons étendre chaque chaîne dans notre série par le nombre actuel si elle gozinta , puis, ajoutez la chaîne étendue à notre jeu de résultats.Filtrer nos chaînes intermédiaires qui ne l'ont pas fait
$i
10 caractères du passe-partout :(
la source
Mathematica
La réponse est mise en cache pour des appels supplémentaires.
la source