O desafio é simples
Escreva um script que, quando recebida uma entrada de string, faça o hash da string usando o algoritmo de hash MD2 e, em seguida, retorne um número inteiro positivo ou um resultado inteiro negativo com base no qual conjunto de caracteres abaixo é mais comum no hash resultante como uma string hexadecimal:
01234567 - (positive)
89abcdef - (negative)
- A entrada sempre será uma sequência, mas pode ter qualquer comprimento até 65535
- Toda a entrada, espaço em branco e tudo, deve ser hash
- Para os propósitos deste desafio, o número inteiro 0 não é considerado positivo nem negativo (consulte a saída do empate)
- O conjunto mais comum é aquele cujos caracteres são mais comuns na cadeia de hash hexadecimal de 32 caracteres
- Sua saída pode conter espaços em branco à direita de qualquer tipo, desde que os únicos caracteres que não sejam espaços em branco sejam uma saída válida ou falsa
- No caso de um empate, onde a cadeia hexadecimal contém exatamente 16 caracteres de cada conjunto, o programa deve emitir um 0
Exemplos 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
Critério vencedor
Isso é código-golfe , o menor número de bytes vence!
Respostas:
Oitava, 35 bytes
* Requer a versão mais recente do Octave (pelo menos 4.2).
Calcula que as contas históricas da cadeia de hash com seu centro de posições são 7 e 8 e depois calcula a diferença de contagens.
fonte
Mathematica, 43 bytes
Emite o número de dígitos em
01234567
menos o número de dígitos em89abcdef
.fonte
3E
está entre 8 e 9 e não entre 7 e 8.: |JavaScript (ES6), 731 bytes
Esse monstro está implementando o algoritmo MD2, por isso é embaraçosamente longo. Baseado em js-md2 por Chen Yi-Cyuan.
fonte
Python 2 + Crypto ,
1089993918778 bytesO Python não possui um built-in nativo para o MD2.
Economizou 12 bytes graças a @ovs.
Guardado 9 bytes graças a @FelipeNardiBatista.
fonte
lambda s:cmp(sum((int(x,16)<8)-.5for x in MD2.new(s).hexdigest()),0)
deve reduzir a contagem de bytes para 93sum(x<'8'for x ......
lambda s:sum(x<'8'for x in MD2.new(s).hexdigest())-16
para 78. A saída pode ser qualquer número, não apenas-1,0,1
Java 8, 173 bytes
-4 graças a dzaima
Graças a Oliver, esta é basicamente a resposta dele agora.
Positivo para a verdade. Negativo por falsidade. 0 para 0.
fonte
for
eif
String s="";for(byte b:bytes)h+=h.format("%02x",b);
. Além disso, você não precisa escrever um programa completo, mas um bastam lambda:a->{... return x;}
. Finalmente, o loop for pode ser substituído porint x=s.codePoints().filter(c->c>47&&c<56).count();
. Ao todo, eu recebo 173 para o seu 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;}
. É possível mais golfe, mas isso é uma melhoria líquida na contagem de bytes, não é?println
->print
efor(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 truthy e -1 para false e 0 para empate
PHP, 58 bytes
imprime 1 para truthy e -1 para false e 0 para empate
fonte
-0 === 0
echo 16<=>strlen(preg_filter("#[0-7]#","",hash(md2,$argn)));
deve executar o truque sem byte adicional.<?=preg_match_all("/[0-7]/",hash(md2,$argn))<=>16;
PHP, 56 bytes
fonte
Java
137130124123 bytesTeste online!
Basicamente, para cada byte, somos solicitados a verificar seus 4 e 8 bits menos significativos. Eu não passo pela representação hexadecimal. Por isso, parecia natural começar a brincar com bits.
Valores
<0
são falsey, valores>0
são verdadeiros, valor0
não é verdade ou falsey. A verdade e a falsa de sempre não podem ser aplicadas ao Java desta vez (porque não pode sertrue
oufalse
ou0
com a regraif(<truthy>)
), então tomei a liberdade de declarar como tal.Economizar
byte
porint
na declaração do loop for.fonte
Pacote Tcl + Trf , 79
Experimente online . (Obrigado @Dennis por adicionar o Tcl ao TIO.)
fonte