Objectif
Ecrivez une fonction ou un programme qui trie un tableau d'entiers dans l'ordre décroissant du nombre de 1 présents dans leur représentation binaire. Aucune condition de tri secondaire n'est nécessaire.
Exemple de liste triée
(en utilisant des entiers 16 bits)
Dec Bin 1's
16375 0011111111110111 13
15342 0011101111101110 11
32425 0111111010101001 10
11746 0010110111100010 8
28436 0000110111110100 8
19944 0100110111101000 8
28943 0000011100011111 8
3944 0000011111101000 7
15752 0011110110001000 7
825 0000000011111001 6
21826 0101010101000010 6
Contribution
Un tableau d'entiers 32 bits.
Sortie
Un tableau des mêmes entiers triés comme décrit.
Notation
Il s'agit du code golf pour le plus petit nombre d'octets à sélectionner en une semaine.
Réponses:
J (11)
C'est une fonction qui prend une liste:
Si vous voulez lui donner un nom, cela coûte un caractère supplémentaire:
Explication:
\:
: trier vers le bas+/
: somme de"1
: chaque rangée de#:
: représentation binairela source
\:1#.#:
ce qui sauve quelques octets.JavaScript, 39
Mise à jour: maintenant plus court que Ruby.
40
Explication:
q est une fonction récursive. Si x ou y sont 0, il retourne
x-y
(un nombre négatif si x est zéro ou un nombre positif si y est zéro). Sinon, il supprime le bit le plus bas (x&x-1
) de x et y et se répète.Version précédente (42)
la source
~y
travailler au lieu de-!y
?!x|-!y
devient non nulle.~
ne rentre pas vraiment dans la mesure où il est non nul pour beaucoup d'entrées (y compris zéro)Rubis 41
Tester:
la source
Python 3 (44):
la source
Common Lisp, 35
logcount
renvoie le nombre de bits sur un nombre. Pour une listel
, nous avons:En tant que fonction autonome, et sur quoi je baserai l'octet:
la source
Python 3,
90777267 caractères.Notre solution prend une entrée de la ligne de commande et imprime le nombre par ordre décroissant (67 caractères) ou croissant (66).
Ordre décroissant
Merci à @daniero , pour la suggestion d'utiliser un moins dans le nombre de 1 pour l'inverser, au lieu d'utiliser une tranche pour inverser le tableau à la fin! Cela a effectivement sauvé 5 personnages.
Juste pour le poster, la version à ordre croissant (la première que nous avons créée) prendrait un caractère de moins.
Ordre croissant :
Merci à @Bakuriu pour la suggestion clé = lambda x… . ;RÉ
la source
0
sera toujours une partie de votre sortie alors; Ce n'est pas correctraw_input()
et supprimer des caractères?[]
intérieursorted
. Le résultat de ce programme est également le nombre de 1 dans les nombres en entrée triés, mais vous devez indiquer le nombre que vous avez reçu en entrée, trié en fonction du nombre de1
s. Quelque chose comme:print(sorted(input().split(), key=lambda x:bin(int(x)).count('1')))
serait correct.JavaScript [76 octets]
où
a
est un tableau d'entrée de nombres.Tester:
la source
..
marche? Je crois comprendre que si devientx = 5
alors ce qui est, je suppose, invalide. Merci.eval(x + r)
eval(5..toString(2).match(/1/g).length)
'string'.length
ou[1,2,3].pop()
. En cas de nombre, vous pouvez faire la même chose, mais gardez à l'esprit qu'après un seul point, l'analyseur cherchera une fraction du nombre en attente d'une valeur flottante (comme dans123.45
). Si vous utilisez un nombre entier , vous devez « dire » l'analyseur qu'une partie décimale est vide, la fixation d' un point supplémentaire avant d' aborder une propriété:123..method()
.match(/1/g).length
parreplace(/0/g,"")
.a.sort(function(x,y){r='..toString(2).match(/1/g).length';return eval(y+r+-x+r)})
Mathematica 30
Usage:
la source
k [15 caractères]
Exemple 1
Exemple 2 (tous les nombres sont 2 ^ n -1)
la source
Mathematica 39
IntegerDigits[#,2]
convertit un numéro de base 10 en liste de 1 et de 0.Tr
résume les chiffres.Cas de test
la source
Java 8 -
87/11381/11160/8060/74/48 caractèresCe n'est pas un programme Java complet, c'est juste une fonction (une méthode, pour être exact).
Il suppose cela
java.util.List
etjava.lang.Long.bitCount
est importé et comporte 60 caractères:Si aucun élément pré-importé n'est autorisé, le voici avec 74 caractères:
Ajoutez plus de 7 caractères si nécessaire
static
.[4 ans plus tard] Ou si vous préférez, cela pourrait être un lambda (merci @KevinCruijssen pour la suggestion), avec 48 octets:
la source
Integer.bitCount(x)<Integer.bitCount(y)?-1:1;
? Avez-vous besoin du-1,0,1
comportement?<Integer>
avec de l'espace?Long
pour gagner de la place :)a.sort((x,y)->Long.bitCount(x)-Long.bitCount(y));
Python 2.x - 65 caractères (octets)
C'est en fait 66 caractères, 65 si nous en faisons une fonction (alors vous avez besoin de quelque chose pour l'appeler qui est plus facile à présenter).
Démo dans Bash / CMD:
la source
sum(int(d)for d in bin(x)[2:])
àsum(map(int,bin(x)[2:]))
print sorted(input(),key=lambda x:-bin(x).count('1'))
Matlab, 34 ans
Entrée dans 'a'
Fonctionne pour les nombres non négatifs.
la source
C - 85 octets (
108106 octets)Version portable sur GCC / Clang / où qu'elle
__builtin_popcount
soit disponible (106 octets):Version MSVC uniquement ultra-condensée, non-portable, à peine fonctionnelle (85 octets):
Première nouvelle ligne incluse dans le nombre d'octets en raison de la
#define
, les autres ne sont pas nécessaires.La fonction à appeler est
s(array, length)
conforme aux spécifications.Peut coder
sizeof
en dur dans la version portable pour enregistrer 7 autres caractères, comme le faisaient quelques autres réponses en C. Vous ne décidez pas lequel vaut le mieux en termes de rapport longueur / convivialité.la source
sizeof l
enregistre un octet. L'horriblement laid#define p-__builtin_popcount(
peut aider à sauver un autre.PowerShell v3,
615853Le ScriptBlock de la
Sort-Object
cmdlet renvoie un tableau de 1 pour chaque 1 dans la représentation binaire du nombre.Sort-Object
trie la liste en fonction de la longueur du tableau retourné pour chaque nombre.Éxécuter:
la source
$f={
est redondant,while
->for
,-band1
->%2
,-des
->-d
et d’autres tours de golf. C'est clair. Pouvez-vous expliquer comment travailler$args|sort{@(1,1,...,1)}
? C'est du travail! Comment le type compare les tableaux sans explicite.Count
? où lire à ce sujet? Merci!help Sort-Object -Parameter property
Je ne sais pas où la propriété de tri par défaut est définie pour les types, mais pour les tableaux, il s'agit du nombre ou de la longueur.$args|sort{while($_){if($_-band1){$_};$_=$_-shr1}}-des
donne un résultat erroné. Par conséquent, ce n'est pasCount
. C'est très intéressant. Merci encore.ECMAScript 6, 61
Assume
z
est l'entréeDonnées de test
Merci, brosse à dents pour la solution plus courte.
la source
z.sort((a,b)=>{c=d=e=0;while(++c<32)d+=a>>c&1,e+=b>>c&1},e-d)
(et merci pour le vote positif).R ,
1329694888475735351 octets-20 grâce à la mise en œuvre de J.Doe -2 plus grâce à Giuseppe
Mon post original:
Essayez-le en ligne!
J'ai essayé plusieurs méthodes différentes avant d'arriver à ce résultat.
Méthode matricielle: Création d'une matrice à deux colonnes, une colonne avec le vecteur d'entrée, une de la somme de la représentation binaire, puis j'ai trié sur la somme de binaire.
Non-Matrix: Réalisé, je pouvais jeter la fonction de matrice et créer un vecteur de valeurs binaires, les additionner, les ordonner, puis utiliser les valeurs ordonnées pour réorganiser le vecteur d'entrée.
Des changements mineurs
Autres modifications mineures Conversion de la totalité d'un élément en une ligne de code au lieu de deux séparées par un point-virgule.
Méthode Sum Au lieu d'ajouter les colonnes avec
colSums
la matrice binaire créée parsapply
, j'ai ajouté les éléments de la colonne avantsapply
"terminé".Diminution de la valeur de revenant Je voulais vraiment raccourcir décroissant, mais R me reproche si j'essaie de raccourcir
decreasing
laorder
fonction, ce qui était nécessaire pour que l'ordre souhaitéorder
augmente par défaut, puis je me souvenais de larev
fonction permettant d'inverser un vecteur. EUREKA !!! La dernière modification de la solution finale étaitfunction
depryr::f
sauver 2 autres octetsla source
Haskell, 123C
C'est la première façon dont j'ai pensé résoudre ce problème, mais je parie qu'il existe un meilleur moyen de le faire. De plus, si quelqu'un connaissait un moyen de golfer les importations Haskell, je serais très intéressé de l'entendre.
Exemple
Version non-golfée (avec explications)
la source
mod
,n`mod`2
? Il a la même priorité que la multiplication et la division.CoffeeScript (94)
Code lisible (212):
Optimisé (213):
Obscurcissement (147):
Les opérateurs ternaires sont excessivement longs (129):
Trop long encore, arrêtez de lancer (121):
Finale (94):
la source
Smalltalk (Smalltalk / X), 36 (ou peut-être 24)
entrée dans un; trie de manière destructive dans un:
version fonctionnelle: renvoie un nouveau tableau trié:
il existe même une variante plus courte (en passant le nom ou la fonction en argument) dans 24 caractères. Mais (soupir), cela triera en dernier. Si j'ai bien compris, cela n'a pas été demandé, je ne prends donc pas cela pour un score de golf:
la source
PHP 5.4+ 131
Je ne sais même pas pourquoi je m'embête avec PHP, dans ce cas:
Usage:
la source
Scala, 58
la source
DFSORT (produit de tri IBM Mainframe) 288 (chaque ligne source compte 72 caractères et doit comporter un espace en position un)
Juste pour le plaisir, et pas de mathématiques.
Prend un fichier (peut être exécuté depuis un programme utilisant un "tableau") avec les entiers. Avant le tri, il convertit les nombres entiers en bits (dans un champ de 16 caractères). Puis change les zéro dans les bits à rien. SORT Décroissant sur le résultat des bits modifiés. Crée le fichier trié avec uniquement les entiers.
la source
C
la source
C #,
8889Edit: ordre décroissant ajoute un caractère.
la source
Javascript 84
Inspiré par d'autres réponses javascript, mais sans eval ni regex.
la source
Javascript (82)
la source
Postscript, 126
Étant donné que la liste des valeurs par lesquelles nous effectuons le tri est connue à l’avance et très limitée (32), cette tâche peut être effectuée facilement, même en l’absence de fonction de tri intégrée, en sélectionnant les valeurs correspondantes pour 1..32. (Est-ce O (32n)? Probablement).
La procédure attend un tableau sur la pile et retourne un tableau 'trié'.
Ou, rituellement dépourvu d'espace blanc et de lisibilité:
Ensuite, s’il est sauvegardé,
bits.ps
il peut être utilisé comme ceci:Je pense que c'est effectivement le même que ce Perl (il n'y a pas encore de Perl ici aussi):
Bien que cela , contrairement à Postscript, puisse être facilement joué au golf:
la source
C -
124111Implémenté en tant que méthode et en utilisant la bibliothèque standard pour le tri. Un pointeur sur le tableau et la taille doivent être passés en tant que paramètres. Cela ne fonctionnera que sur des systèmes avec des pointeurs 32 bits. Sur les systèmes 64 bits, certains caractères doivent être utilisés pour spécifier les définitions de pointeur.
Indentation pour la lisibilité
Exemple d'appel:
la source
Java 8: 144
Sous forme développée:
Comme vous pouvez le constater, cela fonctionne en convertissant le
args
en aStream<String>
, puis en unStream<Integer>
avec laInteger::decode
référence de fonction (plus court queparseInt
ouvalueOf
), puis en triantInteger::bitCount
, en le plaçant dans un tableau et en l'imprimant.Les flux rendent tout plus facile.
la source