Le défi est simple
Écrivez un script qui, lorsqu'il reçoit une entrée de chaîne, hachera la chaîne à l'aide de l' algorithme de hachage MD2 , puis renverra soit un entier positif soit une sortie entière négative en fonction du jeu de caractères ci-dessous plus courant dans le hachage résultant sous la forme d'une chaîne hexadécimale:
01234567 - (positive)
89abcdef - (negative)
- L'entrée sera toujours une chaîne, mais peut être de n'importe quelle longueur jusqu'à 65535
- L'entrée entière, espace blanc et tout, doit être hachée
- Aux fins de ce défi, l'entier 0 n'est considéré ni positif ni négatif (voir sortie liée)
- L'ensemble le plus courant est celui dont les caractères sont plus courants dans la chaîne de hachage hexadécimale à 32 caractères
- Votre sortie peut contenir des espaces de fin de tout type, tant que les seuls caractères non blancs sont une sortie true ou falsey valide
- En cas d'égalité, où la chaîne hexadécimale contient exactement 16 caractères de chaque ensemble, le programme doit sortir un 0
Exemples d'E / S
Input: "" (Empty String)
Hash: 8350e5a3e24c153df2275c9f80692773
Output: 1
Input: "The quick brown fox jumps over the lazy cog" (Without quotes)
Hash: 6b890c9292668cdbbfda00a4ebf31f05
Output: -1
Input: "m" (Without quotes)
Hash: f720d455eab8b92f03ddc7868a934417
Output: 0
Critère gagnant
C'est le code-golf , le moins d'octets gagne!
Réponses:
Octave, 35 octets
* Nécessite la dernière version d'Octave (au moins 4.2).
Calcule les décomptes historiques de la chaîne de hachage avec son centre de casiers sont 7 et 8 puis calcule la différence de décomptes.
la source
Mathematica, 43 octets
Affiche le nombre de chiffres en
01234567
moins le nombre de chiffres en89abcdef
.la source
3E
entre 8 et 9 et pas entre 7 et 8.: |JavaScript (ES6), 731 octets
Ce monstre implémente l'algorithme MD2, il est donc d'une longueur embarrassante. Basé sur js-md2 par Chen Yi-Cyuan.
la source
Python 2 + Crypto ,
1089993918778 octetsPython n'a pas de fonction native pour MD2.
12 octets enregistrés grâce à @ovs.
9 octets enregistrés grâce à @FelipeNardiBatista.
la source
lambda s:cmp(sum((int(x,16)<8)-.5for x in MD2.new(s).hexdigest()),0)
devrait réduire le nombre d'octets à 93sum(x<'8'for x ......
lambda s:sum(x<'8'for x in MD2.new(s).hexdigest())-16
pour 78. la sortie peut être n'importe quel nombre, pas seulement-1,0,1
Java 8, 173 octets
-4 merci à dzaima
-128 grâce à Oliver, c'est essentiellement sa réponse maintenant.
Positif pour véridique. Négatif pour falsification. 0 pour 0.
la source
for
if
String s="";for(byte b:bytes)h+=h.format("%02x",b);
. En outre, vous n'avez pas besoin d'écrire un programme complet, mais un lambda suffisent:a->{... return x;}
. Enfin la boucle for peut être remplacée parint x=s.codePoints().filter(c->c>47&&c<56).count();
. Dans l' ensemble, je reçois 173 pour votre algorithme, golfed:a->{String h="";for(byte b:java.security.MessageDigest.getInstance("MD2").digest(a.getBytes()))h+=h.format("%02x",b);return h.codePoints().filter(c->c>47&&c<56).count()-16;}
. Plus de golf est possible, mais c'est une nette amélioration du nombre d'octets, n'est-ce pas?println
->print
etfor(char c:s.toCharArray())if("01234567".contains(""+c))x++;
->for(String c:s.split(""))if("01234567".contains(c))x++;
PHP, 50 octets
imprime 1 pour vrai et -1 pour faux et 0 pour une cravate
PHP, 58 octets
imprime 1 pour vrai et -1 pour faux et 0 pour une cravate
la source
-0 === 0
echo 16<=>strlen(preg_filter("#[0-7]#","",hash(md2,$argn)));
devrait faire l'affaire sans octet supplémentaire.<?=preg_match_all("/[0-7]/",hash(md2,$argn))<=>16;
PHP, 56 octets
la source
Java
137130124123 123 octetsTestez-le en ligne!
Fondamentalement, pour chaque octet, il nous est demandé de vérifier ses 4e et 8e bits les moins significatifs. Je ne passe pas du tout par la représentation hexadécimale. Il semblait donc tout naturel de commencer à jouer avec des bits.
Les valeurs
<0
sont falsey, les valeurs>0
sont véridiques, la valeur0
n'est ni véridique ni falsey. La vérité et le falsey habituels ne peuvent pas être appliqués à Java cette fois (parce que ce ne peut pas êtretrue
oufalse
ou0
avec la règleif(<truthy>)
), j'ai donc pris la liberté de le déclarer comme tel.Sauvegarde
byte
parint
dans la déclaration de boucle for.la source
Pack Tcl + Trf , 79
Essayez-le en ligne . (Merci @Dennis d'avoir ajouté Tcl à TIO.)
la source