Wyzwanie jest proste
Napisz skrypt, który po wprowadzeniu ciągu znaków będzie haszował łańcuch przy użyciu algorytmu mieszającego MD2 , a następnie zwróci wynik liczb całkowitych dodatnich lub ujemnych na podstawie tego, który zestaw znaków poniżej jest bardziej powszechny w wynikowym haszu jako ciąg szesnastkowy:
01234567 - (positive)
89abcdef - (negative)
- Dane wejściowe zawsze będą ciągiem, ale mogą mieć dowolną długość do 65535
- Całe wejście, białe znaki i wszystko, musi zostać zaszyfrowane
- Do celów tego wyzwania liczba całkowita 0 nie jest uważana za ani dodatnią, ani ujemną (patrz wynik remisu)
- Bardziej powszechnym zestawem jest ten, którego znaki występują częściej w 32-znakowym szesnastkowym łańcuchu mieszającym
- Dane wyjściowe mogą zawierać dowolne białe znaki końcowe, o ile jedyne znaki niebiałe są prawidłowymi danymi wyjściowymi typu prawda lub falsey
- W przypadku remisu, w którym ciąg szesnastkowy zawiera dokładnie 16 znaków z każdego zestawu, program powinien wypisać wartość 0
Przykłady we / wy
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
Zwycięskie kryterium
To jest golf golfowy , wygrywa najmniej bajtów!
Odpowiedzi:
Oktawa, 35 bajtów
* Wymaga najnowszej wersji Octave (co najmniej 4.2).
Oblicza histcounts ciągu hash z jego środkiem przedziałów 7 i 8, a następnie oblicza różnicę zliczeń.
źródło
Mathematica, 43 bajty
Zwraca liczbę cyfr w
01234567
minus liczbę cyfr w89abcdef
.źródło
3E
wynosi od 8 do 9, a nie od 7 do 8.: |JavaScript (ES6), 731 bajtów
Ten potwór implementuje algorytm MD2, więc jest zawstydzająco długi. Na podstawie js-md2 autorstwa Chen Yi-Cyuan.
źródło
Python 2 + Crypto ,
1089993918778 bajtówPython nie ma wbudowanego wbudowanego MD2.
Zaoszczędź 12 bajtów dzięki @ovs.
Zaoszczędź 9 bajtów dzięki @FelipeNardiBatista.
źródło
lambda s:cmp(sum((int(x,16)<8)-.5for x in MD2.new(s).hexdigest()),0)
powinien zmniejszyć liczbę bajtów do 93sum(x<'8'for x ......
lambda s:sum(x<'8'for x in MD2.new(s).hexdigest())-16
dla 78. wyjściem może być dowolna liczba, nie tylko-1,0,1
Java 8, 173 bajtów
-4 dzięki dzaima
-128 dzięki Oliverowi, to właściwie jego odpowiedź.
Pozytywne dla prawdy. Negatywny dla falsy. 0 dla 0.
źródło
for
iif
String s="";for(byte b:bytes)h+=h.format("%02x",b);
. Ponadto, nie trzeba pisać pełny program, ale wystarczające, lambda:a->{... return x;}
. Wreszcie pętla for może zostać zastąpiona przezint x=s.codePoints().filter(c->c>47&&c<56).count();
. W sumie, mam 173 dla algorytmu, 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;}
. Możliwe jest więcej gry w golfa, ale to poprawa liczby bajtów netto, prawda?println
->print
ifor(char c:s.toCharArray())if("01234567".contains(""+c))x++;
->for(String c:s.split(""))if("01234567".contains(c))x++;
PHP, 50 bajtów
drukuje 1 dla prawdy i -1 dla fałszu i 0 dla remisu
PHP, 58 bajtów
drukuje 1 dla prawdy i -1 dla fałszu i 0 dla remisu
źródło
-0 === 0
echo 16<=>strlen(preg_filter("#[0-7]#","",hash(md2,$argn)));
powinien zrobić lewę bez dodatkowego bajtu.<?=preg_match_all("/[0-7]/",hash(md2,$argn))<=>16;
PHP, 56 bajtów
źródło
Java
137130124123 bajtyPrzetestuj online!
Zasadniczo, dla każdego bajtu, jesteśmy proszeni o sprawdzenie jego 4 i 8 najmniej znaczących bitów. W ogóle nie przechodzę przez reprezentację szesnastkową. Więc wydawało się naturalne, że gra się bitami.
Wartości
<0
są falsey, wartości>0
są prawdziwe, wartość0
nie jest ani prawdziwa, ani falsey. Zazwyczaj truthy i falsey nie mogą być stosowane do Java tym razem (ponieważ nie może byćtrue
lubfalse
lub0
z zasadąif(<truthy>)
), więc pozwoliłem sobie zadeklarować jako takie.Oszczędza
byte
przezint
w deklaracji pętli for.źródło
Pakiet Tcl + Trf , 79
Wypróbuj online . (Dzięki @Dennis za dodanie Tcl do TIO.)
źródło