Créez un programme qui calcule le poids de hamming d'une chaîne. Winner est le programme avec le poids le plus faible.
Règles:
- Le poids de Hamming pour un caractère ASCII est défini comme le nombre total de bits définis
1
dans sa représentation binaire. - Supposons que le codage d'entrée est ASCII 7 bits, transmis via le mécanisme d'entrée normal pour votre langue (par exemple stdin, args, etc.)
- Exportez le résultat, sous forme de nombre, vers stdout ou tout autre mécanisme de sortie par défaut / normal utilisé par votre langue.
- Cela devrait aller de soi, mais vous devez être en mesure d' exécuter le programme, dans la vraie vie, pour qu'il soit une solution valide.
- Winner est la solution dont le code a le poids le plus faible.
Désolé, aucune solution en blanc pour celui-ci!Ok, vous pouvez coder en espace maintenant j'ai trié les règles :)
Exemples par caractère:
char | binary | weight
-----+----------+-------
a | 01100001 | 3
x | 01111000 | 4
? | 00111111 | 6
\x00 | 00000000 | 0
\x7F | 01111111 | 7
code-golf
binary
number-theory
Polynôme
la source
la source
0x20
/ ASCII 32 comme référence, le poids du bourdonnement n'est-il pas dehello world
10 plutôt que de 11?hello world
11? Seuls 10 caractères sont différents d'un espace. Aussi - le poids de Hamming d'un programme semble être juste sa longueur, à l'exclusion des espaces. Pas si différent du golf à code normal.~
ETo
.Réponses:
J (33)
Un de moins de 34!
Fortement inspiré par cette réponse , mais un poids inférieur à un.
la source
J, poids 34
Utilisation - placez la chaîne à mesurer entre guillemets à la fin:
Alternativement, en prenant l'entrée du clavier (poids 54):
la source
J , 39
Il s'agit d'une fonction prenant un argument. (Ou remplacez-
]
le directement par la chaîne; comme le note Gareth, cela réduit le coût à 34.)la source
Python, 189
la source
print(sum(bin(ord(A)).count('1')for A in input()))
, a un score de 180.QBasic,
322311286264Le bon outil pour le travail, ça craint toujours bien sûr.
la source
Unaire 0
Vous saviez tous que ça allait arriver. Tout d'abord le programme BrainFuck:
J'ai ajouté des nouvelles lignes pour le rendre "lisible" mais il a un poids de Hamming de 4066. Il fonctionne en obtenant à plusieurs reprises le quotient / les restes d'une chaîne d'entrée et en additionnant tous les restes. Bien sûr, si vous l'exécutez sur lui-même, vous obtenez: 226 (4066% 256) (techniquement \ xe2) si clairement qu'il se déclare vainqueur.
Maintenant, nous le convertissons en Unary et obtenons
Nous utilisons une implémentation unaire avec des caractères NULL \ x00 pour '0' et boom, ce qui entrave le poids de 0.
Question bonus : pour quels caractères ASCII
c
pouvez-vous exécuter ce programme sur une chaîne composée deN
répétitions et le faire sortir ce caractère. (EG une chaîne de 32 espaces donne un espace). Quelles valeurs duN
travail (soit un nombre infini d'entre elles fonctionnera, soit aucune ne fonctionnera).la source
main(){ bignum Unarynum = 0; int c; while(EOF!=(c=readchar())){ Unarynum++; } return Unarynum; }
Peu importe ce que vous choisissez d'être votre personnage Unary (tant qu'il n'est pas EOF).C, poids
322263256Le poids du hamming est-il important?
Utilisé principalement des techniques de golf standard.
Une seule boucle calcule le poids (décalage vers la droite et ajout jusqu'à zéro) et analyse la chaîne (avance le pointeur lorsque le zéro est atteint).
En supposant
D
est initialisé à 2 (paramètre unique).Optimisations spécifiques au poids de Hamming:
1.
ABDH
, avec un poids de 2 chacun, utilisé pour les noms.2.
*++H
préféré àH[1]
.la source
main(D,H,A)char*A,**H;{for(A=*++H;*A;A+=!(*A/=2))if(*A%2)printf("@");}
@
avait un chiffre dans le système unaire. Je pensais qu'il n'utilisait que0
..0
. Mais si vous voulez y aller,printf("@"+*a%2)
c'est plus court.Golfscript
847258(merci à Howard et Peter Taylor pour leur aide)
Entrée: la chaîne d'entrée doit être sur la pile (passée comme argument de ligne de commande, ou simplement placée sur la pile).
Si vous l'exécutez à partir de la ligne de commande, assurez-vous de l'utiliser
echo -n
, sinon la nouvelle ligne de fin sera également comptée.Sortie: imprime la valeur du poids de freinage sur la console
Le programme peut être testé ici .
la source
BASE
au lieu debase
. Mise à jour: juste vérifié,BASE
ne fonctionne pas. Bonne solution :)TEST
/test
commentaire :) Mais cela ne fonctionne pas.{...}2*
en postulant2base~
en premier lieu. Obtient le score à 72.;
avant la chaîne que vous remplacez par stdin, donc ce(;
n'est pas nécessaire. Puis l'observation de Howard le ramène à 65.Perl, 80 (22 caractères)
Fait et fait:
Ou voici une version alternative avec un poids de 77 (21 caractères):
Je n'aime pas autant cette version, car sa sortie omet la dernière ligne.
Pour calculer le poids, je suppose que je compte les caractères de la manière habituelle (à l'exclusion du
perl -e
/-E
, mais en incluant d'autres caractères d'option). Si, pour une raison quelconque, les gens se plaignent de cela, le mieux que je puisse faire sans options est de 90 (26 caractères):Exemple d'utilisation:
Boom.
la source
Pyth - 15
Avertissement: Cette réponse n'est pas éligible pour gagner car Pyth est plus jeune que ce défi.
Utilise
.B
la représentation binaire et compte le nombre de"1"
.Prend l'entrée dans une chaîne pour enregistrer par
z
rapport àQ
.Essayez-le en ligne ici .
la source
Scala 231
Code d'autotest:
avec modification d'auto-test.
la source
@
et l'espace, que vous n'utilisez pas) ont un poids 2 au moins.Java, poids
931774499454Je pense que c'est la seule réponse pour le moment avec un poids supérieur à 300 environ.
Attend l'entrée comme argument de ligne de commande.
la source
GNOU
sed -r
, 467 + 1(+1 pour l'utilisation de
-r
- ou cela devrait-il être +4?)Sorties sous forme de valeur unaire par ligne source; pour convertir en un total décimal, redirigez la sortie vers
| tr -d "\n" | wc -c
. Compte tous les caractères ASCII imprimables (32-126), plus le saut de ligne (10).Il est difficile d'éviter de lister tous les caractères, mais nous pouvons réduire cela en observant que les lettres minuscules ont un poids de Hamming supérieur à celui des lettres majuscules correspondantes. Nous préférons la nouvelle ligne (score 2) au point-virgule (score 5) comme séparateur d'instructions; nous préférons
@
(score 1) ou!
(score 2) à/
(score 5) comme délimiteur de modèle.Remarque - pour obtenir les bons jeux de caractères, j'ai créé ce tableau à partir de celui de
man ascii
, trié par poids. Ajoutez simplement les scores à droite et en dessous pour obtenir le poids global de chaque personnage:Cela pourrait s'avérer utile à d'autres.
la source
Julia 262
268La version modifiée utilise la fonction pratique 'count_ones' pour une économie de 6 (262)
Ancienne version sans fonction de comptage intégrée (268)
Utilise l'argument de ligne de commande pour l'entrée.
la source
CJam 52 ou 48
Si l'entrée n'est pas déjà sur la pile (52)
Si l'entrée est sur la pile (48)
Par exemple
la source
Julia, HW 199
Avec
ou en insérant directement la chaîne:
La version non golfée (HW 411) ressemble à ceci:
Et pour le plaisir, voici une version optimisée (Hamming Weight 231 ) du point de vue de Bakerg sur le problème:
avec
la source
HPPPL (langage de programmation HP Prime), 74
La calculatrice graphique HP Prime a une fonction hamdist () intégrée. Le poids de hamming de chaque personnage est le même que la distance de hamming de 0.
ASC (chaîne) crée un tableau des valeurs ASCII de chaque caractère d'une chaîne.
hamdist (valeur, 0) calcule la distance de hamming à partir de 0 pour chaque valeur ASCII
sum () résume toutes les valeurs.
Calcul du poids du hamming de son propre code source:
la source
05AB1E , poids 17 (4 octets )
Essayez-le en ligne ou vérifiez d'autres cas de test .
Explication:
la source
Perl 6 , 102
Essayez-le en ligne!
Bien que ce ne soit pas du golf de code, la solution la plus courte semble également avoir le plus petit poids de hamming ...
la source