El desafío es simple.
Escriba una secuencia de comandos que, cuando se le dé una entrada de cadena, haga un hash de la cadena utilizando el algoritmo de hash MD2 , y luego devuelva un entero positivo o una salida de entero negativo según el conjunto de caracteres que se muestra a continuación en el hash resultante como una cadena hexadecimal:
01234567 - (positive)
89abcdef - (negative)
- La entrada siempre será una cadena, pero puede tener cualquier longitud hasta 65535
- Toda la entrada, el espacio en blanco y todo, debe ser hash
- Para los propósitos de este desafío, el entero 0 no se considera positivo ni negativo (ver salida de empate)
- El conjunto más común es aquel cuyos caracteres son más comunes dentro de la cadena hash hexadecimal de 32 caracteres
- Su salida puede contener espacios en blanco finales de cualquier tipo, siempre que los únicos caracteres que no sean espacios en blanco sean una salida verdadera o falsey válida
- En caso de empate, donde la cadena hexadecimal contiene exactamente 16 caracteres de cada conjunto, el programa debería generar un 0
Ejemplos de 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
Criterio ganador
Este es el código de golf , ¡gana la menor cantidad de bytes!
Respuestas:
Octava, 35 bytes
* Requiere la última versión de Octave (al menos 4.2).
Calcula los conteos históricos de la cadena hash con su centro de ubicaciones son 7 y 8 y luego calcula la diferencia de conteos.
fuente
Mathematica, 43 bytes
Emite el número de dígitos en
01234567
menos el número de dígitos en89abcdef
.fuente
3E
esté entre 8 y 9 y no entre 7 y 8.: |JavaScript (ES6), 731 bytes
Este monstruo está implementando el algoritmo MD2, por lo que es vergonzosamente largo. Basado en js-md2 por Chen Yi-Cyuan.
fuente
Python 2 + Crypto ,
1089993918778 bytesPython no tiene un nativo incorporado para MD2.
Guardado 12 bytes gracias a @ovs.
Guardado 9 bytes gracias a @FelipeNardiBatista.
fuente
lambda s:cmp(sum((int(x,16)<8)-.5for x in MD2.new(s).hexdigest()),0)
debería reducir el recuento de bytes a 93sum(x<'8'for x ......
lambda s:sum(x<'8'for x in MD2.new(s).hexdigest())-16
para 78. la salida puede ser cualquier número, no solo-1,0,1
Java 8, 173 bytes
-4 gracias a dzaima
-128 gracias a Oliver, esta es básicamente su respuesta ahora.
Positivo para la verdad. Negativo para la falsedad. 0 por 0.
fuente
for
yif
String s="";for(byte b:bytes)h+=h.format("%02x",b);
. Además, no es necesario escribir un programa completo, pero basta una lambda:a->{... return x;}
. Finalmente, el bucle for puede ser reemplazado porint x=s.codePoints().filter(c->c>47&&c<56).count();
. Con todo, me sale 173 para su algoritmo, 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;}
. Es posible jugar más al golf, pero esta es una mejora neta en el conteo de bytes, ¿no es así?println
->print
yfor(char c:s.toCharArray())if("01234567".contains(""+c))x++;
->for(String c:s.split(""))if("01234567".contains(c))x++;
PHP, 50 bytes
imprime 1 para verdad y -1 para falso y 0 para un empate
PHP, 58 bytes
imprime 1 para verdad y -1 para falso y 0 para un empate
fuente
-0 === 0
echo 16<=>strlen(preg_filter("#[0-7]#","",hash(md2,$argn)));
debería hacer el truco sin byte adicional.<?=preg_match_all("/[0-7]/",hash(md2,$argn))<=>16;
PHP, 56 bytes
fuente
Java
137130124123 bytes¡Pruébalo en línea!
Básicamente, para cada byte, se nos pide que verifiquemos sus bits 4 y 8 menos significativos. No paso por la representación hexadecimal en absoluto. Entonces parecía natural comenzar a jugar con bits.
Los valores
<0
son falsey, los valores>0
son verdaderos, el valor0
no es ni verdadero ni falsey. El Truthy y Falsey- habitual no se pueden aplicar a Java este tiempo (ya que no puede sertrue
nifalse
o0
con la reglaif(<truthy>)
), así que me tomé la libertad de declarar como tal.Ahorra
byte
porint
en la declaración de bucle for.fuente
Paquete Tcl + Trf , 79
Pruébalo en línea . (Gracias @Dennis por agregar Tcl a TIO).
fuente