On vous donne un ensemble d'entiers positifs. Vous devez les disposer en paires de sorte que:
- Chaque paire contient 2 nombres, dont l'un est un multiple d'un autre. Par exemple, 8 est un multiple de 4 et 9 est un multiple de 9.
- Si le même nombre se produit plusieurs fois dans l'ensemble initial, il peut être utilisé autant de fois dans les paires; un nombre peut même être associé à une autre occurrence du même nombre
- Le nombre maximal de paires possible est obtenu.
La sortie doit être le nombre de paires. Le code le plus court gagne.
Exemples de données
2,3,4,8,9,18
-> 3
7,14,28,42,56
-> 2
7,1,9,9,4,9,9,1,3,9,8,5
-> 6
8,88,888,8888,88888,888888
-> 3
2,6,7,17,16,35,15,9,83,7
-> 2
code-golf
math
number
number-theory
permutations
ghosts_in_the_code
la source
la source
2,3,4,8,9,18
. (Chaque nombre dans cette liste est un facteur et / ou un multiple d'au moins deux autres nombres dans la liste, mais il n'a qu'une seule solution.)Réponses:
Haskell,
1091077670 octetsMerci à nimi d'avoir économisé 33 octets et de m'avoir appris un peu plus de Haskell. :)
Merci à xnor pour avoir sauvé encore 6 octets.
Oui, mon premier golf Haskell. Cela fonctionne de la même manière que toutes les réponses jusqu'à présent (enfin, pas tout à fait: il ne compte que la longueur du préfixe le plus long des paires valides dans chaque permutation, mais c'est équivalent et c'est en fait ce que mon code CJam original a fait).
Pour plus de golfitude, il est également très inefficace en générant récursivement toutes les permutations du suffixe chaque fois que les deux premiers éléments d'une permutation sont une paire valide.
la source
f=
nécessaire?chunksOf
est douloureuse. Je ne connais pas vraiment la bibliothèque standard de Haskell pour savoir s'il existe une fonction équivalente plus courte. J'ai essayé de l'implémenter moi-même, mais il est sorti deux ou trois octets de plus que l'importation.[]
et[_]
en même temps en mettant leg x=[]
deuxième est vraiment intelligent. Je vais essayer. Merci :)f l=maximum$0:[1+f t|(a:b:t)<-permutations l,a`mod`b<1]
.CJam,
2218 octetsEssayez-le en ligne.
Attend une entrée sous la forme d'une liste de style CJam.
C'est un peu inefficace pour les grandes listes (et Java manquera probablement de mémoire à moins que vous ne lui en donniez plus).
Explication
la source
[1 2 3 4 5 6 7 8 9 10]
Cependant,[7 1 9 9 4 9 9 1 3 9 8 1]
qui est une liste plus longue, fonctionne correctement. Pourquoi donc?10! = 3628800
, mais12! / 5! / 3! = 665280
. Il manque donc de mémoire pour le premier cas. Si vous l'exécutiez à partir de la console avec l'interpréteur Java, vous pourriez dire à Java d'utiliser plus de mémoire et le premier cas fonctionnerait également (bien que cela puisse prendre un certain temps, je ne sais pas).Pyth, 13 octets
Le temps et la complexité du stockage sont vraiment terribles. La première chose que je fais est de créer une liste avec toutes les permutations de la liste d'origine. Cela prend du
n*n!
stockage. Les listes d'entrée de longueur 9 prennent déjà assez de temps.Essayez-le en ligne: démonstration ou suite de tests
Explication:
la source
Mathematica,
95938783796058 octetsPrend quelques secondes pour les exemples plus grands.
la source
Matlab (120 + 114 = 234)
principale:
la fonction topper est appelée par la partie principale.
l'entrée est sous la forme
[. . .]
la source
Matlab (365)
C'est apparemment plus long, mais oneliner et exécutif, et j'ai réussi à échapper à la
perms
fonction car cela prend une éternité.Cette fonction prend de nombreuses reprises pour fonctionner correctement grâce aux fonctions anonymes, je suis ouvert aux suggestions ici :)
la source